PHP - Curl MultiRequest Тайм-аут - PullRequest
1 голос
/ 16 июня 2011

Я использую следующую функцию multiRequest, и иногда возникает проблема, что цикл в

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

кажется бесконечным и достигает моего предела выполнения php.Я думал, что это было связано с DNS Lookup, поэтому я вызываю 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;
    }

1 Ответ

1 голос
/ 17 июня 2011
  1. Вы можете установить индивидуальное время ожидания для дескриптора с помощью CURLOPT_TIMEOUT (и других опций), хотя для этого требуется, чтобы у вас был достаточно недавний libcurl для его правильной работы.

  2. Вы можете установить собственный тайм-аут и просто удалить ручку из мульти-ручки (что отменяет операцию) в любой момент, когда вы считаете, что этого достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...