使用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