Статьи

Работа с файлами в PHP

Возможно, вы хорошо знакомы с базами данных, такими как MySQL и Access, которые являются все более распространенным средством хранения данных. Но данные также хранятся в файлах, таких как документы Word, журналы событий, электронные таблицы, файлы изображений и так далее. Базы данных обычно требуют специального языка запросов для извлечения информации, тогда как файлы являются «плоскими» и обычно отображаются в виде потока текста.

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

Вам также может быть полезно узнать больше о файле, изучив его атрибуты, прежде чем начать работу с ним. Например, существует ли файл? Когда он последний раз обновлялся? Когда он был создан?

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

Атрибуты файла

Атрибуты файла — это свойства файла, например его размер, последний раз, когда к нему обращались, его владелец и т. Д. Давайте посмотрим, как вы узнаете больше о файлах, с которыми вы работаете.

Размер файла

Функция filesize() извлекает размер файла в байтах.

 <?php $f = "C:\Windows\win.ini"; $size = filesize($f); echo $f . " is " . $size . " bytes."; 

При выполнении пример кода отображает:

  C: Windowswin.ini имеет размер 510 байт. 

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

Если файл не существует, функция filesize() вернет false и E_WARNING , поэтому лучше сначала проверить, существует ли файл, используя функцию file_exists() :

 <?php $f = "C:\Windows\win.ini"; if (file_exists($f)) { $size = filesize($f); echo $f . " is " . $size . " bytes."; } else { echo $f . " does not exist."; } 

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

История файлов

Чтобы определить, когда файл последний раз был доступен, изменен или изменен, вы можете использовать следующие функции соответственно: fileatime() , filemtime() и filectime() .

 <?php $dateFormat = "D d MY g:i A"; $atime = fileatime($f); $mtime = filemtime($f); $ctime = filectime($f); echo $f . " was accessed on " . date($dateFormat, $atime) . ".<br>"; echo $f . " was modified on " . date($dateFormat, $mtime) . ".<br>"; echo $f . " was changed on " . date($dateFormat, $ctime) . "."; 

Код здесь извлекает метку времени последнего доступа, изменяет и изменяет даты и отображает их,

 C: Доступ к Windowswin.ini состоялся 14 июля 2009 г., 4:34.
 C: Windowswin.ini был изменен в пт 08 июля 2011 14:03 вечера.
 C: Windowswin.ini был изменен в четверг 14 июля 2009 4:34 утра. 

Для пояснения, filemtime() возвращает время, когда содержимое файла было изменено в последний раз, а filectime() возвращает время, когда информация, связанная с файлом, такая как права доступа или владение файлом, была изменена.

Функция date() использовалась для форматирования метки времени Unix, возвращаемой функциями file*time() . Обратитесь к документации для функции date() для получения дополнительной информации о форматировании.

Файловые права

Перед началом работы с файлом вы можете проверить, доступен ли он для чтения или записи для процесса. Для этого вы будете использовать функции is_readable() и is_writeable() :

 <?php echo $f . (is_readable($f) ? " is" : " is not") . " readable.<br>"; echo $f . (is_writable($f) ? " is" : " is not") . " writeable."; 

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

  C: Windowswin.ini доступен для чтения.
 C: Windowswin.ini недоступен для записи. 

Файл или нет?

Чтобы убедиться, что вы имеете дело с файлом, вы можете использовать is_file() . is_dir() является аналогом, чтобы проверить, является ли это каталогом.

 <?php echo $f . (is_file($f) ? " is" : " is not") . " a file.<br>"; echo $f . (is_dir($f) ? " is" : " is not") . " a directory."; 

Пример кода выводит:

  C: Windowswin.ini - это файл.
 C: Windowswin.ini - это не каталог. 

Чтение файлов

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

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

 <?php $f = "c:\windows\win.ini"; $f1 = file_get_contents($f); echo $f1; 

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

Функция fopen() используется для открытия файла:

 <?php $f = "c:\windows\win.ini"; $f1 = fopen($f, "r"); 

Используя функцию fopen() , нужны два аргумента — файл, который я хочу открыть, и режим, который в данном случае — «r» для чтения. Функция возвращает дескриптор или поток в файл, хранящийся в переменной $f1 , которую вы используете во всех последующих командах при работе с файлом.

Наиболее распространенные значения режима:

table of basic file modes

Для других значений обратитесь к списку на странице PHP fopen() .

Чтобы прочитать из открытого файла одну строку за раз, используйте функцию fgets() :

 <?php $f = "c:\windows\win.ini"; $f1 = fopen($f, "r"); do { echo fgets($f1) . "<br>"; } while (!feof($f1)); fclose($f1); 

Использование цикла do — while — хороший вариант, потому что вы можете заранее не знать, сколько строк в файле. Функция feof() проверяет, достиг ли файл своего конца — цикл продолжается до достижения условия конца файла.

Чтобы привести в порядок после того, как я закончил читать файл, функция fclose() используется, чтобы закрыть файл.

Запись файлов

Два наиболее часто используемых режима записи в файл с использованием функции fwrite() : «w» и «a» — «w» означают, что вы хотите выполнить запись в файл, но он заранее удалит любое существующее содержимое файла, а «a »Означает, что вы будете добавлять любые новые данные к тому, что уже существует в файле. Вы должны быть уверены, что используете правильный вариант!

В этом примере я буду использовать «а» для добавления:

 <?php $file = "add_emp.txt"; $f1 = fopen($file, "a"); $output = "banana" . PHP_EOL; fwrite($f1, $output); $output = "cheese" . PHP_EOL; fwrite($f1, $output); fclose($f1); 

Сначала имя файла присваивается переменной, затем файл открывается в режиме «а» для добавления. Данные для записи присваиваются переменной, $output , и fwrite() добавляет данные в файл. Процесс повторяется, чтобы добавить еще одну строку, затем файл закрывается с помощью fclose() . PHP_EOL константа PHP_EOL добавляет символ новой строки, специфичный для платформы, на которой работает PHP.

Содержимое файла после выполнения вышеуказанного кода должно выглядеть следующим образом:

  банан
 сыр 

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

Вот тот же пример, что и выше, но на этот раз с использованием file_put_contents() :

 <?php $file = "add_emp.txt"; file_put_contents($file, "banana" . PHP_EOL); file_put_contents($file, "cheese" . PHP_EOL, FILE_APPEND); 

Работа с файлами CSV

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

Excel showing a CSV file

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

 <?php $file = "employees.csv"; $f = fopen($file, "r"); 

Теперь мне нужно использовать функцию специально для чтения файла в формате CSV, fgetcsv() ; цикл while используется для учета того факта, что число записей может варьироваться:

 <?php $file = "employees.csv"; $f = fopen($file, "r"); while ($record = fgetcsv($f)) { foreach($record as $field) { echo $field . "<br>"; } } fclose($f); 

Это произведет вывод с полем в каждой строке:

  Фред
 кузнец
 45
 инженер
 Сьюзен
 коричневый
 33
 Программист
 издание
 Williams
 24
 стажер
 Джо
 Эдвардс
 29
 Аналитик 

Давайте рассмотрим цикл. Во-первых, fgetcsv() имеет только один аргумент — дескриптор файла; разделитель запятой предполагается. fgetcsv() возвращает данные в массиве, который затем обрабатывается с помощью цикла foreach . Когда все записи прочитаны, файл закрывается с помощью fclose() .

Давайте теперь посмотрим, как вы можете обновить или записать файл CSV, на этот раз используя функцию fputcsv() . Поскольку я использую тот же файл, что и выше, я открою его в режиме добавления, и данные, которые будут добавлены в файл, определены в массиве.

 <?php $file = "employees.csv"; $f = fopen($file, "a"); $newFields = array( array('Tom', 'Jones', 36, 'Accountant'), array('Freda', 'Williams', 45, 'Analyst'), array('Brenda', 'Collins', 34, 'Engineer')); foreach($newFields as $fields) { fputcsv($f, $fields); } fclose($f); 

Содержимое файла, отображаемое в Excel, теперь выглядит так:

Excel showing a CSV file

Резюме

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

Изображение с помощью Marco Rullkoetter / Shutterstock