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 最大执行时间 - 是啥原因造成的?的主要内容,如果未能解决你的问题,请参考以下文章
我出现内存不足错误,如何解决?Permgen 空间区域是啥意思?是啥原因造成的? [复制]