Как я могу оптимизировать этот код для повышения скорости?

#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-ответ, используя ваши заголовки кэширования, но будет для каждого клиента. В качестве альтернативы существуют аппаратные устройства, которые делают это за вас … обычно довольно дорогие, хотя