PHP для чтения и анализа большого размера файла?

Я собираюсь прочитать текстовый файл размером 200 Мб, а затем отредактировать что-то внутри, а затем сохранить его обратно. Но у меня есть ошибки. Так:

  • Какие точные настройки следует изменить в php?

Кроме того, какой метод чтения файлов лучше всего подходит для открытия и анализа больших файлов? Я имею в виду:

  • фуд?
  • file_get_contents?

Я должен был сделать что-то подобное, прочитав 1 ГБ файл. Я хотел остаться в PHP, поэтому, наконец, я использовал fread для чтения частей файла, поэтапно:

 while (!feof($source_file)) { $buffer = fread($source_file, 1024); // use a buffer of 1024 bytes $buffer = str_replace($old,$new,$buffer); fwrite($target_file, $buffer); } 

Таким образом, только небольшая часть файла сохраняется в памяти в любой момент времени. Я проверил эффективность, и это хорошо, около половины минут для всего файла.

Небольшая заметка: если замененная строка находится в конце буфера, она не может быть заменена. чтобы убедиться, что вы изменили все вхождения, снова запустите скрипт с небольшим смещением:

 $buffer = fread($source_file, 512); fwrite($target_file, $buffer); while (!feof($source_file)) { $buffer = fread($source_file, 1024); // use a buffer of 1024 bytes $buffer = str_replace($old,$new,$buffer); fwrite($target_file, $buffer); } 

В основном же, как и уже существующий ответ, но с указателями файлов.

 $original = fopen("/tmp/inputfile.txt", "r"); $new = fopen("/tmp/outputfile.txt", "w"); if ($original && $new) { while (($buffer = fgets($handle)) !== false) { //do modification on $buffer (which is a single line) fwrite($new, $buffer); } fclose($original); fclose($new); } 

Для выполнения аналогичной задачи я использую следующее:

 $file = file_get_contents("/path/to/file"); $lines = explode("\n", $file); $arr = preg_grep("/search_string/", $lines); // $arr is now a smaller array of things to match // do whatever here // write back to file file_put_contents("/path/to/file", implode("\n", array_merge($arr, $lines))); 

PHP не предназначен или не предназначен для этого. Возможно, вам захочется использовать Perl, или изменить текст в XML, или поместить его в базу данных.

Выполнение этого так, как вы планируете, означает, что весь файл будет загружен в память. Если у вас есть несколько пользователей, делающих то же самое, у вас будет очень мало памяти.

Для синтаксического анализа XML смотрите здесь XMLReader