file_put_contents слишком медленный при обработке большого файла или нескольких файлов - PullRequest
0 голосов
/ 19 декабря 2018

Я использую file_put_contents для создания видеофайла.проблема в скорости и производительности.Создание среднего размера файла 50 МБ занимает в среднем от 30 до 60 минут, и это только для одного файла.Я декодирую массив байтов для создания файла.Как я могу улучшить скорость и производительность?

$json_str = file_get_contents('php://input');
$json_obj = json_decode($json_str);
$Video = $json_obj->Video;
$CAF = $json_obj->CAF;
$Date = $json_obj->Date;
$CafDate = date("Y-m-d", strtotime($Date));

$video_decode = base64_decode($Video);
$video_filename = __DIR__ . '/uploads/'. $CAF . '_'.$CafDate.'_VID.mp4';
$video_dbfilename = './uploads/'. $CAF . '_'.$CafDate.'_VID.mp4';
$save_video = file_put_contents($video_filename, $video_decode);

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Здесь много проблем с сложным эффектом.

$json_str = file_get_contents('php://input');

Это читает весь ввод в память и блокирует, пока это не будет сделано.Не делайте этого.

$json_obj = json_decode($json_str);

Если у вас есть 50 МБ JSON, вы, вероятно, делаете что-то не так.

$Video = $json_obj->Video;

Это то, что вы делаете неправильно ...хранение большого двоичного двоичного объекта в формате сериализации небольших структурированных данных.Вы понимаете, что анализатор JSON должен читать и обрабатывать все это?Не отправляйте JSON для этого!

$video_decode = base64_decode($Video);

Не используйте кодировку base-64 без крайней необходимости.Это добавляет 33% накладных расходов к объему хранилища, а также к процессору для кодирования / декодирования.Это полная трата и совершенно не нужно.

$video_filename = __DIR__ . '/uploads/'. $CAF . '_'.$CafDate.'_VID.mp4';
$video_dbfilename = './uploads/'. $CAF . '_'.$CafDate.'_VID.mp4';

У вас могут быть серьезные проблемы с безопасностью на этих двух линиях.Что если кто-то отправит путь ../../../etc/init.d/something-evil?Не позволяйте пользователю диктовать имя файла на диске каким-либо образом.

$save_video = file_put_contents($video_filename, $video_decode);

Комментарий от file_get_contents() применяется здесь в том, что вы должны использовать этот метод.Вместо этого передайте содержимое на диск.

0 голосов
/ 19 декабря 2018

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

Вот быстрый и грязный пример того, как этого добиться:

<?php
// open the handle in binary-read mode
$handle = fopen("php://input", "r");

// open handle for saving the file
$local_file = fopen("path/to/file", "w");

// create a variable to store the chunks
$chunk = '';

// loop until the end of the file
while (!feof($handle)) {
  // get a chunk
  $chunk = fread($handle, 8192);

  // here you do whatever you want with $chunk
  // (i.e. save it appending to some file)
  fwrite($local_file, $chunk);
}

// close handles
fclose($handle);
fclose($local_file);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...