file_get_contents()的更快替代品

时间:2010-04-18 16:17:20

标签: php curl file-get-contents curl-multi

目前我正在使用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);所以我无法理解这个问题

哈,划伤那个。现在工作。非常感谢大家

6 个答案:

答案 0 :(得分:6)

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

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

如果你没有安装cURL,你可以继续使用file_get_contents但是使用类似ZendX_Console_Process_Unix之类的分叉进程(不是那么酷,但有效),这样你就可以避免每次请求之间的等待。

答案 1 :(得分:2)

重新启动您只需触发操作的更新:

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

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

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

来自here

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

公平地说,Chris的答案已经包含了这种可能性:curl也有一个超时开关。

答案 2 :(得分:2)

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

http://php.net/curl_multi_init

的示例

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

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