Apache/PHP5 popen/fread связывает Apache

Я пытаюсь разработать систему онлайн-управления для очень большой музыкальной библиотеки FLAC для радиостанции. У него есть мощный сервер и не так много пользователей, поэтому я хочу предложить услугу загрузки файлов, где PHP транскодирует файлы FLAC в MP3/WAV в зависимости от того, что хочет конечная точка.

Это отлично работает:

if($filetype == "wav")  {
    header("Content-Length: ". $bitrate * $audio->get_length());
    $command = "flac -c -d ".$audio->get_filename().".flac";
}

ob_end_flush();
$handle = popen($command, "r");
while($read = fread($handle, 8192)) echo $read;
pclose($handle);

и позволяет серверу начать отправку файла пользователю до завершения транскодирования (ну, в данном случае, декодирования) для максимальной скорости.

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

Я также пытался реализовать то же самое, используя proc_open без разницы, и поиграл с настройками Apache по количеству рабочих и тому подобное.

Это единственный способ остановить это поведение, чтобы использовать что-то вроде exec и ожидание завершения процесса кодирования, прежде чем я отправлю пользователю файл? Потому что это кажется неоптимальным!:(

ОБНОВЛЕНИЕ: кажется, что другие люди все еще могут получить доступ к веб-сайту, но не я - то есть это так или иначе связано с сессиями. Это смущает меня еще больше!

1 ответ

Решение

Используйте session_write_close() в какой-то момент перед началом потоковой передачи... Вы также можете захотеть stream_set_blocking(false) в канале чтения.

Другие вопросы по тегам