2014-02-21 2 views
0

У меня есть сценарий, который в основном очищает вещи.Избегайте максимального времени выполнения со счетом - PHP

Одна части сценария требует проверки, если есть изображения, используя file_get_contents

Я ЗНАТЬ это собирается столкнуться с проблемами, и я собираюсь получить Fatal error: Maximum execution time of 30 seconds exceeded время от времени, и хочу, чтобы избежать этого.

Есть ли способ установить счетчик, который начинает отсчет, и если file_get_contents завершится с ошибкой через 25 секунд, сценарий игнорирует, то выполняется.

Я скажу, я знаю, что могу, но я не хочу увеличивать срок.

Это базовый сценарий:

$query = "select table_id, image_url from table"; 

$res = $mysqli->query($query) or trigger_error($mysqli->error."[$query]"); 

while($row = $res->fetch_array()){ 

    // save the image 
    $img = '/path/to/'.$row[table_id].'.jpg'; 

    //## need to start counting to 25 secs here 

    $saveImage = file_put_contents($img, file_get_contents($row[image_ur])); 

    //## check if 25 seconds realised, if so with no $saveImage then continue 

    if($saveImage){ 
     // do something else 
    } 

} 
+1

См: [Timeout функция в PHP] [1] [1]: http://stackoverflow.com/questions/10587323/timeout-a-function-in-php –

+0

Ну, если максимальное время выполнения истекает, тогда скрипт умрет, а не цикл, который мы можем обновить через 25 секунд, и переустановим страницу с параметром в качестве последнего индекса, где цикл может снова начинаться с индекса. Для работы с файлами я не уверен, что это можно сделать, но вы можете увеличить максимальное время выполнения. –

+0

'set_time_limit (0);' –

ответ

1

Вместо извлечения весь файл, вы можете просто «пинг» это с помощью CURL, так что вы только принести свои заголовки и получить код состояния (200 = файл существует, 404 = файл не существует).

Если файлы НЕ удалены, используйте file_exists(). Было бы также интересно Wether оберток ПГПС включены в file_exists, так что вы можете сделать:

file_exists('http://image.url.com/file.jpg'); 

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

В противном случае использовать CURL с возможностью не загружать тело:

curl_setopt($curl, CURLOPT_NOBODY, true); 

Его также хорошо, чтобы запустить этот скрипт в CLI, а не через браузер, а затем установить тайм-аут до 2-х часов и дайте ему поработать ..

Если вы не можете изменить тайм-аут, взгляните на Gearman и просто отправьте свою работу после нажатия на ваш скрипт в браузере.

Update

Вам не придется "считать до 25", вы можете установить этот тайм-аут с параметрами:

CURL: http://php.net/manual/en/function.curl-setopt.php - CURLOPT_CONNECTTIMEOUT

string file_get_contents (string $filename 
     [, bool $use_include_path = false 
     [, resource $context [, int $offset = -1 [, int $maxlen ]]]]) 

$context Использование:

resource stream_context_create ([ array $options [, array $params ]]) 

В сочетании с stream_set_timeout:

bool stream_set_timeout (resource $stream , int $seconds [, int $microseconds = 0 ]) 

Я настоятельно рекомендую использовать CURL с НИКТО опций и таймаут, ваш скрипт будет работать в 10 раз быстрее и установили тайм-аут (25 это слишком много, использовать 5 или что-то более низкое).

CURL также использует Keep-Alive, file_get_contents не делает.

0

Если вы действительно хотите сделать, что вы можете использовать PHP micrtotime или функцию времени, чтобы определить, как долго скрипт работает, если вам нужно, чтобы завершить сценарий после 25 секунд. Это те элементы документации для них: http://php.net/time и http://php.net/microtime

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