13

目前我正在使用 file_get_contents() 将 GET 数据提交到站点数组,但是在执行页面时出现此错误:

致命错误:超过 30 秒的最大执行时间

我真正想要脚本做的就是开始加载网页,然后离开。每个网页最多可能需要 5 分钟才能完全加载,我不需要它来完全加载。

这是我目前拥有的:

        foreach($sites as $s) //Create one line to read from a wide array
        {
                file_get_contents($s['url']); // Send to the shells
        }

编辑:为了消除任何混乱,这个脚本被用来在其他服务器上启动脚本,不返回任何数据。

编辑:我现在正在尝试使用 cURL 来解决问题,方法是设置一秒的超时时间以使其发送数据然后停止。这是我的代码:

        $ch = curl_init($s['url']); //load the urls
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); //Only send the data, don't wait.
        curl_exec($ch); //Execute
        curl_close($ch); //Close it off.

也许我把选项设置错了。我们说话的时候,我正在浏览一些手册。只是给你一个更新。谢谢你们到目前为止一直在帮助我。

编辑:啊,发现了问题。我使用的是 CURLOPT_CONNECTTIMEOUT 而不是 CURLOPT_TIMEOUT。哎呀。

但是现在,脚本没有触发。他们每个人都使用 ignore_user_abort(TRUE); 所以我无法理解这个问题

哈,刮一下。现在工作。非常感谢大家

4

6 回答 6

6

有很多方法可以解决这个问题。

您可以使用cURL及其 curl_multi_* 函数来异步执行请求。或者使用 cURL 常用的方式但是使用 1 作为超时限制,所以它会请求并返回超时,但请求会被执行。

如果您没有安装 cURL,您可以继续使用 file_get_contents,但使用ZendX_Console_Process_Unix之类的东西来分叉进程(不是很酷,但可以工作),这样您就可以避免每个请求之间的等待。

于 2010-04-18T18:02:55.370 回答
2

重新更新您只需要触发操作:

您可以尝试使用file_get_contents超时。这将导致远程脚本被调用,但连接在 n 秒后终止(例如 1)。

如果远程脚本被配置为即使连接被中止(在 PHP 中是这样ignore_user_abort)它也会继续运行,它应该可以工作。

试试看。如果它不起作用,您将无法增加time_limit或使用外部可执行文件。但从你所说的 - 你只需要提出请求 - 这应该可行。您甚至可以尝试将超时设置为,0但我不相信。

这里

<?php
$ctx = stream_context_create(array(
    'http' => array(
        'timeout' => 1
        )
    )
);
file_get_contents("http://example.com/", 0, $ctx);
?>

平心而论,克里斯的回答已经包含了这种可能性:curl也有超时开关。

于 2010-04-18T16:20:13.013 回答
2

正如佛朗哥提到的,我不确定是否被采纳,你特别想使用 curl_multi 函数,而不是常规的 curl 函数。这会将多个 curl 对象打包到一个 curl_multi 对象中并同时执行它们,在它们到达时返回(或在您的情况下不返回)响应。

http://php.net/curl_multi_init的示例

于 2011-03-20T12:56:20.437 回答
1

消耗那么多时间的不是 file_get_contents() 而是网络连接本身。
考虑不要向一组站点提交 GET 数据,而是创建一个 rss 并让他们获取 RSS 数据。

于 2010-04-18T16:23:47.047 回答
1

我不完全理解您的脚本背后的含义。但这是你可以做的:

  1. 为了快速避免致命错误,您只需在文件开头添加 set_time_limit(120) 即可。这将允许脚本运行 2 分钟。当然,你可以使用任何你想要的数字,0 代表无限。
  2. 如果您只需要调用 url 而您不“关心”结果,则应在异步模式下使用 cUrl。这种情况下,对 URL 的任何调用都不会等到它完成。你可以很快地给他们打电话。

BR。

于 2010-04-18T19:13:18.057 回答
1

如果加载远程页面最多需要 5 分钟,您的 file_get_contents 将等待 5 分钟。有什么方法可以修改远程脚本以分叉到后台进程并在那里进行繁重的处理?这样一来,您的初始命中几乎会立即返回,而不必等待启动期。

另一种可能性是调查 HEAD 请求是否可以解决问题。HEAD 不返回任何数据,仅返回标头,因此触发远程作业而不等待完整输出可能就足够了。

于 2010-04-18T20:19:42.193 回答