php错误允许1073741824字节的内存大小耗尽


php error Allowed memory size of 1073741824 bytes exhausted

我有这个代码段来上传一个文件。当我上传像(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()将整个字符串的数据提取到变量中。该变量存储在主机内存中。当字符串大于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 );

假设您的Content是一个二进制blob,并且您确实有在数据库中存储文件的原因(可能有一些,通常出于操作原因不建议这样做),您可以通过读取文件片段并插入update子句(或只执行插入然后进行更新)来允许大文件上传。使用fopenfreadfclose。请注意,对于非常大的文件,您可能会遇到其他方面的问题,例如Web服务器变得没有响应等。

问题是您将要在数据库中存储文件。这太疯狂了。避免此错误的唯一(逻辑)解决方案是将文件上传到文件系统,并将路径/reference/密钥保存在数据库中。否则,您将不断收到该错误,再加上您的数据库性能无法被遗忘。

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

编辑:您也可以编辑.htaccess文件:添加php_value memory_limit xxxM,而xxx是您的最大大小(MB)

相关文章: