php single curl работает, но multi curl не работает? - PullRequest
5 голосов
/ 23 марта 2012

Поэтому я использовал ampps, а затем переключился на z-wamp, думая, что это решит проблему, но это не помогло.

У меня есть отдельные "сайты" на моем локальном хосте (localhost / site1 & localhost /site2) что я пытаюсь отправить несколько запросов curl, но по какой-то странной причине он ничего не делает!Это работает только тогда, когда я делаю один скручивание на один сайт.Это работает:

$ch = curl_init('http://localhost/site1/');
curl_setopt_array($ch, array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => false,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => array('data' => $data)
));
$res = curl_exec($ch);
//yay!

С другой стороны, это не работает:

...
//add a bunch of curl sessions
//to $this->sessions
...
$window = 15;
if (count($this->sessions) < $window)
    $window = count($this->sessions);

$mh = curl_multi_init();

$site_map = array();

for ($i = 0; $i < $window; ++$i) {
    curl_multi_add_handle($mh, $this->sessions[$i]);
    $site_map[(string) $this->sessions[$i]] = $i;
}

$data_results = array();
$running = null;

do {
    $execrun = curl_multi_exec($mh, $running);
} while ($execrun === CURLM_CALL_MULTI_PERFORM);

while ($running && $execrun === CURLM_OK) {

    //the loop just keeps going forever from here

    if (curl_multi_select($mh) !== -1) {
        do {
            $execrun = curl_multi_exec($mh, $running);
        } while ($execrun === CURLM_CALL_MULTI_PERFORM);
    }

    if ($execrun !== CURLM_OK)
        break;

    //to here and never enters the loop below

    while ($done = curl_multi_info_read($mh)) {

        $output = curl_multi_getcontent($done['handle']);

        if ($output)
            $data_results[$site_map[(string) $done['handle']]] = $output;
        else
            $data_results[$site_map[(string) $done['handle']]] = null;

        if (isset($this->sessions[$i]) && $i < count($this->sessions)) {
            curl_multi_add_handle($mh, $this->sessions[$i]);
            $site_map[(string) $this->sessions[$i]] = $i;
            ++$i;
        }

        unset($site_map[(string) $done['handle']]);
        curl_multi_remove_handle($mh, $done['handle']);
        curl_close($done['handle']);
    }
}
curl_multi_close($mh);
return $data_results;

Так что в приведенном выше коде multi curl он начинает идти, добавляет дескрипторы к $и, как только он выполнится, он продолжит цикл и никогда не войдет в цикл $ done = curl_multi_info_read ($ mh).Между тем, он все еще работает нормально, а $ running равно 2 за все время.Кроме того, curl_multi_info_read вернет false.Так что это просто продолжает цикл навсегда.

Мое расширение curl включено (очевидно, если одиночный curl работает), и вот подробности этого из PHP Info:

cURL support    enabled
cURL Information    7.24.0
Age 3
Features
AsynchDNS   Yes
Debug   No
GSS-Negotiate   No
IDN No
IPv6    Yes
Largefile   Yes
NTLM    Yes
SPNEGO  No
SSL Yes
SSPI    No
krb4    No
libz    Yes
CharConv    No
Protocols   dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, pop3, pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp
Host    i386-pc-win32
SSL Version OpenSSL/1.0.0g
ZLib Version    1.2.5
libSSH Version  libssh2/1.3.0

Что в мирепроисходит с этой штукой?Может ли это быть что-то с моим конфигом PHP?Конфиг апача?Еще раз, я использую z-wamp.

PHP версия 5.3.10 Apache версия 2.4.1 Win 7 64-bit Добавлен каталог PHP в PATH

Редактировать Оказывается, это должна быть какая-то проблема типа конфигурации Apache / PHP, которую я вообще не могу обнаружить, потому что я покончил с z-wamp и установил wampserver, и на этот раз это сработало.

Ответы [ 2 ]

4 голосов
/ 31 марта 2012

Я только что ответил на другой вопрос, который я нашел о множественных вызовах curl.

Это все, что я сделал для запуска запросов.

do {
    $status = curl_multi_exec($mh, $running);
} while ($status === CURLM_CALL_MULTI_PERFORM || $running);

Затем я получил нужную мне информацию в циклеповерх моего массива обработчиков curl.

$returned = array();
foreach ($requests as $identifier => $request) {
    $returned[$identifier] = curl_multi_getcontent($request);
    curl_multi_remove_handle($mh, $request);
    curl_close($request);
}

Вышеупомянутый подход работал для меня, однако кажется, что вы хотите добавить только определенное количество сессий в multi-handler curl.Возможно, мы могли бы изменить вышеприведенный цикл do-while на следующее:

do {
    $status = curl_multi_exec($mh, $running);
    if ($running < $window) {
        for ($x = 0; $x < $window - $running; $x++) {
            $index = count($site_map) + $x -1;
            curl_multi_add_handle($mh, $this->sessions[$index]);
            $site_map[(string) $this->sessions[$index]] = $index;
        }
    }
} while ($status === CURLM_CALL_MULTI_PERFORM || $running);

После этого мы могли бы изменить выборку данных и заменить весь ваш раздел while ($running && $execrun === CURLM_OK){} следующим, поскольку он будет запускаться только один раз для всех вашихвызовы curl обработаны:

$returned = array();
foreach ($this->sessions as $identifier => $request) {
    $returned[$identifier] = curl_multi_getcontent($request);
    curl_multi_remove_handle($mh, $request);
    curl_close($request);
}
0 голосов
/ 13 февраля 2014

Я пытался запустить оба singe curl_exec() и curl_multi_exec() на одной странице и также не получил ответа, пока не сделал: unset($ch); после одного запроса.

...