2013-11-15 6 views
2

Я пытаюсь запустить этот простой кусок кода из php.net под моим Mac OS X (Mavericks), чтобы попытаться Curl мульти функцию EXEC:curl_multi_exec не будет работать на Mac OS X

<?php 
    // create both cURL resources 
    $ch1 = curl_init(); 
    $ch2 = curl_init(); 

    // set URL and other appropriate options 
    curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); 
    curl_setopt($ch1, CURLOPT_HEADER, 0); 
    curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); 
    curl_setopt($ch2, CURLOPT_HEADER, 0); 

    //create the multiple cURL handle 
    $mh = curl_multi_init(); 

    //add the two handles 
    curl_multi_add_handle($mh,$ch1); 
    curl_multi_add_handle($mh,$ch2); 

    $active = null; 
    //execute the handles 
    do { 
     $mrc = curl_multi_exec($mh, $active); 
    } while ($mrc == CURLM_CALL_MULTI_PERFORM); 

    while ($active && $mrc == CURLM_OK) { 
     if (curl_multi_select($mh) != -1) { 
      do { 
       $mrc = curl_multi_exec($mh, $active); 
      } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
     } 
    } 

    //close the handles 
    curl_multi_remove_handle($mh, $ch1); 
    curl_multi_remove_handle($mh, $ch2); 
    curl_multi_close($mh); 

    ?> 

Это не работает, как выход только я получил это:

PHP Fatal error: Maximum execution time of 30 seconds exceeded in

Это моя среда: Mac OS X 10.9, PHP 5.4.17, Apache 2.2.24.

cUrl установлен как я, мои обычные завитки «одиночные» запросы работают отлично.

Я думаю, что это проблема с Mac OS, но я не могу найти никаких исправлений. Есть ли у вас какие-либо идеи?

EDIT: Я попробовал тот же код на сервере Linux, и все сработало нормально.

+0

Попробуйте изменить временные ограничения с помощью set_time_limit (0); // не подходит для производственного сайта, только для целей тестирования. –

+0

Он просто работает и работает, но ничего не происходит ... –

ответ

2

На php 5.3.18+ помните, что curl_multi_select() может возвращать -1 навсегда, пока вы не вызовете curl_multi_exec().

Попробуйте это:

while ($this->active && $mrc == CURLM_OK) 
{ 
    // add this line 
    while (curl_multi_exec($this->mh, $this->active) === CURLM_CALL_MULTI_PERFORM); 

    if (curl_multi_select($this->mh) != -1) 
    { 
     do { 
      $mrc = curl_multi_exec($this->mh, $this->active); 
      if ($mrc == CURLM_OK) 
      { 
       while($info = curl_multi_info_read($this->mh)) 
       { 
        $this->process($info); 
       }   
      } 
     } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
    } 
} 

См https://bugs.php.net/bug.php?id=63411 или http://marchtea.com/?p=109 для получения дополнительной информации.

+0

Строка «while (curl_multi_exec ($ this-> mh, $ this-> active) === CURLM_CALL_MULTI_PERFORM); определенно сделал трюк, спасибо большое. Может быть, вы должны добавить его в официальный пример документации (http://php.net/manual/fr/function.curl-multi-exec.php)? –

Смежные вопросы