Произойдет ли таймаут PHP-скрипта во время оператора print / flush? - PullRequest
0 голосов
/ 18 октября 2011

У меня есть скрипт загрузки, который проверяет несколько вещей, а затем передает файл по 8kb.

Цикл, который выполняет передачу, выглядит следующим образом:


$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 Ответ

1 голос
/ 18 октября 2011

С 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

...