Как увеличить время до появления ошибки тайм-аута чтения? - PullRequest
1 голос
/ 25 марта 2010

Я написал на PHP скрипт, выполнение которого занимает много времени [Обработка изображений для тысяч изображений]. Это метр часов - может быть 5.

После 15 минут обработки я получаю ошибку:


ERROR Запрашиваемый URL не может быть получен

При попытке получить URL-адрес возникла следующая ошибка: URL-адрес, на который я нажал

Read Timeout

Система вернула: [Нет ошибок]

Истекло время ожидания при чтении данных из сети. Сеть или сервер могут быть недоступны или перегружены. Пожалуйста, повторите ваш запрос.

Ваш администратор кеша - вебмастер.


Мне нужно, чтобы этот скрипт работал намного дольше.

Теперь вот вся техническая информация: Я пишу на PHP и использую Zend Framework. Я использую Firefox. Длинный скрипт, который обрабатывается, выполняется после нажатия на ссылку. Очевидно, что поскольку сценарий еще не закончен, я вижу веб-страницу, на которой была ссылка, и веб-браузер пишет «в ожидании ...». Через 15 минут возникает ошибка.

Я пытался внести изменения в Firefox, который выкинул: config, но безуспешно. Я не знаю, но изменения могут понадобиться где-то еще.

Итак, есть идеи?

Спасибо, вперед.

Ответы [ 5 ]

1 голос
/ 26 марта 2010

set_time_limit (0) влияет только на выполнение сценария на стороне сервера. Ошибка, которую вы получаете, является чисто браузерной стороной. Вы должны отправить что-то, чтобы браузер не принял решение об обрыве соединения - подойдет даже один символ вывода (за которым следует flush(), чтобы убедиться, что оно действительно отправлено по проводам). Может быть, один раз за каждое обработанное изображение или через фиксированный интервал времени (if last char sent more than 5 minutes ago, output another one).

Если вам не нужен промежуточный вывод, вы можете сделать ignore_user_abort(TRUE), что позволит скрипту продолжать работу, даже если соединение будет закрыто со стороны клиента.

0 голосов
/ 26 марта 2010

Если процесс выполняется часами, вам, вероятно, стоит заняться пакетной обработкой. Таким образом, вы просто сохраняете запрос на обработку изображения (в файле, базе данных или в том, что вам подходит) вместо того, чтобы начинать обработку изображения. Этот запрос затем принимается запланированным (cron) процессом, выполняющимся на сервере, который выполняет фактическую обработку (это может быть скрипт PHP, который вызывает set_time_limit (0)). А когда обработка завершена, вы можете сообщить пользователю (по почте или любым другим способом, который вам подходит), что обработка завершена.

0 голосов
/ 26 марта 2010

пакетирование всего процесса также имеет дополнительное преимущество: если что-то идет не так, вам не нужно начинать все заново.

Если вы работаете на своем собственном сервере и можете выйти из safe_mode, то вы также можете разветвлять фоновые процессы, чтобы выполнять тяжелую работу, независимо от того, как браузер смотрит на вещи. Если вы находитесь в многоядерной или многопроцессорной среде, вы можете даже запланировать более одного запущенного процесса в любое время.

Мы сделали что-то подобное для больших вычислительных скриптов; синхронизация процессов происходила через общую базу данных - но, к счастью, они были настолько независимы, что нам нужно было видеть только их завершение или завершение.

0 голосов
/ 26 марта 2010

Если вы можете разделить свою работу на партии, после обработки изображений X отобразите страницу с некоторым количеством javascript (или перенаправлений META), чтобы открыть ссылку http://server/controller/action/nextbatch/next_batch_id.

Сполосните и повторите.

0 голосов
/ 25 марта 2010

использовать set_time_limit

документация здесь

http://nl.php.net/manual/en/function.set-time-limit.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...