Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Запись в файлы и чтение файлов с помощью PHP

by
Difficulty:BeginnerLength:MediumLanguages:

Russian (Pусский) translation by Anna Goorikova (you can also view the original English article)

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

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

Проверка наличия файла

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

Самый простой способ проверить, существует ли файл, - использовать функцию PHP file_exists($filename). Он вернет true, если файл или каталог с заданным $filename существует и false в противном случае. Это может быть очевидно, но я хотел бы указать, что $filename не обязательно должно быть именем файла. Это также может быть абсолютный или относительный путь. Например, мы могли бы использовать prime_numbers.txt или science/project/period_table.txt.

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

Другой функцией, которую вы можете использовать для проверки существования файла, является is_file(). В отличие от file_exists(), эта функция возвращает только true, если указанный путь указывает на файл, а не на каталог.

Убедимся, что файл фактически существует

Если код, который вы пишете, выполняет множество операций с файлами в определенном файле, вы можете получить неверные результаты, используя вышеуказанные функции. Это связано с тем, что результаты выполнения файлов file_exists() и is_file() кэшируются для повышения производительности. PHP также кэширует значения, возвращаемые другими функциями файловой системы, такими как filesize(), filemtime() и т. д.

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

Обычно это проблема только в том случае, если к одному и тому же файлу обращаются несколько раз в одном скрипте, чтобы узнать его статус. Кроме того, кэшированные данные очищаются, если вы удаляете файл внутри скрипта с помощью функции unlink(). Это в основном означает, что вы, вероятно, не столкнетесь с какими-либо проблемами, связанными с кешированием, но по-прежнему хорошо знать, что вы можете очистить кеш, если информация устареет или вы получаете неожиданные результаты при попытке получить доступ к информации о файле.

Чтение данных из файла в PHP

Один из самых простых способов чтения данных из файла в PHP - с помощью функции file_get_contents($filename, $use_include_path, $context, $offset, $maxlen). Он просто прочитает весь файл и передаст его вам в виде строки. Все параметры, кроме первого, являются необязательными.

Второй параметр принимает логическое значение, чтобы определить, должен ли он искать файл в местоположении, указанном путем include, который может быть задан с помощью функции set_include_path().

Вы можете использовать третий параметр, чтобы указать набор параметров для уточнения способов доступа к файлам. Вы можете использовать его для указания значений заголовков, таких как Cookies и Host, а также HTTP-метод.

Параметр $offset определяет точку начала чтения исходного файла. Отрицательное значение начнет отсчет с конца. Поддержка отрицательных смещений была добавлена только в PHP 7.1.0. Стоит отметить, что смещение работает только с локальными файлами и не поддерживается для удаленных файлов.

Функция file_get_contents() считывает весь файл сразу по умолчанию. Вы можете изменить это поведение, указав значение параметра $maxlen. Длина символов, подлежащих чтению, подсчитывается из значения смещения.

Эта функция вернет false, если не удалось прочитать данные из указанного файла. Тем не менее, она также может возвращать значения, которые вычисляются как false, поэтому убедитесь, что вы проверяете, действительно ли он вернул false с помощью оператора ===.

Вы можете использовать эту функцию для открытия удаленных файлов, но это было бы возможно, только если значение параметра allow-url-fopen в php.ini true или 1.

Запись данных в файл в PHP

Один из самых простых способов записи данных в файл в PHP - с помощью функции file_put_contents($filename, $data, $flags, $context).

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

Помните, что PHP автоматически создаст файл с заданным именем, если он еще не существует. Однако он не создаст для вас каких-либо каталогов. Это означает, что вы можете сохранить файл с именем On the Origin of Species [Charles Darwin].txt без каких-либо ошибок. Однако установка $filename в Biology/Evolution/On Origin of Species [Charles Darwin] .txt, если Biology/Evolution/ еще не существует, приведет к ошибке.

Параметр $flags определяет, как содержимое будет записано в файл. Он может иметь любое или все из следующих трех значений:

  • FILE_USE_INCLUDE_PATH - Это указывает PHP на поиск имени файла в каталоге include.
  • FILE_APPEND - Это скажет PHP, чтобы добавить данные, которые вы передали функции, к существующим данным в файле. Это может быть полезно, если вы храните данные в файле, таком как журнал или личный дневник. Запись новых данных, таких как температура или события, которые произошли с вами сегодня, не будет перезаписывать то, что вы записали вчера.
  • LOCK_EX - Это скажет PHP, чтобы получить блокировку файла, прежде чем начинать писать в него содержимое. Это может предотвратить непредвиденные события, когда два разных сценария читают или записывают данные в один и тот же файл. С этим конкретным значением вы получите эксклюзивную блокировку файла. Вы можете узнать больше об этих блокировках в документации PHP о функции flock().

Эта функция возвращает количество байтов, которые были записаны в файл с успехом, и false при ошибке. Тем не менее, вы все равно должны использовать строгий оператор равенства, чтобы проверить, было ли успешным запись содержимого в файл. Это потому, что код, который записывает 0 байтов в файл, будет по-прежнему оцениваться как false.

Чтение и запись данных в файлы

Вы можете перейти на сайт Project Gutenberg и попытаться загрузить файлы с помощью функции file_get_contents(). После того, как у вас есть данные в строке, вы также можете просто сохранить их в локальном файле с помощью функции file_put_contents(). В следующем примере это будет ясно:

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

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

Мы преобразовали весь текст в нижний регистр и сделали предположение, что каждое слово разбивается на пробелы. Затем текст преобразуется в массив с помощью метода explode(), чтобы упростить анализ отдельных слов. Удивительно, но слово «эволюция» не используется ни разу во всей книге, которая дала теорию эволюции ее происхождения.

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

Логирование данных с помощью FILE_APPEND

Еще одним полезным примером может быть логирование информации в течение небольших периодов времени. Это может быть ваша тренировка, метеорологические данные или колония пчел, которую вы наблюдаете. После того, как у вас есть данные в строке, вы можете легко сохранить его в файле и добавить его к существующим данным, используя флаг FILE_APPEND с file_put_contents().

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

Вместо того, чтобы писать текст в обычном формате, вы можете обернуть его в некоторый HTML, чтобы упростить чтение в браузерах. Возможности безграничны.

Заключительные мысли

Существует много других способов чтения и записи данных в файлы на PHP. Однако file_get_contents() и file_put_contents() будут решать почти все ваши основные потребности, не добавляя ненужных осложнений.

Единственный раз, когда вы можете столкнуться с проблемой с file_get_contents(), является то, что файл, который вы читаете, очень большой - размером 2ГБ или более. Это связано с тем, что file_get_contents() загружает весь файл в память сразу, и есть хорошие шансы исчерпать память с такими большими файлами. В этом случае вам нужно будет полагаться на такие функции, как fgets() и fread(), чтобы сразу прочитать небольшую часть файла.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.