#php #database #video #flv
#php #База данных #Видео #flv
Вопрос:
Код:
<?php $local_id = $_GET['id'];
mysql_connect("localhost", "root", "") or die("Could not connect: " . mysql_error());
mysql_select_db("database");
$sql = mysql_query("SELECT * FROM `videos` WHERE `id` = ".$local_id." ");
while($row = mysql_fetch_array($sql)){$file = $row["file_url"];}
header("Expires: Mon, 20 Dec 1980 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Pragma: no-cache");
header("Content-Type: video/flv");
readfile($file); ?>
Файл имеет формат .flv, но это занимает ~ 1 минуту. для загрузки видео
Что я могу сделать, чтобы загрузить его быстрее?
Правильный ли этот код?
Комментарии:
1. Я не уверен, что понимаю смысл текущей конструкции. Есть ли смысл получать последнюю строку и, если строк более 300, 300-ю строку?
2. Пожалуйста, установите XDebug и профилируйте код, чтобы увидеть, какие его части занимают много времени. Затем дополните свой вопрос вашими выводами.
Ответ №1:
Не используйте буферизацию вывода для передачи больших файлов. php должен сохранять весь файл в памяти и ждать, пока он будет полностью прочитан, прежде чем передавать его клиенту. Простое удаление ob_*
строк должно сработать.
Комментарии:
1. я удалил их, но он загружается так же медленно, как и раньше
2. @m3tsys Если вы удалите
readfile
строку, это все еще так медленно? Если да, то ваша база данных либо перегружена, либо подключение к ней имеет слишком высокую задержку. Если нет: с какого носителя вы читаете, т. Е. в какой файловой системе$file
и какова пропускная способность компьютера, управляющего этим?3. если я удалю эту строку, она загрузится мгновенно. Я не совсем понимаю второй вопрос.
$file
это файл .flv (плохая часть в том, что файл большой ~ 16 МБ, и с этой стороны он может быть больше, в зависимости от файла) Я использую выходные данные для отображения их в jwplayer.4. @m3tsys Что ж, тогда передача выполняется следующим образом:
medium (HDD? network?) -> file system/OS -> connection between server and client
. Если вы можете сказать мне, какой носитель вы используете (для начала, значение$file
для исключения других файловых протоколов, кроме собственных) и убедиться, что это не просто низкая скорость соединения между сервером и клиентом, мы могли бы дополнительно диагностировать проблему.5. файл размещен на другом сервере. Значение
$file
может бытьhttp://dc261.4shared.com/img/598846680/423e3dd8/dlink__2Fdownload_2FWMEIGHDp_2FD_5FBxEKzY_5F9k.mp4_3Ftsid_3D20110515-093046-1651b7d1/preview.flv
таким, что если я использую этот URL непосредственно в jwplayer, видео загружается за ~ 5 секунд.
Ответ №2:
Первое, что я бы сказал, это поместить индекс в поле Id, чтобы уменьшить время поиска … и использовать memcache для кэширования результатов DB, Если у вас нет ограничений на среду, я бы поставил кэширующий обратный прокси, такой как nginx, который кэширует HTTP-ответ, используя ваши заголовки кэширования, но будет для каждого клиента. В качестве альтернативы существуют аппаратные устройства, которые делают это за вас … обычно довольно дорогие, хотя