PHP - недостатки fwrite? - PullRequest
       7

PHP - недостатки fwrite?

1 голос
/ 29 июня 2010

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

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

Вставить - Насколько я могу судить, нет способа вставить символы в месте, отличном от конца файла, с помощью fwrite.Я выбрал два варианта: использовать file_get_contents и интенсивно использовать fseek / fwrite для расширения файла.

Delete - К сожалению, попытка записать NULL с использованием fwrite - это не то же самое, что «удалить»персонаж.Как и при вставке данных, снова доступны параметры file_get_contents и fseek / fwrite.

Обновление - обновление данных в файле представляет собой комбинацию проблем вставки / удаления.Если новое значение короче старого, тогда мне придется удалить дополнительные символы.Если новое значение длиннее старого, мне придется вставить дополнительные символы.Если они одинаковой длины, тогда просто использовать fwrite будет хорошо.

Надеюсь, есть кое-что, о чем я не знаю, что может решить эту проблему чисто.Каждый из найденных вариантов использует либо file_get_contents (который мне не нужен, так как весь файл должен быть прочитан в память), либо интенсивно использует fseek / fwrite для изменения длины файла (что мне кажется сложным).

У кого-нибудь есть идея, о которой я не задумывался?

Спасибо!

Ответы [ 2 ]

1 голос
/ 29 июня 2010

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

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

1 голос
/ 29 июня 2010

Вы всегда можете использовать fseek () и fwrite (), чтобы перетасовать файл в «чанки» фиксированного размера вместо использования file_get_contents ().Логика довольно проста, но я подозреваю, что она будет громоздкой и медленной, если будет реализована непосредственно в PHP, а не в виде библиотеки C.

...