php error允许的内存大小为1073741824字节

时间:2016-04-21 07:28:24

标签: php

我有这段代码来上传文件。当我上传像(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 );

2 个答案:

答案 0 :(得分:1)

问题在于您是否要将文件存储在数据库中。那太疯狂了。 避免此错误的唯一(逻辑)解决方案是将文件上载到文件系统并将路径/引用/密钥保存在数据库中。 否则,你将继续得到这个错误加上你的数据库性能是无法忘记的。

或者你试试这个:ini_set('memory_limit', '-1');但我不推荐这个。

编辑:您还可以编辑.htaccess文件:添加php_value memory_limit xxxM,而xxx是您的最大尺寸,以兆字节为单位

答案 1 :(得分:1)

假设您的Content是二进制blob并且您实际上有理由在数据库中存储文件(可能有一些,最常见的是出于操作原因不推荐),您可以允许大文件通过读取文件的片段并使用update子句插入(或者只是执行插入后跟更新)来上载。使用fopenfreadfclose。请注意,对于非常大的文件,您可能会遇到其他方面的问题,例如网络服务器无响应等。