在处理大文件时,臭名昭著的 PHP Fatal error:Allowed Memory Exed 错误可能是一个反复出现的问题。当 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中文网其他相关文章!