Потоковая передача локального файла из PHP, пока он записан процессом CURL

StackOverflow https://stackoverflow.com/questions/2034831

Вопрос

Я создаю простой прокси-сервер для своего сайта.Почему я не использую mod_proxy и mod_cache — это отдельная тема.Вот код:

    shell_exec("nohup curl --create-dirs -o {$write_path} {$source_url} > /dev/null 2> /dev/null & echo $!");
    sleep(1);

    $read_speed = 65.5; # 65.5 kb/s download rate
    $handle = fopen($write_path, "rb");

    $content_type = select_meta_item($headers, 'Content-Type');
    $file_size = select_meta_item($headers, 'Content-Length');
    send_headers($content_type, $file_size); 
    flush();

    while (!feof($handle))
    {
        echo fread($handle, round($read_speed * 1024));
        flush();
        sleep(1);
    }

    fclose($handle);

Потоковая передача MP3 при использовании этого метода не работает.Играет в Chrome, но не в Firefox.Первоначально я буду использовать его для потоковой передачи файлов MP3 через JW Player от Long Tail.Если все получится, я также буду использовать его для отправки ZIP-файлов.

Это было полезно?

Решение 2

Я понял.Код работает нормально.

Файл вызывался APACHE обработчиком 404 (ErrorDocument).Apache автоматически отправляет заголовок 404 перед вызовом PHP-скрипта.

Этот файл (код выше) не запускает процесс CURL и перенаправляет в файл, который выполняет потоковую передачу.Поскольку Apache вернул ошибку 404, Firefox проигнорировал ответ MP3.(тогда как Chrome этого не сделал).Теперь, когда я перенаправляюсь, все работает нормально.

Другие советы

Вопрос в том, может ли ваш формат файла передаваться в потоковом режиме с помощью клиентской реализации.Если Firefox не поддерживает воспроизведение mp3 пока загрузка не будет завершена, никакие уловки на стороне сервера не помогут вам добиться потоковой передачи.Вам понадобится поддержка на стороне клиента, например, встроенный проигрыватель на базе флэш-памяти.

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

Кстати, рассматривали ли вы возможность создания FIFO, указывая curl на входе FIFO и применяя readfile на выход FIFO, тем самым позволяя ОС обрабатывать вещи?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top