Задача относительно простая - по клику на определенную ссылку открыть popup-окно, в котором должен начать проигрываться mp3-файл.
Первое, что пришло в голову, это что-то такое:
header('Content-type: audio/mpeg');
header('Content-length: ' . filesize($filepath));
header('Content-Disposition: inline; filename="'.$filename.'"');
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
readfile($filepath);
Но в процессе тестирования выяснилось, что пока скрипт продолжает передавать в попап этот mp3-файл никакие другие действия этот пользователь на сайте совершать не может, остальные запросы ждут, когда отработает текущий. То есть, например, если щелкнуть по другой ссылке - браузер никуда не перейдет, пока файл не допередается.
Вопрос первый - почему так происходит? Мне не совсем это очевидно, мне казалось, что ну висит одно активное соединение - и пусть висит, для других запросов с этого же хоста откроются новые.
Дальше я стал экспериментировать с icecast2 и liquidsoap, на сервере они были установлены. Я рассуждал так, что, в принципе, задачу стриминга можно решать как раз инструментами для стриминга. В итоге php-скрипт на лету создает liquidsoap-скрипт и запускает его на исполнение, что динамически создает маунт-поинт вещания в icecast, на который мы и редиректим попап.
В этом решении нет проблемы с параллельными запросами, но есть две другие - проигрывание файла начинается после небольшой задержки из-за буферизации потока и, так как в попапе проигрывается поток вещания, файл не скачивается и поводить вперед-назад ползунком проигрывания на разные моменты песни нельзя.
Так что вопрос второй - действительно ли лучше остановиться на этом втором варианте? Или я что-то упускаю и есть еще варианты, как можно реализовать прослушивание файла через php-скрипт?