curl_exec 最大执行时间 - 是啥原因造成的?

Posted

技术标签:

【中文标题】curl_exec 最大执行时间 - 是啥原因造成的?【英文标题】:curl_exec maximum execution time - what is causing it?curl_exec 最大执行时间 - 是什么原因造成的? 【发布时间】:2012-01-12 12:37:29 【问题描述】:

我收到了可怕的消息:

Fatal error: Maximum execution time of 90 seconds exceeded in /home/pricing.php on line 239

代码是:

$url = "http://*******.com/feed?f=PR&categories=$cat_id&limit=100&startproducts=$ii&price_min=0.01&sortproducts=score&show=properties";

$c = curl_init($url); 
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_HEADER, 0);
curl_setopt($c, CURLOPT_USERPWD, "****:****");
$xml = simplexml_load_string(curl_exec($c)); // line 239

simplexml_load_string 是第 239 行,这当然意味着已经获取了提要(因为需要更好的词!)并且正在加载字符串,但肯定不会超过 90 秒?

我的问题是:

1 - 什么可能/会导致这种情况?

2 - 将php_value max_execution_time 增加到 90 秒以上是否安全?什么被认为是安全的最大值?

3 - 有没有比使用 curl 更好/更快/更稳定的方式来降低提要?

感谢大家的帮助!

【问题讨论】:

不,这并不意味着流“已获得”。如果网站“慢”,时间很可能花在curl_exec。如果你想确定的话,把它分成两行。 啊,好吧——如果我把它分解成这样:$feed = curl_exec($c); $xml = simplexml_load_string($feed);是这个意思吗? 是的,那么您就会知道这两个呼叫中的哪一个正在停止。 用“retrived”来形容“got”的更好用 【参考方案1】:

A1: 是的,您从第二个问题中得到了答案。这是由php的max_execution_time引起的。

A2: 这是不安全的,除非你在本地托管它并且你知道你的脚本在做什么。我认为常见的做法是 30 秒或最长 300 秒(5 分钟)。

A3 如果您正在处理 curl,我希望您在 php 脚本的最顶部设置 set_time_limit(0)(代码级别相当于 php.ini 中的 max_execution_time),并使用 curl 的超时来处理超时。

curl_setopt($curl, CURLOPT_TIMEOUT_MS, 2000); //in miliseconds

【讨论】:

RE A3 - 这是否意味着如果我设置 CURLOPT_TIMEOUT_MS 脚本不会失败 - 如果是这样,这是一个更好的选择 如果你指的是 fail 如 php 执行超时,那么答案是肯定的,只要 set_time_limit 非常高或 0(无限)就不会失败.我不记得它到达CURLOPT_TIMEOUT_MS 时的确切细节,但可以肯定的是curl_exec($c) 将返回空字符串。因此,在解析到 simplexml_load_string 之前,只需做一个简单的检查。【参考方案2】:

    卷曲到外部进纸非常慢

    可以将 max_execution_time 增加到更高的值,但不建议这样做。如果脚本要用作您的普通网页之一,您必须三思而后行。没有用户愿意等待超过 90 秒来加载页面。

    缓存它!

详细缓存吧! :-

不是超级逻辑, 这意味着您可以准备提要 URL 列表, 然后执行后台作业 (cronjob) 以获取每个提要 URL 并存储到本地存储中。 本地 XML 可用后,从本地加载

因此,与按需访问相反,请在任何用户访问页面之前准备好 XML。 困难在于要抓取很多不同的提要 URL,有一个 curl_multi_exec 应该是同时抓取多个 URL 的理想选择。

【讨论】:

以上是关于curl_exec 最大执行时间 - 是啥原因造成的?的主要内容,如果未能解决你的问题,请参考以下文章

PHP - curl_exec 需要 100 毫秒

我出现内存不足错误,如何解决?Permgen 空间区域是啥意思?是啥原因造成的? [复制]

Python 多处理模块意外输出。可能是啥原因造成的?

100% cpu 使用配置文件输出,根据我们的配置文件日志,这可能是啥原因造成的?

PHP中的curl_exec

Qt5.2.1,.2.0 OSX Mavericks 上的渲染问题 - 是啥原因造成的,如何解决?