2014-01-17 2 views
0

По какой-то причине наш веб-сервер не отвечает, пока он обслуживает большие файлы. Мы используем платформу Windows, потому что нам нужно удаленно обращаться к приложениям Win32, чтобы сгенерировать файл, который должен обслуживаться. Этот файл подается через функцию РНР: fpassthru, используя этот код:Веб-страницы, которые не обслуживаются при больших передачах файлов (IIS7.5 + PHP)

if (file_exists($file)) { 

$handle = @fopen($file, "rb"); 
header('Content-Description: File Transfer'); 
header('Content-Type: video/mp4'); 
if($stream==0){ 
    header('Content-Disposition: attachment; filename='.basename($filename.".mp4")); 
} 

header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($file)); 

ob_end_clean(); 

fpassthru($handle); 

exit; 

} 

Эти файлы часто более 1 ГБ и занимает некоторое время, чтобы передать, но в течение этого времени, веб-сервер не будет обслуживать ни одной страницы. Мой firefox указывает, что это «соединение», но больше ничего. Обратите внимание, что кто-то еще передает этот файл, а не меня, так что разные IP-адреса, разные сеансы.

Любой ключ, где искать? Очевидно, невыносимо ждать 5 минут для веб-сайта. Спасибо заранее!

+0

Это, казалось бы, указывает на проблему с резьбой. Возможно, проблема с вашей конфигурацией PHP в IIS. Дополнительные потоки должны обрабатывать другие запросы во время загрузки. Вам нужно передать загрузку через php? – datasage

ответ

1

Это обычно происходит, когда вы не закрываете сеанс перед началом отправки данных файла. Это связано с тем, что файл кеша сеанса может быть открыт только одним процессом PHP за раз, поэтому загрузка эффективно блокирует все другие процессы PHP на session_start().

Решение состоит в том, чтобы позвонить session_write_close(), чтобы зафиксировать данные сеанса на диске и закрыть дескриптор файла, прежде чем вы начнете выводить данные файла.

+0

Это решило! Удивительно, спасибо! –