2015-03-19 1 views
0

У меня есть стол около 20000 с необработанными сообщениями Youtube. Эта таблица автоматически заполняется с помощью cronjob, который работает нормально. Теперь у меня есть код, который должен только выйти, когда все сообщения были обработаны.curl_exec PHP фатальная ошибка после случайного количества времени

Для этого я должен получить дополнительную информацию с youtube с помощью curl. код у меня работает нормально, но после случайного количества времени/сообщений, я получаю фатальную ошибку:

PHP Fatal error: Maximum execution time of 30 seconds exceeded in /home/local/domains/domain.com/private/include/classes/Youtube.php on line 183

Это код:

public function api_get($url, $params) 
    { 
     error_log(__FILE__."::".__LINE__." - ".date("U"), 0); 
     //set the youtube key 
     $params["key"] = $this->youtube_key; 

     //boilerplates for CURL 
     $tuCurl = curl_init(); 
     error_log(__FILE__."::".__LINE__." - ".date("U"), 0); 
     curl_setopt_array($tuCurl, array(
      CURLOPT_URL => $url . (strpos($url, "?") === false ? "?" : "") . http_build_query($params), 
      CURLOPT_PORT => strpos($url, "https") === false ? 80 : 443, 
      CURLOPT_CONNECTTIMEOUT => 30, 
      CURLOPT_FRESH_CONNECT => true, 
      CURLOPT_FORBID_REUSE => true, 
      CURLOPT_TIMEOUT => 60, 
      CURLOPT_RETURNTRANSFER => true, 
      CURLOPT_FOLLOWLOCATION => true, 
      CURLOPT_MAXREDIRS => 5, 
      CURLOPT_NOPROGRESS => false // only for debugging purposes 
     )); 
     error_log(__FILE__."::".__LINE__." - ".date("U"), 0); 
     $tuData = curl_exec($tuCurl); 
     error_log(__FILE__."::".__LINE__." - ".date("U"), 0); 
     if (curl_errno($tuCurl)) { 
      $curlError = curl_error($tuCurl); 
      error_log(__FILE__."::".__LINE__." - ".date("U"), 0); 
      curl_close($tuCurl); 
      error_log(__FILE__."::".__LINE__." - ".date("U"), 0); 
      throw new Elision("[#505011] "._("Curl Error:")." ". $curlError); 
     } 
     error_log(__FILE__."::".__LINE__." - ".date("U"), 0); 
     curl_close($tuCurl); 
     error_log(__FILE__."::".__LINE__." - ".date("U"), 0); 
     return $tuData; 
    } 

Я использовал error_log, чтобы выяснить, где моя проблема была, когда я запускаю этот код с помощью SSH, я получаю это (я только отобразить последние несколько строк):

/home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::35 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::37 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::45 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::47 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::49 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::51 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::56 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::18 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::20 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::22 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::24 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::26 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::28 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::31 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::33 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::163 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::169 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::182 - 1426757941 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 102 1131 102 1131 0 0 4238 0 --:--:-- --:--:-- --:--:-- 15080 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::184 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::192 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::194 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::35 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::37 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::45 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::47 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::49 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::51 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::56 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::18 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::20 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::22 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::24 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::26 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::28 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::31 - 1426757941 /home/local/domains/localthisday.nl/private/socket/youtube_parsing.php::33 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::163 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::169 - 1426757941 /home/local/domains/localthisday.nl/private/include/classes/Youtube.php::182 - 1426757941 PHP Fatal error: Maximum execution time of 30 seconds exceeded in /home/local/domains/localthisday.nl/private/include/classes/Youtube.php on line 183

Как вы можете видеть, тот же код работает нормально, но п ext time, он не запускается и создает фатальную ошибку. Когда я перезапускаю скрипт, он также работает в случайном количестве времени, а затем снова сработает, поэтому он не может быть входным URL-адресом.

Любые идеи, как решить эту проблему, я не получаю фатальную ошибку?

Редактировать: Я забыл добавить: Функция api_get находится в классе Youtube.php. Я запускаю этот код из файла с именем youtube_parsing.php. В youtube_parsing.php я это, чтобы избежать ограничения выполнения:

set_time_limit(0); 
ini_set("max_execution_time", 0); 
+1

Это, вероятно, проблема сетевой латентности. Вы пытались увеличить эту настройку в своем curl-коде? 'CURLOPT_CONNECTTIMEOUT => 30' Вы также можете попробовать увеличить время выполнения PHP с помощью' set_time_limit() ' – gazareth

+1

Я пробовал разные значения, но мне все равно, если локон терпит неудачу или нет, я просто хочу чтобы продолжить код вместо того, чтобы получить фатальную ошибку, которая останавливает все. – SheperdOfFire

+0

Что такое строка 183 из Youtube.php? Похоже, что у него есть максимальный временной интервал PHP, где он попадает, прежде чем он достигнет предела завитка. Но странно, что вы все равно избегали предела исполнения. – gazareth

ответ

0

Вы должны увеличить максимально возможную execution time в php.ini.

+1

Извините, я забыл добавить его в свой пост, я добавил его сейчас. – SheperdOfFire

+0

set_time_limit (0) не работает, когда php работает в безопасном режиме. – doev

+1

безопасный режим выключен – SheperdOfFire