2014-09-20 3 views
0

В настоящее время я пытаюсь создать файл PHP, в котором он может выводить видео, которое не находится под public_html. Я использую следующий скрипт PHP для вывода видео:Что может быть причиной того, что PHP не выводит видео?

<?php 

//PHP script to output videos 

//Full version of file does a lot of database stuff 

//Get $path of file 

header('Content-type: video/mp4'); 
header('Content-Length: '.filesize($path)); // provide file size 

$contents = file_get_contents($path); 
echo $contents; 
//I also tried readfile($path) with the same results 

У меня есть подозрение, что это мой сервер. Итак, я попытался просмотреть тот же видеофайл напрямую (www.site.com/video.mp4). Выполнение этого прямо работало нормально.

Первоначально это работало нормально. Только в последнее время это не сработало. Я не уверен, что это то, что я установил на своем сервере. Я помню, что сделал несколько изменений в php.ini и, возможно, в .htaccess (или некоторые другие, скрытые с настройками внутри них), что заставляет меня думать, что это как-то связано с этим. Есть ли что-то в php.ini и/или .htaccess (или любой другой файл скрытых настроек, похожий на php.ini и .htaccess), который мне нужно будет изменить?

Сейчас я просто тестирую свой сайт на настольных браузерах. Я тестировал это как на Chrome, так и на Firefox, и они дают мне те же результаты. Я пробовал использовать ffmpeg для преобразования моих видео во многие разные видеоформаты, но он выходит с одинаковыми результатами (может играть напрямую, не может воспроизводиться через php-скрипт).

Когда я открываю файл php, консоль не имеет ошибок.

Что может быть причиной того, что мой PHP-скрипт не выводит видеоконтент?

+0

Что делает скрипт делать? Выводит ли что-нибудь? Есть ли запись в error_log? – Vero

+0

@Vero выводит видео. и нет, никаких ошибок. –

+1

Отправляет ли он правильную 'Content-Length'? – Barmar

ответ

0

Это код копируется из PHP Fread сайта имеет эти приличествует, как он отметил,

if ($file = fopen($path, 'rb')) { 
    while(!feof($file) and (connection_status()==0)) { 
     print(fread($file, 1024*8)); 
     flush(); 
    } 
    fclose($file); 
    } 
  • работает с большими файлами, и использует только буфер 8KB за один перевод.

  • Остановки передачи, если клиент отключается (в отличие от многих сценариев, которые продолжают читать и буфер весь файл, тратить ценные ресурсы), но не останавливает скрипт

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

  • Отправляет несколько заголовков, в том числе те, которые обеспечивают его кеширование в течение максимум 2 часов в любом браузере/прокси и «Content-Length», которые большинство людей, похоже, забывают.

https://php.net/fread

+0

Я пробовал это. он не работает. –

+0

Хотя, используя инструменты Chrome dev, на вкладке «Сеть» я вижу, что он загружает видео. Медленно он получает видеофайл размером 4 МБ (по крайней мере, ответ 4 МБ, и он говорит, что его тип - видео/mp4). –

+0

Это ужасно неэффективно. Используйте 'readfile()'. Кроме того, это не обязательно останавливает передачу, если клиент отключается ... это зависит от конфигурации PHP и веб-сервера. И в вашем фрагменте кода нет упоминаний о кэшировании или заголовках содержимого. – Brad

Смежные вопросы