[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Длительное выполнение скрипта
meryfelow
Здравствуйте!
Подскажите куда рыть и что смотреть.
Следующая ситуация.
Есть своя закрытая система по вагонному парку, дислокации вагонов и прочего связанного с вагонами.
Когда то прикрутил phpExcel и выгружал информацию в excel.
Недавно один из клиентов сказал - что не может выгрузить информацию по оборотам.
Получается - что когда указывается большой период(и файл формируется с количеством строк от 5 000) - то действительно выдает ошибку - Ошибка при установлении защищённого соединения.

Код в принципе простой - выполняется запрос к базе - потом результат запроса записывается в файл через phpExcel.
И потом стоит банальное header:location на этот созданный файл.

Стоит set_time_limit(0);

И кстати - когда период для выборки очень большой - то просто вываливает ошибку и не создает файл.
Когда период не очень большой- то создает физически файл на сервере - но все ровно выдает такую ошибку. Этот файл скачивал и открывал .

Когда же период небольшой - то сразу делает переход на файл и предлагает открыть/скачать.

В хроме пишет следующее
Страница недоступна
Сайт не отправил данных.
ERR_EMPTY_RESPONSE
meryfelow
В общем посмотрел - логи - получается все таки не хватало памяти.
Поставил memory_limit достаточный
Теперь мелкие порции бросает нормально как и было.
А при формировании большого файла - выдает ошибку - но сам файл формируется дальше - после того как сообщение появилось.
То есть получается рвется связь клиента с сервером - но на самом сервере файл отчета создается.
Получается вопрос в том - почему рвется связь.
Valick
При работе по HTTP 1.1 все соединения считаются постоянными, если не обозначено иное.[1] При этом постоянные соединения не используют сообщения keepalive, а просто позволяют передачу многократных запросов в одном и том же соединении. Тем не менее, время ожидания по умолчанию в httpd для Apache 1.3[2] и 2.0[3] составляет всего 15 секунд, а для Apache 2.2[4] и 2.4[5] лишь 5 секунд. Преимуществом короткого таймаута является возможность быстро отдать клиенту несколько компонентов веб-страницы, не блокируя при этом слишком долго в состоянии ожидания процессы или потоки сервера.[6]

В вашем случае проще всего опрашивать по ajax сервер на предмет готовности файла. Ну и сам алгоритм формирования файла подозреваю далеко не идеальный, начиная с выборки из БД которая скорее всего использует запросы в цикле.

_____________
Стимулятор ~yoomoney - 41001303250491
meryfelow
Запрос один, который возвращает в зависимости от дат начала и конца рейсов- разное количество данных(никаких циклов нет).
Даже при большой выборке запрос отрабатывает достаточно быстро.
А так как phpexcel не очень то быстр в формировании файлов - то как раз время записи файла и занимает основное время - которое может варьироваться от 10 секунд до нескольких минут. Как вариант конечно можно ограничить временные рамки каким то периодом, тогда такой ситуации не будет. Но все же хочется понять - что и как.
Специально создал простой файл, в котором сделал длительный цикл без каких либо операций.
Выкинуло через время указанное в php.ini max_execution_time (поставил 8 минут).

Здесь же стоит set_time_limit(0)
И все ровно выкидывает намного раньше чем время max_execution_time - где то через 50 секунд.
Valick
При чём тут set_time_limit(0) и таймаут соединения? РНР вообще плевать потерялось у вас соединение или нет, за это отвечает Apache, РНР продолжает работать отведённое ему время для скрипта. Я же вам рассказал как следует поступить. Отправляйте запросы на сервер например раз в 10 секунд и проверяйте готов файл или нет (ну и обработка ошибок тоже должна быть), как будет готов отдавайте на скачивание.

_____________
Стимулятор ~yoomoney - 41001303250491
meryfelow
Ну не знаю.
Просто тогда не понимаю, почему
при выполнении php файла в котором такой код
for($i=0;$i<10000000000;$i++) {

}


обрыв соединения происходит как раз через max_execution_time = 530.

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

Что цикл php код, что формирования excel php код.

Но во время выполнения цикла - соединение держится max_execution_time , а при выполнении php кода, который формирует excel - соединение сбрасиывается через 50 секунд.
meryfelow
Вот был случай с тем же битрикс 1с.
Надо было выгрузить около 10 000 товаров в xml.
Выгружая стандартными функциями битрикса - также сбрасывало соединение - потому что выполнялось все очень долго.
Там я просто написал свой запрос - и время выполнения стало около 2 секунд.

Но случай наверное тот же.
Valick
meryfelow, попробуйте использовать буферизацию вывода

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

_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.