woonem
@woonem

Как работать с большими файлами в PHP?

Примерные задачи:
1. Изменить первый символ в файле, не загружая весь файл в память.
2. Убрать первый символ, не загружая весь файл в память.
3. Добавить 1 символ в начало файла, не загружая весь файл в память.

С маленькими файлами всё просто:
//1
file_put_contents($file, $symbol.substr(file_get_contents($file), 1));
//2
file_put_contents($file, substr(file_get_contents($file), 1));
//3
file_put_contents($file, $symbol.file_get_contents($file));

Но проблема в том, что файл большой и загружать его в память не стоит, так как изменять его нужно часто.
  • Вопрос задан
  • 655 просмотров
Пригласить эксперта
Ответы на вопрос 2
bigton
@bigton
Web-программист
fopen, fread, fwrite
Ответ написан
2ord
@2ord
Считывать и записывать информацию из/в файла при блоками фиксированного размера N байт (в буфер).

При добавлении в конец файла сначала копируются все блоки из старого файла в новый, затем добавляется блок нужной длины символов. Файл закрывается и переименовывается в имя старого.

При удалении информации нужно подсчитать какое кол-во блоков сначала файла нужно пропустить, затем скопировать блоками оставшуюся информацию в новый файл, закрыть и переименовать.

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

Заметим, что "символ" может быть как размером 1 байт, так и больше. Советую обратить внимание на то как кодируется символ в UTF-8 и прочих.
Самый простой случай это когда "символ" кодируется лишь одним байтом. С исходного файла считывается 1 байт, в ту же позицию заменяется на байт другого значения. Всё.
Если, скажем, символ кириллицы, то тогда нужно загрузить в память первый "блок" размером 1 "символ". То есть меняется лишь длина последовательности байтов, а суть та же.

Работа с файлами похожа среди разных языков.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы