Я хочу прочитать файл в строку, изменить содержимое и записать обработанную строку в файл.
Кроме того, другой запрос к серверу может начаться слишком рано и попытаться записать тот же файл до того, как первый будет завершен — что НИКОГДА не должно происходить (пока я использую flock) — было бы еще лучше, если бы скрипт блокировался до замок снят.
Вот какой-то неполный подход
$h = fopen($fp, 'a+');
flock($h, LOCK_EX);
$oTxt = '';
while (!feof($file)) {
$oTxt .= fread($h, 8192);
}
rewind($h);
ftruncate($h, 0)
fwrite($h, ); // process contents and write it back
flock($h, LOCK_UN);
fclose($h);
Примечание: этот вопрос очень похож на Как лучше всего читать и затем перезаписывать содержимое файла в php? (в моем случае это файл json, я хочу декодировать, вставить или отредактировать какой-то узел, затем закодировать его снова), но это не дубликат.
Вы можете заменить while
цикл с одним вызовом stream_get_contents
, И вы должны использовать режим r+
читать и писать файл; a+
при запуске будет размещать поток в конце файла, поэтому читать нечего.
$h = fopen($fp, 'r+');
flock($h, LOCK_EX);
$oTxt = stream_get_contents($h);
// Process contents
rewind($h);
ftruncate($h, 0);
fwrite($h, $oTxt);
flock($h, LOCK_UN);
fclose($h);
Других решений пока нет …