简体   繁体   English

PHP - 卷曲多请求超时

[英]PHP - Curl MultiRequest Timeout

I'm using this following multiRequest function and sometimes the problem occurs, that the loop at我正在使用以下 multiRequest 函数,有时会出现问题,即循环在

do {
curl_multi_exec($mh, $running);
} while ($running > 0);

seems endless and reach my php execution limit.似乎无穷无尽并达到我的 php 执行限制。 I thought it had sth to do with the DNS Lookup, so I'm calling the ip addresses directly now.我认为它与DNS查找有关,所以我现在直接调用IP地址。

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;
    }
  1. You can set an individual timeout on a handle with CURLOPT_TIMEOUT (and other options).您可以使用 CURLOPT_TIMEOUT(和其他选项)在句柄上设置单独的超时。

  2. 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.您可以拥有自己的超时时间,并在您认为足够的任何给定时间从多句柄中删除句柄(从而取消操作)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM