2014-02-04 1 views
0

PHP-скрипт предназначен для загрузки файлов с FTP-серверов. Но когда я закрываю многопроцессор, терминал php cli показывает мне «Ошибка шины» и завершает процесс.Ошибка шины при вызове curl_multi_close()

Какие строки могут вызывать эту ошибку? Как это исправить?

function download ($host, array $files, $threadsCount = 5) { 
    $filesCount = count($fileNames); 
    $threadsCount = $filesCount < $threadsCount ? $filesCount : $threadsCount; 

    $mh = curl_multi_init(); 
    $fh = []; 

    // Default options for all threads 
    $options = [ 
     CURLOPT_RETURNTRANSFER => 1, 
     CURLOPT_FOLLOWLOCATION => 1, 
     CURLOPT_MAXREDIRS  => 5, 
     CURLOPT_HEADER   => 0, 
     CURLOPT_BINARYTRANSFER => 1, 
     CURLOPT_TIMEOUT  => 200, 
     CURLOPT_CONNECTTIMEOUT => 200, 
    ]; 

    // Init first threads 
    for ($i = 0; $i < $threadsCount; $i++) { 
     $src = $fileNames[$i]; 

     // Path to file on server 
     $url = $host . '/' . $src; 

     // Where to store this file 
     $tmp = '/tmp/' . $src; 

     $ch = curl_init(); 
     $fh[$url] = fopen($tmp, 'wb'); 

     $files[$src] = $tmp; 

     curl_setopt_array($ch, $options + [ 
      CURLOPT_URL => $url, 
      CURLOPT_FILE => $fh[$url] 
     ]); 

     curl_multi_add_handle($mh, $ch); 
    } 

    // Process threads 
    do { 
     while (($state = curl_multi_exec($mh, $running)) == CURLM_CALL_MULTI_PERFORM); 

     if ($state != CURLM_OK) { 
      break; 
     } 

     // Request is completed 
     while ($done = curl_multi_info_read($mh)) { 
      // Start a new request before killing old 
      if ($i < $filesCount) { 
       $src = $fileNames[$i]; 

       $url = $host . '/' . $src; 
       $tmp = '/tmp/' . $src; 

       $ch = curl_init(); 
       $fh[$url] = fopen($tmp, 'wb'); 

       curl_setopt_array($ch, $options + [ 
        CURLOPT_URL => $url, 
        CURLOPT_FILE => $fh[$url] 
       ]); 

       curl_multi_add_handle($mh, $ch); 
       $i++; 
      } 

      // Close handlers for files and cURL 
      fclose($fh[ curl_getinfo($done['handle'], CURLINFO_EFFECTIVE_URL) ]); 

      curl_multi_remove_handle($mh, $done['handle']); 
      curl_close($done['handle']); 
     } 

     if ($running) { 
      curl_multi_select($mh, 10); 
     } 

    } while ($running); 

    // AFTER THIS "BUS ERROR" IS FIRING! 
    curl_multi_close($mh); 
} 

Для некоторых серверов эта ошибка не отображается.

ответ

0

Это звучит как ошибка в библиотеке libcurl или в привязке PHP/CURL. Если вы не используете последние версии, у вас есть причина для обновления.

Если вы используете последние версии, у вас есть причина, по которой эта проблема напрямую связана с проектами.

+0

Я преодолел эту проблему с перемещением действий с близкими переносчиками из всех циклов. Кажется, это работает для меня. – mikatakana