Jeurey
Хранитель порядка
- Регистрация
- 13 Сен 2006
- Сообщения
- 419
- Реакции
- 614
- Автор темы
- #1
В связи с тем, что хранение в файлах информации не совсем удобно в плане поиска текста в них, а на форуме обсуждается это узкое место - решил написать небольшой обзор по работе с файлами.
Итак, какими способами можно получить содержимое файла?
1. Функция file_get_contents($sFileName); В качестве аргумента принимает имя файла. Возвращает строку. Наиболее часто советуется новичкам для использования. Однако, никто не говорит им, что размер файла должен быть КАК МИНИМУМ меньше, чем количество оперативной памяти, которое доступно php-скрипту. Если места скрипту не хватит - вы получите сообщение вроде "Fatal error: Allowed memory size of XXX bytes exhausted (tried to allocate YYY bytes)".
2. Функция file($sFileName); В качестве аргумента принимает имя файла, а возвращает массив, элементами которого являются строки исходного файла. Исходя из того, что количество строк и размер файла может быть заранее неизвестны - использование этой функции может быть фатальным для вашего скрипта.
3. Использование чтения файла "в поток". В кратце, алгоритм выглядит так: открывается файл на чтение (fopen($sFileName, $sReadMode)) и читается в цикле блочно, с фиксированным размером буфера (если не используется построчное чтение). Теоретически (да и практически) такой подход является особенно эффективным в плане расходования ресурсов для применения к файлам среднего и большого размера (для себя я установил минимальный порог количества строк в 100 единиц).
Стоит, однако, понимать, что использование третьего метода к небольшим файлам, как минимум, не повредит вашей программе. Если, конечно же, не требуется выполнение специфической задачи.
Рассмотрим несколько примеров, чтобы понять в каких случаях можно применять тот либо иной метод.
1. Файл состоит из 15 строк. В каждой строке содержится 1 наименование товара, который есть в ассортименте Вашего магазина. В данном случае, я бы не стал заморачиваться над чтением файла в поток - честно. Прочел бы его функцией file(), чтобы потом было удобно обрабатывать данные без лишних телодвижений. Однако, напомню - если этот файл может сильно разростись - использование данной функции потенциально опасно!
2. В файле хранится некоторый текст, который необходимо вывести на HTML-странице. Тут понятно, что проще использовать функцию file_get_contents. Опять же - с оговоркой, что данные выводятся в конце работы скрипта - одним оператором echo. Если данные выводятся постепенно с помощью flush - то стоит брать во внимание размер файла. Возможно, ваш скрипт будет более оптимизирован, если вы будете использовать чтение файла из потока.
3. Файл представляет собой базу данных с текстами для сайтов. Все тексты "выровнены" по одному на строку. Текст предварен служебной информацией, вроде идентификатора новости, идентификатора категории и т.д. В файле необходимо найти строку, содержащую определенную подстроку. В таких случаях стоит использовать только поточную/построковую обработку файла.
И на последок:
Во многих листингах "помощи" и "ответов на просьбы новичков" я не наблюдаю проверок. Например, на существование или доступность для чтения. Очень советую не пренебрегать следующими функциями file_exists($sFileName) - для проверки на существование файла, is_readable($sFileName) для проверки доступности на чтение, is_writeable($sFileName) для проверки доступности файла для записи. Так же может быть полезна функция filesize($sFileName), возвращающая размер файла.
Удачного кодинга
Итак, какими способами можно получить содержимое файла?
1. Функция file_get_contents($sFileName); В качестве аргумента принимает имя файла. Возвращает строку. Наиболее часто советуется новичкам для использования. Однако, никто не говорит им, что размер файла должен быть КАК МИНИМУМ меньше, чем количество оперативной памяти, которое доступно php-скрипту. Если места скрипту не хватит - вы получите сообщение вроде "Fatal error: Allowed memory size of XXX bytes exhausted (tried to allocate YYY bytes)".
2. Функция file($sFileName); В качестве аргумента принимает имя файла, а возвращает массив, элементами которого являются строки исходного файла. Исходя из того, что количество строк и размер файла может быть заранее неизвестны - использование этой функции может быть фатальным для вашего скрипта.
3. Использование чтения файла "в поток". В кратце, алгоритм выглядит так: открывается файл на чтение (fopen($sFileName, $sReadMode)) и читается в цикле блочно, с фиксированным размером буфера (если не используется построчное чтение). Теоретически (да и практически) такой подход является особенно эффективным в плане расходования ресурсов для применения к файлам среднего и большого размера (для себя я установил минимальный порог количества строк в 100 единиц).
Стоит, однако, понимать, что использование третьего метода к небольшим файлам, как минимум, не повредит вашей программе. Если, конечно же, не требуется выполнение специфической задачи.
Рассмотрим несколько примеров, чтобы понять в каких случаях можно применять тот либо иной метод.
1. Файл состоит из 15 строк. В каждой строке содержится 1 наименование товара, который есть в ассортименте Вашего магазина. В данном случае, я бы не стал заморачиваться над чтением файла в поток - честно. Прочел бы его функцией file(), чтобы потом было удобно обрабатывать данные без лишних телодвижений. Однако, напомню - если этот файл может сильно разростись - использование данной функции потенциально опасно!
2. В файле хранится некоторый текст, который необходимо вывести на HTML-странице. Тут понятно, что проще использовать функцию file_get_contents. Опять же - с оговоркой, что данные выводятся в конце работы скрипта - одним оператором echo. Если данные выводятся постепенно с помощью flush - то стоит брать во внимание размер файла. Возможно, ваш скрипт будет более оптимизирован, если вы будете использовать чтение файла из потока.
3. Файл представляет собой базу данных с текстами для сайтов. Все тексты "выровнены" по одному на строку. Текст предварен служебной информацией, вроде идентификатора новости, идентификатора категории и т.д. В файле необходимо найти строку, содержащую определенную подстроку. В таких случаях стоит использовать только поточную/построковую обработку файла.
И на последок:
Во многих листингах "помощи" и "ответов на просьбы новичков" я не наблюдаю проверок. Например, на существование или доступность для чтения. Очень советую не пренебрегать следующими функциями file_exists($sFileName) - для проверки на существование файла, is_readable($sFileName) для проверки доступности на чтение, is_writeable($sFileName) для проверки доступности файла для записи. Так же может быть полезна функция filesize($sFileName), возвращающая размер файла.
Удачного кодинга