Анонсы:
|
PHP. Урок 17 Работа с файловой системойУрок 17. Работа с файловой системойВ этом уроке вы узнаете, как работать с файловой системой Web-сервера при помощи PHP, а также научитесь читать и изменять содержимое файлов с помощью сценария. Управление файламиРассмотрим, как PHP позволяет работать с файлами, которые находятся на жестком диске Web-сервера. Права доступа к файламПеред началом работы с файловой системой из PHP рассмотрим установку прав доступа для операционных систем Unix/Linux. Но те же положения справедливы и для других платформ. Обычно Web-сервер запускается с правами пользователя apache или nobody. Владельцем Web-документов и сценариев PHP будет пользователь, который их создает. Поэтому если Web-сервер не имеет прав доступа на файл, он не сможет с ним работать. С помощью команды chmod можно установить доступ на чтение для определенного файла всем пользователям. Следующая команда устанавливает флаг чтения (r) для всех пользователей, кроме текущего (o): Можно установить глобальные права на чтение/изменение файла с помощью chmod, как показывается ниже: C помощью команды man chmod можно получить подробную справку и несколько примеров использования. Если на файл установлены глобальные права, Web-сервер сможет получить к нему доступ. Но и другие пользователи на этой системе также получат доступ к немую. Суперпользователь сможет сделать это с помощью команды chown: Функция PHP chmod также позволяет менять права файла. На вход нужно подать два аргумента: имя файла и режим. Аргумент "режим" может быть строкой в виде o+rw или числом в виде 0644. Для числового формата нужно ставить ноль спереди. Использование chmod. Те, кто уже пользовались командой chmod, знают, что можно задать режим доступа в трехзнаковом формате. При работе в системной оболочке предполагается, что на вход chmod подается восьмеричное число, даже если спереди нет нуля. Например, chmod 644 – то же, что и chmod 0644. Но в PHP всегда нужно ставить нуль впереди аргумента прав. Получение информации о файлеPHP представляет широкий набор функций, которые позволяют получить различную информацию о файле в системе. Самая простая и часто используемая — file_exists. Она позволяет узнать, существует ли файл с заданным в аргументе именем. На выходе функция возвращает true, если существует объект в файловой системе с заданным именем. Это может быть каталог или специальный тип файла. Кроме того, в аргументе можно указать путь, как в примере ниже: Есть целый набор функций, которые позволяют узнать атрибуты файла. Они приводятся в табл. 17.1. Таблица 17.1. Функция для проверки атрибутов файла
Другие функции позволяют узнать информацию непосредственно о самом файле. Они риводятся в табл. 17.2. Таблица 17.2. Функции для поиска информации о файле
Перемещение и копирование файловПредположим, что есть права на копирование, перенос или удаление файла. Эти операции выполняются, соответственно, с помощью функций: copy, rename и unlink. Функции copy и rename требуют два аргумента: источник и место копирования, а функция unlink только имя файла. Путь файла. Нужно осторожно выполнять операции с файлами в PHP, особенно удаление. Всегда нужно знать, в каком каталоге выполняется операция, или задавать полный путь к нужному файлу. Работа с именами файловФункции basename и dirname позволяют легко узнать имя файла и полный путь. Эти функции позволяют быстро определить имя файла, если оно задается с путем, или путь к файлу, если нужно создать другие файлы в том же месте, где и исходный. Функция basename возвращает все символы от последней обратной черты до конца строки. А функция dirname возвращает часть строки до последней обратной черты. Функция realpath требует аргумент "путь" и возвращает абсолютный путь. Таким образом, все символические ссылки изменяются на реальное место в файловой системе. А все ссылки на текущий или родительский каталог в виде . или .. удаляются. Функция tempnam позволяет легко создать временной файл. На вход нужно подать два аргумента: имя каталога и префикс для названия файла. Префикс является обязательным аргументом, но может быть пустой строкой. Следующее выражение создает временный файл в /tmp без префикса: Чтение и запись файловТеперь рассмотрим, как в PHP читать и изменять файлы. Простые методы для чтения и записи файловВ PHP есть специальные высокоуровневые функции. Они позволяют одной командой прочитать содержимое файла или записать туда данные. Функция file_get_contents позволяет записать содержимое файла в переменную. Ей нужно передать имя файла с абсолютным или относительным путем. В примере ниже содержимое файла file.txt читается и записывается в переменную $data: Другой необязательный булев аргумент можно установить в true, чтобы искать файл в дополнительных путях подключения. Функция file_put_contents позволяет записать содержимое переменной в локальный файл. На вход подается два аргумента: имя файла и данные для записи. В следующем примере содержимое переменной $data записывается в file.txt: Низкоуровневый доступ к файлуФункции file_get_contents и file_put_contents являются высокоуровневыми. Они выполняют последовательность операций, которые можно реализовать с помощью низкоуровневых функций PHP. В большинстве случаев нужно просто извлечь данные из файла или записать в него информацию. Но PHP также предоставляет другой гибкий способ для взаимодействия с файловой системой. Доступ к файлу осуществляется с помощью обработчика файлов, который создается функцией fopen . Функция fopen требует два аргумента: имя файла и режим доступа. Все режимы приводятся в табл. 17.3.
Таблица 17.3. Режимы доступа функции fopen
Обработчик файла указывает на позицию в файле. Из табл. 17.3 можно заметить, что при открытии с помощью fopen обработчик всегда указывает на начало или конец файла. При записи или чтении с помощью обработчика его позиция постоянно изменяется и следующее действие начинается уже с новой точки. Рассмотрим пример, где содержимое файла читается по нескольку байт за один раз. Функция fopen с аргументом режима r создает обработчик файла только для чтения, который указывает на начало файла. Функция fread считывает фиксированное количество байт от текущей позиции обработчика файла. На вход нужно подать обработчик файла и количество байт для чтения. Комбинируя цикл и эту функцию, можно прочитать все содержимое файла: Это компактное условие позволяет проверить успешное выполнение fread при каждой итерации цикла. Если данных для чтения больше нет, fread возвращает FALSE. Этот механизм не позволяет установить, было ли прочитано за один раз меньшее количество байт. Функция fgets является альтернативой к fread. Она отличается тем, что за один проход считывается одна строка. Аргумент размера для fgets является необязательным, начиная с PHP 4.3. Таким образом, данные читаются до первого знака перевода или до того, как будет превышен заданный максимальный размер. В примере ниже используется fgets в цикле и предполагается, что в файле нет строк длиннее 100 символов: Обрезка строк. Каждая строчка, прочитанная с помощью fgets заканчивается символом перевода строки. Если нужно исключить его из конечного результата, следует использовать функцию rtrim. Она удаляет разделительные символы в конце строки, включая перевод строки и табуляцию. Завершив работу с обработчиком файла, нужно освободить соответствующие ресурсы с помощью функции fclose: Произвольный доступ к файлуУказатель файла может двигаться не только последовательно, но и перемещаться на любую позицию, пока открыт обработчик файла. Чтобы узнать текущую позицию указателя файла, можно воспользоваться функцией ftell. На выходе получим количество байт от начала файла: Чтобы переместить указатель файла в определенное место, используется функция fseek. В выражении ниже указатель файла смещается на 100 байт от начала файла с помощью обработчика файла $fp: Обычно нужно перевести указатель файла в его начало. Это можно сделать с помощью fseek, но лучше использовать специальную функцию rewind: Запись с помощью указателя файлаФункции fgets и fread дополняются операциями записи fputs и fwrite. Эти функции идентичны, а символ перевода строки не отличается от других символов при записи в файл. В примере ниже открывается файл и в него записывается значение текущего времени: Нужно помнить, что пользователь apache должен иметь право на запись в каталог, чтобы создать новый файл. Открыв новый файл time.txt, можно увидеть, что там записано текущее время. Работа с файлами данныхЧасто операции с файловой системой используются для того, чтобы извлечь данные из файла с определенной структурой и обработать их в сценарии. В самом простом варианте значения разделяются запятой (CSV-формат). Чтобы прочитать отдельную строчку, можно использовать функцию explode для разделения по запятым. Но такой подход не сработает, если элементы данных в файле CSV содержат запятые. Обычно при экспорте данных из электронной таблицы могут содержать запятые, которые находятся в кавычках. Поэтому нужны более сложные правила для корректной обработки данных. К счастью, в PHP есть функция fgetcsv. Ее работа напоминает fgets, но на выходе получим массив разделенных запятой значений. Аргумент размера fgetcsv является необязательным, начиная с PHP 5. Часто первая строка CSV-файла содержит названия столбцов. Если такое случается, нужно удалить эту строку перед началом обработки данных. В следующем примере читается содержимое разделенного запятой файла и выводятся все записи на экран с помощью print_r: Чтение CSV-файлов. Функция fgetcsv требует аргумент длины, как и fgets. В предыдущем примере, выбрано произвольное значение 1000. Но нужно точно знать, что самое большое значение меньше аргумента длины. Есть специальный механизм записи в CSV-файл без кодирования в этот формат. На вход функции fputcsv передается обработчик файла с массивом аргументов, которые она записывает в отформатированном виде в файл. Третий и четвертый аргументы fputcsv позволяют задать альтернативный разделитель и ограничивающий символы, соответственно. По умолчанию это запятая и символ двойной кавычки. Работа с URLВ PHP есть мощный механизм, который позволяет работать с удаленными файлами так же, как и с локальными. Таким образом, можно открыть обработчик файла или использовать высокоуровневые функции работы с файлами. При этом путь задается в виде URL. Это позволяет прочитать содержимое Web-страницы из сценария PHP. Оба выражения правильные: Несмотря на это, нельзя записывать информацию по HTTP-адресу с помощью file_get_contents или fputs. Работа с каталогамиТак же , как fopen создает обработчик для файла, с помощью функции opendir можно создать обработчик для каталога, чтобы получить его содержимое. Три функции работают с обработчиком каталога: readdir, rewinddir и closedir. На вход им нужно передать только обработчик каталога. При очередном вызове readdir на выходе получим следующий файл в заданном каталоге. Порядок, в котором они извлекаются, зависит от порядка расположения в файловой системе и не может быть изменен. Специальные обозначения . и .. (текущий и родительский каталоги) также возвращаются этой функцией. Функция rewinddir сбрасывает позицию обработчика каталога в начало списка файлов, а closedir закрывает обработчик каталога. С помощью функции getcwd можно получить название текущего рабочего каталога. Она не требует аргументов и возвращает полный путь к текущему каталогу. Рабочий каталог можно изменить с помощью функции chdir, а аргумент пути передать в полном или относительном виде. РезюмеВ этом уроке вы научились читать и записывать файлы на жесткий диск Web-сервера. В следующем уроке мы рассмотрим, как выполнять команды сервера из PHP. |
Погода в Рудне на 10 Дек 2024 г. 704 - Вьетнамских донгов - 1 |