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) в канале чтения.