Php 文件\u处理大文件或多个文件时,将\u内容放得太慢

Php 文件\u处理大文件或多个文件时,将\u内容放得太慢,php,arrays,base64,Php,Arrays,Base64,我正在使用文件内容创建视频文件。问题在于速度和性能。创建一个平均大小为50MB的文件平均需要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->

我正在使用文件内容创建视频文件。问题在于速度和性能。创建一个平均大小为50MB的文件平均需要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);

当无法预知文件大小或将要处理大文件时,不应将整个文件加载到内存中。最好将文件分块读取并逐块处理

下面是一个如何实现它的快速而肮脏的示例:

<?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);

这里有很多问题,而且会产生复合效应

$json_str = file_get_contents('php://input');
这将整个输入读取到内存中,并阻塞直到完成。不要这样做

$json_obj = json_decode($json_str);
如果你有50MB的JSON,你可能做错了什么

$Video = $json_obj->Video;
这就是你做错的。。。以小型结构化数据序列化格式存储大型二进制blob。您意识到JSON解析器必须读取和处理整个过程吗?不要为此发送JSON

$video_decode = base64_decode($Video);
除非绝对必要,否则不要使用base-64编码。它增加了33%的存储容量开销,以及用于编码/解码的CPU。这完全是浪费,完全没有必要

$video_filename = __DIR__ . '/uploads/'. $CAF . '_'.$CafDate.'_VID.mp4';
$video_dbfilename = './uploads/'. $CAF . '_'.$CafDate.'_VID.mp4';
这两条线路可能存在严重的安全问题。如果有人发布了路径为
。/../../etc/init.d/某个邪恶的东西
?不要让用户以任何方式指定磁盘上的文件名

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

file\u get\u contents()
中的注释适用于此处,因为您应该使用此方法。将内容流式传输到磁盘。

@JefreySobreiraSantos你能告诉我怎么做吗?查看这些php函数fopen fwrite fclose我能做些什么来解决这个问题?我真的需要将视频保存到磁盘并将路径保存到我的database@LawrenceAgulto停止以JSON中的base-64格式发送视频。将其作为常规二进制文件发送。使用PHP的内置处理文件上传。你能告诉我怎么做吗?我发送的视频不是base64,而是一个字节array@LawrenceAgulto当您的代码清楚地显示您正在尝试解码base64和JSON时,您如何将视频作为字节数组发送?如果你没有提供任何客户端代码,我怎么可能向你展示更多的细节呢?