Intereting Posts

php single curl работает, но многократный завиток не работает?

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

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

$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; 

Таким образом, в коде с несколькими завивками выше он начинается, добавляет дескрипторы в $ mh, и как только он выполняется, он будет продолжать цикл и никогда не войдет в цикл $ done = curl_multi_info_read ($ mh) while. Тем временем он все еще работает нормально, а также $ 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? Конфигурация Apache? Еще раз, я использую z-wamp.

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

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

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

Это все, что я сделал для выполнения запросов.

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

Затем я получил нужную информацию, перейдя через мой массив обработчиков завитушек.

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

Приведенный выше подход работал для меня, однако кажется, что вы хотите добавить только определенное количество сеансов для многопроцессора 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){} следующим образом, поскольку оно будет работать только после того, как все ваши завитки будут обработаны:

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

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