Как лучше всего читать, а затем перезаписывать содержимое файла в php?

Какой самый чистый способ в php открыть файл, прочитать содержимое и впоследствии переписать содержимое файла с некоторым выходом на основе исходного содержимого? В частности, я пытаюсь открыть файл, заполненный списком элементов (разделенных символами новой строки), обработать / добавить элементы в список, удалить самые старые N записей из списка и, наконец, записать список обратно в файл.

fopen(<path>, 'a+') flock(<handle>, LOCK_EX) fread(<handle>, filesize(<path>)) // process contents and remove old entries fwrite(<handle>, <contents>) flock(<handle>, LOCK_UN) fclose(<handle>) 

Обратите внимание, что мне нужно заблокировать файл с помощью flock (), чтобы защитить его от нескольких запросов страниц. Будет ли флаг «w +», когда fopen () ing сделает трюк? В руководстве php указано, что он усекает файл до нулевой длины, поэтому, похоже, это может помешать мне прочитать текущее содержимое файла.

Если файл не слишком большой (то есть вы можете быть уверенным, что он не повредит ограничение памяти PHP), тогда самый простой способ – просто прочитать весь файл в строке ( file_get_contents() ), обработать строку и записать результат обратно в файл ( file_put_contents() ). Этот подход имеет две проблемы:

  • Если файл слишком велик (скажем, десятки или сотни мегабайт), или обработка будет голодна, у вас закончится нехватка памяти (тем более, если у вас есть несколько экземпляров выполняемой вещи).
  • Операция разрушительна; когда сбой не выполняется на полпути, вы теряете все исходные данные.

Если какая-либо из этих проблем вызывает беспокойство, план B заключается в обработке файла и в то же время записи во временный файл; после успешного завершения закройте оба файла, переименуйте (или удалите) исходный файл и затем переименуйте временный файл в исходное имя файла.

Читать

 $data = file_get_contents($filename); 

Написать

 file_put_contents($filename, $data);