file_put_contents和file_get_contents耗尽了内存大小



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

$content=file_get_contents("C:UsersBorutDesktopsql_PW1mm_ads (1).sql");
file_put_contents("C:UsersBorutDesktopsql_PW1New", $content);

我读到的文件大约有80M大,php中的内存限制是128M,但我得到了一个错误:

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

所以内存耗尽了,尽管我试图分配的内存实际上更小了??我可以通过增加内存限制来实现这一点,但我想知道为什么它在这个限制下不起作用。

它在tried to allocate xxxx bytes中显示的数量是超过PHP内存限制的数量。这意味着您在尝试分配额外的~80MB时,已用完128MB。

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

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

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

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;
}

资源

允许的内存大小为134217728字节已耗尽

首先猜测是file_get_contents()正在分配80M内存,而file_put_contends()正试图再分配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()

将整个文件加载到PHP中会很好地耗尽内存。如果你需要处理一个对你的内存来说太大的文件,你必须一次加载一点,这意味着你不能使用file_get_contents()

但是,如果您所做的只是复制文件,那么实际上根本不需要加载它——PHP确实提供了copy()函数。工作完成了,根本不需要加载。

相关内容

  • 没有找到相关文章

最新更新