我有这段代码来上传文件。当我上传像(300MB)这样的大文件时,我得到了这个错误。低于20 MB的文件可以正常工作。
Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 813695000 bytes) in C:\xampp\htdocs\PHP\processor.php on line 219
注意:我已经做了很多SO和谷歌搜索,但未能解决这个问题。
我找到的原因:原因 - file_get_contents()
将整个数据字符串提取到变量中。该变量存储在主机内存中。
当string大于PHP进程专用的大小时
$data = file_get_contents( $path );
//echo $data;
$data = mysqli_real_escape_string( $con, $data );
$query_insert = "INSERT INTO Upload(Name,Type,Size,Content) VALUES('Tour Photo','jpg',234, '$data')";
$result_insert = mysqli_query( $con, $query_insert ) or die ("<hr>Couldn't execute INSERT query: ". mysqli_error($con));
echo "<h4>New sport added to the database</h4>";
@RedPoppy的更新代码
$fo = fopen ( $path, 'r' );
if( is_readable($path) ){
echo "*** Uploaded file is readable ***<br><br>";
}
$data = fread ( $fo, filesize($path) ); //read entire file
$data = mysqli_real_escape_string ( $con, $data );
fclose( $fo );
答案 0 :(得分:1)
问题在于您是否要将文件存储在数据库中。那太疯狂了。 避免此错误的唯一(逻辑)解决方案是将文件上载到文件系统并将路径/引用/密钥保存在数据库中。 否则,你将继续得到这个错误加上你的数据库性能是无法忘记的。
或者你试试这个:ini_set('memory_limit', '-1');
但我不推荐这个。
编辑:您还可以编辑.htaccess文件:添加php_value memory_limit xxxM
,而xxx是您的最大尺寸,以兆字节为单位
答案 1 :(得分:1)
假设您的Content
是二进制blob并且您实际上有理由在数据库中存储文件(可能有一些,最常见的是出于操作原因不推荐),您可以允许大文件通过读取文件的片段并使用update子句插入(或者只是执行插入后跟更新)来上载。使用fopen
,fread
和fclose
。请注意,对于非常大的文件,您可能会遇到其他方面的问题,例如网络服务器无响应等。