【问题标题】:curl_exec PHP fatal error after random amount of time随机时间后 curl_exec PHP 致命错误
【发布时间】:2015-03-19 10:18:53
【问题描述】:

我有一张桌子,里面有大约 20000 个未处理的 Youtube 帖子。 这个表是使用一个可以正常工作的 cronjob 自动填充的。 现在我有一个代码,它应该只有在处理完所有帖子后才会退出。

为此,我必须使用 curl 从 youtube 获取更多信息。 我的代码运行良好,但是在随机的时间/帖子之后,我收到了一个致命错误:

PHP 致命错误:超过 30 秒的最大执行时间 /home/local/domains/domain.com/private/include/classes/Youtube.php 上 第 183 行

这是代码:

public function api_get($url, $params)
    {
        error_log(__FILE__."::".__LINE__." - ".date("U"), 0);
        //set the youtube key
        $params["key"] = $this->youtube_key;

        //boilerplates for CURL
        $tuCurl = curl_init();
        error_log(__FILE__."::".__LINE__." - ".date("U"), 0);
        curl_setopt_array($tuCurl, array(
            CURLOPT_URL => $url . (strpos($url, "?") === false ? "?" : "") . http_build_query($params),
            CURLOPT_PORT => strpos($url, "https") === false ? 80 : 443,
            CURLOPT_CONNECTTIMEOUT => 30,
            CURLOPT_FRESH_CONNECT => true,
            CURLOPT_FORBID_REUSE => true,
            CURLOPT_TIMEOUT => 60,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_MAXREDIRS => 5,
            CURLOPT_NOPROGRESS => false // only for debugging purposes
        ));
        error_log(__FILE__."::".__LINE__." - ".date("U"), 0);
        $tuData = curl_exec($tuCurl);
        error_log(__FILE__."::".__LINE__." - ".date("U"), 0);
        if (curl_errno($tuCurl)) {
            $curlError = curl_error($tuCurl);
            error_log(__FILE__."::".__LINE__." - ".date("U"), 0);
            curl_close($tuCurl);
            error_log(__FILE__."::".__LINE__." - ".date("U"), 0);
            throw new Elision("[#505011] "._("Curl Error:")." ". $curlError);
        }
        error_log(__FILE__."::".__LINE__." - ".date("U"), 0);
        curl_close($tuCurl);
        error_log(__FILE__."::".__LINE__." - ".date("U"), 0);
        return $tuData;
    }

我使用error_log 找出问题出在哪里,当我使用 SSH 运行此代码时,我得到了这个(我只显示最后几行):

/home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::35 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::37 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::45 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::47 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::49 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::51 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::56 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::18 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::20 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::22 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::24 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::26 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::28 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::31 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::33 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::163 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::169 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::182 - 1426757941 % 总计 % 接收 % Xferd 平均速度 时间 时间 时间 当前 下载上传总花费剩余速度 102 1131 102 1131 0 0 4238 0 --:--:-- --:--:-- --:--:-- 15080 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::184 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::192 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::194 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::35 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::37 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::45 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::47 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::49 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::51 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::56 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::18 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::20 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::22 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::24 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::26 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::28 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::31 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::33 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::163 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::169 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::182 - 1426757941 PHP 致命错误:在 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php 中超过了 30 秒的最大执行时间 在第 183 行

如您所见,相同的代码运行良好,但下一次它不会运行并产生致命错误。 当我重新运行脚本时,它也会随机运行一段时间,然后再次崩溃,因此它不能是输入 url。

任何想法如何解决这个问题,我没有得到致命错误?

编辑: 我忘了补充: 函数 api_get 在类Youtube.php 中。 我从名为youtube_parsing.php 的文件中运行此代码。 在youtube_parsing.php 我有这个来避免执行限制:

set_time_limit(0);
ini_set("max_execution_time", 0);

【问题讨论】:

  • 可能是网络延迟问题。您是否尝试在 curl 代码中增加此设置? CURLOPT_CONNECTTIMEOUT => 30你也可以尝试使用set_time_limit()增加PHP执行时间限制@
  • 我已经尝试了各种值,但我并不真正关心 curl 是否失败,我只想编写代码继续,而不是得到一个致命的错误来停止一切。
  • Youtube.php 的第 183 行是什么?看起来它在某个地方有一个 PHP 最大时间限制,它在达到 curl 限制之前就已经达到了。但奇怪的是,您无论如何都避免了执行限制。
  • 如果您在 youtube_parsing 中执行 foreach,请尝试将 set_time_limit(0) 放在循环顶部,以便每次都重置时间限制。
  • @gazareth,第 183 行只不过是 curl_exec。我将set_time_limit 放在foreach 循环中。我认为这不是一个很好的方法,将它放在上面会更好,但它似乎可以解决问题。

标签: php curl libcurl fatal-error


【解决方案1】:

您必须在 php.ini 中增加最大可能的 execution time

【讨论】:

  • 对不起,我忘了把它添加到我的帖子中,我现在已经添加了。
  • set_time_limit(0) 在 php 在安全模式下运行时不起作用。
猜你喜欢
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多