#php #download #timeout #flush
#php #Скачать #тайм-аут #сброс
Вопрос:
У меня есть скрипт загрузки, который проверяет пару вещей, а затем передает файл порциями по 8 КБ.
Цикл, который выполняет передачу, выглядит следующим образом:
$file = @fopen($file_path,"rb");
if ($file) {
while(!feof($file)) {
set_time_limit(60);
print(fread($file, 1024*8));
flush();
if (connection_status()!=0) {
@fclose($file);
die();
}
}
@fclose($file);
}
Я написал небольшое приложение, которое имитировало очень медленную загрузку. Он ожидает 2 минуты, прежде чем продолжить загрузку. Я ожидал, что время ожидания скрипта истечет, учитывая, что я установил ограничение по времени в 60 секунд. Этого не происходит, и загрузка продолжается до ее завершения. Кажется, что время, проведенное в print / flush, не учитывается во времени выполнения скрипта. Это правильно? Есть ли лучший способ отправить файл клиенту / браузеру, чтобы я мог указать ограничение по времени для команды print / flush?
Ответ №1:
От set_time_limit()
:
The set_time_limit() function and the configuration directive max_execution_time
only affect the execution time of the script itself. Any time spent on activity
that happens outside the execution of the script such as system calls using system(),
stream operations, database queries, etc. is not included when determining the
maximum time that the script has been running. This is not true on Windows where
the measured time is real.
Таким образом, похоже, что вы можете либо измерить прохождение реального времени с помощью вызовов time()
функции, например:
$start = time();
while (something) {
// do something
if( time()-$start > 60) die();
}
Или вы можете использовать Windows. Я предпочитаю первый вариант: p
Комментарии:
1. Хорошо, но это не помогает мне в случае инструкции flush, которая блокирует выполнение скрипта. Если он никогда не вернется, я не смогу выполнить проверку времени…
2. Просто ради интереса. Я запустил тест в Windows с IIS, который у меня тоже не умер (это произошло спустя долгое время, но я ожидаю, что виновником будет IIS, а не ограничение по времени выполнения PHP). Рабочий сервер работает под управлением Linux и Apache.