Как лучше всего читать и затем перезаписывать содержимое файла в php? - PullRequest
4 голосов
/ 19 августа 2011

Какой самый простой способ в 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 () сделает свое дело?В руководстве по php говорится, что оно урезает файл до нулевой длины, поэтому, похоже, это может помешать мне прочитать текущее содержимое файла.

Ответы [ 2 ]

1 голос
/ 19 августа 2011

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

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

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

0 голосов
/ 19 августа 2011

Чтение

$data = file_get_contents($filename);

Запись

file_put_contents($filename, $data);
...