file_put_contents和file_get_contents耗尽内存大小

时间:2013-02-05 17:10:40

标签: php file-get-contents memory-limit

我有一些简单的尝试从一个文件写到另一个文件。

$content=file_get_contents("C:\Users\Borut\Desktop\sql_PW1\mm_ads (1).sql");
file_put_contents("C:\Users\Borut\Desktop\sql_PW1\New", $content);

我读的文件大约是80M大,php中的内存限制是128M,但是我收到错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 80739522 bytes)

即使我试图分配的内存实际上更小,内存也已耗尽?我可以通过增加内存限制来完成这项工作,但我想知道它为何无法使用此限制。

4 个答案:

答案 0 :(得分:5)

它在tried to allocate xxxx bytes中显示的金额超过了PHP中的内存限制。这意味着当您尝试分配额外 ~80MB时,您已经耗尽了128MB。

即使您可以将文件放入内存中,当您知道文件会很大时,使用fopen / fread /的组合会更好fwrite / fclose

我认为你不仅仅是阅读内容并将其写入另一个文件,对吧?因为如果这就是你所需要的,你可以使用copy函数。

答案 1 :(得分:1)

首先猜测是file_get_contents()正在分配80M的内存,而file_put_contents()正在尝试分配另一个80M的内存。你可以试着把

var_dump(memory_get_usage())
线之间的

请注意,此错误消息并未告知实际使用了多少内存:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 80739522 bytes)

因此,这可能意味着PHP实际上正在使用100M并尝试分配另一个80M

当然,对于如此大的文件,您可以使用fopen()fwrite(),而不是立即将整个文件放在内存中。

此外,如果您只想复制这些文件,您只需使用copy()

即可

答案 2 :(得分:1)

将整个文件加载到PHP中可以很好地耗尽内存。如果您需要使用对您的内存来说太大的文件,则必须一次加载一次,这意味着您无法使用file_get_contents()

但是,如果你所做的只是复制文件,根本不需要加载它 - PHP确实提供了copy() function。完成工作,根本不需要加载。

答案 3 :(得分:1)

要下载大文件而不耗尽内存,请尝试以下功能:

function custom_put_contents($source_url='',$local_path=''){

    $time_limit = ini_get('max_execution_time');
    $memory_limit = ini_get('memory_limit');

    set_time_limit(0);
    ini_set('memory_limit', '-1');      

    $remote_contents=file_get_contents($source_url);
    $response=file_put_contents($local_path, $remote_contents);

    set_time_limit($time_limit);
    ini_set('memory_limit', $memory_limit); 

    return $response;
}

<强>资源

Allowed memory size of 134217728 bytes exhausted