Потоковая передача локального файла из PHP, пока он был записан процессом CURL - PullRequest
1 голос
/ 09 января 2010

Я создаю простой прокси-сервер для моего сайта.Почему я не использую 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 ]

0 голосов
/ 10 января 2010

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

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

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

0 голосов
/ 10 января 2010

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

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

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

...