PHP - Curl 多请求超时
我正在使用以下 multiRequest 函数,有时会出现问题,循环
do { curl_multi_exec($mh, $running); } while ($running > 0);
似乎无穷无尽并达到我的 php 执行限制。 我认为这与 DNS 查找有关,所以我现在直接调用 ip 地址。
但遗憾的是这个问题有时仍然会发生......有没有办法为每个句柄设置超时以避免无限循环?我还能做什么来解决这个问题?
非常感谢!
function multiRequest($data, $options = array()) { // array of curl handles $curly = array(); // data to be returned $result = array(); // multi handle $mh = curl_multi_init(); // loop through $data and create curl handles // then add them to the multi-handle foreach ($data as $id => $d) { $curly[$id] = curl_init(); $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d; curl_setopt($curly[$id], CURLOPT_URL, $url); curl_setopt($curly[$id], CURLOPT_HEADER, 0); curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1); // post? if (is_array($d)) { if (!empty($d['post'])) { curl_setopt($curly[$id], CURLOPT_POST, 1); curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']); } } // extra options? if (!empty($options[$id])) { curl_setopt_array($curly[$id], $options[$id]); } curl_multi_add_handle($mh, $curly[$id]); } // execute the handles $running = null; do { curl_multi_exec($mh, $running); } while ($running > 0); // get content and remove handles foreach($curly as $id => $c) { $result[$id] = curl_multi_getcontent($c); curl_multi_remove_handle($mh, $c); } // all done curl_multi_close($mh); return $result; }
I'm using this following multiRequest function and sometimes the problem occurs, that the loop at
do { curl_multi_exec($mh, $running); } while ($running > 0);
seems endless and reach my php execution limit.
I thought it had sth to do with the DNS Lookup, so I'm calling the ip addresses directly now.
But this problem sadly still occurs sometimes... Is there a way to set a timeout for each handle to avoid an endless loop? What else I could do to fix this problem?
Thank you very much!
function multiRequest($data, $options = array()) { // array of curl handles $curly = array(); // data to be returned $result = array(); // multi handle $mh = curl_multi_init(); // loop through $data and create curl handles // then add them to the multi-handle foreach ($data as $id => $d) { $curly[$id] = curl_init(); $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d; curl_setopt($curly[$id], CURLOPT_URL, $url); curl_setopt($curly[$id], CURLOPT_HEADER, 0); curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1); // post? if (is_array($d)) { if (!empty($d['post'])) { curl_setopt($curly[$id], CURLOPT_POST, 1); curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']); } } // extra options? if (!empty($options[$id])) { curl_setopt_array($curly[$id], $options[$id]); } curl_multi_add_handle($mh, $curly[$id]); } // execute the handles $running = null; do { curl_multi_exec($mh, $running); } while ($running > 0); // get content and remove handles foreach($curly as $id => $c) { $result[$id] = curl_multi_getcontent($c); curl_multi_remove_handle($mh, $c); } // all done curl_multi_close($mh); return $result; }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以使用 CURLOPT_TIMEOUT(和其他选项)在句柄上设置单独的超时。
您可以拥有自己的超时,并在您认为足够的任何给定时间从多句柄中删除句柄(从而取消操作)。
You can set an individual timeout on a handle with CURLOPT_TIMEOUT (and other options).
You can have your own timeout and just remove the handle from the multi handle (which thus cancels the operation) at any given time you think enough is enough.