使用 PHP 处理大文件而不耗尽内存
由于内存限制,在 PHP 中读取和处理大文件可能具有挑战性。 file_get_contents() 函数在处理消耗超过允许内存的大文件时可能会触发“内存耗尽”错误。
了解内存分配
当使用 file_get_contents( ),整个文件被读取并作为字符串存储在内存中。对于大文件,这可能会超出分配的内存并导致错误。
替代方法:分块文件读取
要避免此问题,请考虑使用替代方法,例如如 fopen() 和 fread() 来分块读取文件。这使您可以一次处理文件的较小部分,从而有效地管理内存使用情况。下面是实现这种方法的函数:
function file_get_contents_chunked($file, $chunk_size, $callback)
{
try {
$handle = fopen($file, "r");
$i = 0;
while (!feof($handle)) {
call_user_func_array($callback, [fread($handle, $chunk_size), &$handle, $i]);
$i ;
}
fclose($handle);
return true;
} catch (Exception $e) {
trigger_error("file_get_contents_chunked::" . $e->getMessage(), E_USER_NOTICE);
return false;
}
}
用法示例
要使用此函数,请定义处理块的回调并提供必要的参数:
$success = file_get_contents_chunked("my/large/file", 4096, function ($chunk, &$handle, $iteration) {
/* Do something with the chunk */
});
其他注意事项
另一个优化是避免使用复杂的正则表达式,它在应用于大型输入时会消耗大量内存。考虑使用 strpos、substr 和explode 等原生字符串函数。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3