我的代码看起来像这样:
$data = file_get_contents($tempFile); // perhaps 30MB of file data, now in PHP's memory
$hash = md5($data);
$query = "INSERT INTO some_table
SET BlobData = '" . mysql_real_escape_string($data) . "',
BlobHash = '$hash'
";
mysql_query($query);
Run Code Online (Sandbox Code Playgroud)
我知道每个''都不是很有效率.运算符将重新分配更大的内存块,30MB字符串将被复制多次.
有没有比以下解决方案更有效的方法?
$data = file_get_contents($tempFile); // perhaps 30MB of file data, now in PHP's memory
$hash = md5($data);
$query = "INSERT INTO some_table SET BlobData = '%s', BlobHash = '$hash'";
mysql_query(sprintf($query, mysql_real_escape_string($data)));
Run Code Online (Sandbox Code Playgroud)
你有两个问题:
#1,有几种不同的方法可以计算MD5哈希值:
md5()md5_file()md5或者md5_file避免将其完全加载到内存中exec()调用系统md5sum命令MD5()函数来计算哈希值由于这些都很容易实现,因此您可以轻松地实现所有内存使用和速度并对其进行基准测试.以下是一些基准测试,显示系统md5 via exec比md5_file文件大小增加时快得多.就内存使用而言,按照自己的方式进行绝对是最糟糕的方式.
#2 mysql_real_escape_string执行数据库查询,因此您实际上将blob数据传输到数据库,将其作为字符串返回,然后使用INSERT查询再次传输(!).所以它往返于DB服务器3x而不是1x,并且在PHP中使用2x内存.
使用PHP5预处理语句并将此数据仅发送到数据库一次会更有效.阅读链接的文章部分,您会看到它提到在绑定参数时,您可以使用blob类型将blob数据以块的形式传输到数据库.在PHP的文档mysqli_stmt::send_long_data有这一点,插入一个文件到BLOB列,就像你是一个伟大的简单的例子.
通过这样做,并使用流API md5_file或exec系统md5命令,您可以完成整个INSERT,而无需将整个文件加载到内存中,这意味着您的一系列操作的内存使用量可以低至您想要的!