我的代码看起来像这样:
$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);
我知道每个''都不是很有效率.运算符将重新分配更大的内存块,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)));
joelhardi.. 7
你有两个问题:
#1,有几种不同的方法可以计算MD5哈希值:
像你一样做,并作为字符串加载到PHP并使用PHP md5()
使用PHP md5_file()
从PHP 5.1+开始,您可以将PHP的流API与其中任何一个一起使用,md5
或者md5_file
避免将其完全加载到内存中
使用exec()
调用系统md5sum
命令
使用MySQL的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,而无需将整个文件加载到内存中,这意味着您的一系列操作的内存使用量可以低至您想要的!
你有两个问题:
#1,有几种不同的方法可以计算MD5哈希值:
像你一样做,并作为字符串加载到PHP并使用PHP md5()
使用PHP md5_file()
从PHP 5.1+开始,您可以将PHP的流API与其中任何一个一起使用,md5
或者md5_file
避免将其完全加载到内存中
使用exec()
调用系统md5sum
命令
使用MySQL的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,而无需将整个文件加载到内存中,这意味着您的一系列操作的内存使用量可以低至您想要的!