P粉1387117942023-10-19 13:40:07
您必須覆寫整個檔案。
因此,對於相對較小的文件,將文件讀入數組,搜尋單詞,替換找到的行,將所有其餘內容寫入文件。
對於大文件,演算法略有不同,但總體上完全相同。
重要的部分是檔案鎖定
這就是我們更喜歡資料庫的原因。
P粉1557104252023-10-19 13:24:24
一種可以用於適合您記憶體的較小檔案的方法兩次:
$data = file('myfile'); // reads an array of lines function replace_a_line($data) { if (stristr($data, 'certain word')) { return "replacement line!\n"; } return $data; } $data = array_map('replace_a_line', $data); file_put_contents('myfile', $data);
快速說明一下,PHP > 5.3.0 支援 lambda 函數,因此您可以刪除命名函數宣告並將映射縮短為:
$data = array_map(function($data) { return stristr($data,'certain word') ? "replacement line\n" : $data; }, $data);
理論上,您可以將其設為單一(更難遵循)php 語句:
file_put_contents('myfile', implode('', array_map(function($data) { return stristr($data,'certain word') ? "replacement line\n" : $data; }, file('myfile')) ));
對於較大的檔案應該使用另一種(記憶體佔用較少的)方法:
$reading = fopen('myfile', 'r'); $writing = fopen('myfile.tmp', 'w'); $replaced = false; while (!feof($reading)) { $line = fgets($reading); if (stristr($line,'certain word')) { $line = "replacement line!\n"; $replaced = true; } fputs($writing, $line); } fclose($reading); fclose($writing); // might as well not overwrite the file if we didn't replace anything if ($replaced) { rename('myfile.tmp', 'myfile'); } else { unlink('myfile.tmp'); }