对大文件使用 file_get_contents() 时如何避免内存耗尽错误?

Barbara Streisand
发布: 2024-10-17 13:43:29
原创
478 人浏览过

How to Avoid Memory Exhaustion Errors when Using file_get_contents() with Large Files?

File_get_contents 内存耗尽:全面的解决方案

在处理大文件时,臭名昭著的 PHP Fatal error:Allowed Memory Exed 错误可能是一个反复出现的问题。当 file_get_contents() 尝试将相当大的文件的全部内容读入内存时,通常会超出分配的内存限制,就会出现此问题。

替代 file_get_contents()

而不是加载整个文件到内存中,更有效的方法是将文件作为指针打开,并使用 fread() 以较小的块读取它。这允许内存管理,这对于处理大文件至关重要。

下面是一个模仿 Node.js 文件处理 API 功能的自定义函数:

<code class="php">function file_get_contents_chunked($file, $chunk_size, $callback)
{
    try {
        $handle = fopen($file, "r");
        $i = 0;
        while (!feof($handle)) {
            call_user_func_array($callback, array(fread($handle, $chunk_size), &$handle, $i));
            $i++;
        }
    } catch (Exception $e) {
        trigger_error("file_get_contents_chunked::" . $e->getMessage(), E_USER_NOTICE);
        return false;
    }
    fclose($handle);

    return true;
}</code>
登录后复制

此函数接受三个参数:文件路径、所需的块大小以及每次读取块时调用的回调函数。

自定义函数的使用

file_get_contents_chunked() 函数可以按如下方式使用:

<code class="php">$success = file_get_contents_chunked("my/large/file", 4096, function ($chunk, &$handle, $iteration) {
    /* Process the chunk here... */
});</code>
登录后复制

正则表达式注意事项

对大量数据执行多个正则表达式操作效率低下。考虑使用本机字符串操作函数,如 strpos()、substr()、trim() 和explode()。

示例清理

而不是:

<code class="php">$newData = str_replace("^M", "", $myData);</code>
登录后复制

使用:

<code class="php">$pattern = '/\r\n/';
$replacement = '';
$newData = preg_replace($pattern, $replacement, $myData);</code>
登录后复制

利用上述技术,可以有效地处理大文件,而不会遇到内存耗尽错误。

以上是对大文件使用 file_get_contents() 时如何避免内存耗尽错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!