В избранное    Домой   

Вторник,  10 Dec 2024 г., 07:58
Братия мои! не многие делайтесь учителями, зная, что мы подвергнемся большему осуждению, ибо все мы много согрешаем. Кто не согрешает в слове, тот человек совершенный, могущий обуздать и все тело. /Иакова (гл.3 ст.1-2)/

 Логин:  

 Пароль: 




Анонсы:
=== Дата: 29/08/2011     Автор: Крис Ньюман ===

PHP. Урок 17 Работа с файловой системой

Урок 17. Работа с файловой системой

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

Управление файлами

Рассмотрим, как PHP позволяет работать с файлами, которые находятся на жестком диске Web-сервера.

Права доступа к файлам

Перед началом работы с файловой системой из PHP рассмотрим установку прав доступа для операционных систем Unix/Linux. Но те же положения справедливы и для других платформ.

Обычно Web-сервер запускается с правами пользователя apache или nobody. Владельцем Web-документов и сценариев PHP будет пользователь, который их создает. Поэтому если Web-сервер не имеет прав доступа на файл, он не сможет с ним работать.

С помощью команды chmod можно установить доступ на чтение для определенного файла всем пользователям. Следующая команда устанавливает флаг чтения (r) для всех пользователей, кроме текущего (o):

$ chmod o+к filename

Можно установить глобальные права на чтение/изменение файла с помощью chmod, как показывается ниже:

$ chmod o+rw filename

C помощью команды man chmod можно получить подробную справку и несколько примеров использования.

Если на файл установлены глобальные права, Web-сервер сможет получить к нему доступ. Но и другие пользователи на этой системе также получат доступ к немую. Суперпользователь сможет сделать это с помощью команды chown:

# chown apache filename

Функция PHP chmod также позволяет менять права файла. На вход нужно подать два аргумента: имя файла и режим. Аргумент "режим" может быть строкой в виде o+rw или числом в виде 0644. Для числового формата нужно ставить ноль спереди.

Использование chmod. Те, кто уже пользовались командой chmod, знают, что можно задать режим доступа в трехзнаковом формате. При работе в системной оболочке предполагается, что на вход chmod подается восьмеричное число, даже если спереди нет нуля. Например, chmod 644 – то же, что и chmod 0644. Но в PHP всегда нужно ставить нуль впереди аргумента прав.

Получение информации о файле

PHP представляет широкий набор функций, которые позволяют получить различную информацию о файле в системе. Самая простая и часто используемая — file_exists. Она позволяет узнать, существует ли файл с заданным в аргументе именем. На выходе функция возвращает true, если существует объект в файловой системе с заданным именем. Это может быть каталог или специальный тип файла. Кроме того, в аргументе можно указать путь, как в примере ниже:

if (file_exists(“/home/chris/myfile”)) {
    echo “Файл существует”;
else {
    echo “Файл не существует”;
}

Есть целый набор функций, которые позволяют узнать атрибуты файла. Они приводятся в табл. 17.1.

Таблица 17.1. Функция для проверки атрибутов файла

Функция Описание
is_executable Проверяет, установлен ли у файла флаг выполнения
is_readable Проверяет, установлен ли у файла флаг чтения
is_writeable Проверяет, установлен ли у файла флаг записи
is_link Проверяет, является ли данный файл символической ссылкой
is_file Проверяет, является ли объект настоящим файлом, а не ссылкой

Другие функции позволяют узнать информацию непосредственно о самом файле. Они риводятся в табл. 17.2.

Таблица 17.2. Функции для поиска информации о файле

Функция Описание
fileatime Возвращает значение последнего доступа к файлу в формате временной метки Unix
filectime Возвращает время создания файла или его последнего изменения
filemtime Возвращает время последнего изменения файла
fileowner Возвращает идентификатор владельца файла
filegroup Возвращает идентификатор группы файла
fileinode Возвращает номер дескриптора файла
fileperms Возвращает права доступа на файл в восьмеричном виде (например, 0644)
filesize Возвращает размер файла в байтах
filetype Возвращает тип файла (возможны варианты: fifo, char, dir, block, link или file)

Перемещение и копирование файлов

Предположим, что есть права на копирование, перенос или удаление файла. Эти операции выполняются, соответственно, с помощью функций: copy, rename и unlink.

Функции copy и rename требуют два аргумента: источник и место копирования, а функция unlink только имя файла.

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

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

Функции basename и dirname позволяют легко узнать имя файла и полный путь. Эти функции позволяют быстро определить имя файла, если оно задается с путем, или путь к файлу, если нужно создать другие файлы в том же месте, где и исходный.

Функция basename возвращает все символы от последней обратной черты до конца строки. А функция dirname возвращает часть строки до последней обратной черты.

Функция realpath требует аргумент "путь" и возвращает абсолютный путь. Таким образом, все символические ссылки изменяются на реальное место в файловой системе. А все ссылки на текущий или родительский каталог в виде . или .. удаляются.

Функция tempnam позволяет легко создать временной файл. На вход нужно подать два аргумента: имя каталога и префикс для названия файла. Префикс является обязательным аргументом, но может быть пустой строкой. Следующее выражение создает временный файл в /tmp без префикса:

$filename =tempnam(“/tmp”, “”);

Чтение и запись файлов

Теперь рассмотрим, как в PHP читать и изменять файлы.

Простые методы для чтения и записи файлов

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

Функция file_get_contents позволяет записать содержимое файла в переменную. Ей нужно передать имя файла с абсолютным или относительным путем. В примере ниже содержимое файла file.txt читается и записывается в переменную $data:

$data = file_get_contents(“file.txt”);

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

Функция file_put_contents позволяет записать содержимое переменной в локальный файл. На вход подается два аргумента: имя файла и данные для записи. В следующем примере содержимое переменной $data записывается в file.txt:

file_put_contents(“file.txt”, $data);

Низкоуровневый доступ к файлу

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

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

fopen

. Функция fopen требует два аргумента: имя файла и режим доступа. Все режимы приводятся в табл. 17.3.

 

Таблица 17.3. Режимы доступа функции fopen

Режим Описание
   
r Открыть только для чтения с начала файла
r+ Открыть для чтения/записи с начала файла
w Открыть только для чтения. Перезаписать старый файл, если он существует
w+ Открыть для записи и чтения. Перезаписать старый файл, если он существует
a Открыть только для чтения и добавить новые данные в конц файла
a+ Открыть для чтения и записи в конце файла

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

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

Функция fread считывает фиксированное количество байт от текущей позиции обработчика файла. На вход нужно подать обработчик файла и количество байт для чтения. Комбинируя цикл и эту функцию, можно прочитать все содержимое файла:

$fp =fopen(“file.txt”, “r”);
while ($chunk = fread($fp, 100)) {
    echo $chunk;
}

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

Функция fgets является альтернативой к fread. Она отличается тем, что за один проход считывается одна строка. Аргумент размера для fgets является необязательным, начиная с PHP 4.3. Таким образом, данные читаются до первого знака перевода или до того, как будет превышен заданный максимальный размер.

В примере ниже используется fgets в цикле и предполагается, что в файле нет строк длиннее 100 символов:

$fp = fopen(“file.txt”, “r”);
while ($line = fgets($fp, 100)) {
    echo$line;
}

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

Завершив работу с обработчиком файла, нужно освободить соответствующие ресурсы с помощью функции fclose:

fclose($fp);

Произвольный доступ к файлу

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

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

$filepos = ftell($fp);

Чтобы переместить указатель файла в определенное место, используется функция fseek. В выражении ниже указатель файла смещается на 100 байт от начала файла с помощью обработчика файла $fp:

fseek($fp);

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

rewind($fp);

Запись с помощью указателя файла

Функции fgets и fread дополняются операциями записи fputs и fwrite. Эти функции идентичны, а символ перевода строки не отличается от других символов при записи в файл.

В примере ниже открывается файл и в него записывается значение текущего времени:

$fp = fopen(“time.txt”, “w”);
fwrite($fp, “Дата изменения ”, . date(“H:i:s”));
fclose($fp);

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

Открыв новый файл time.txt, можно увидеть, что там записано текущее время.

Работа с файлами данных

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

Чтобы прочитать отдельную строчку, можно использовать функцию explode для разделения по запятым. Но такой подход не сработает, если элементы данных в файле CSV содержат запятые. Обычно при экспорте данных из электронной таблицы могут содержать запятые, которые находятся в кавычках. Поэтому нужны более сложные правила для корректной обработки данных.

К счастью, в PHP есть функция fgetcsv. Ее работа напоминает fgets, но на выходе получим массив разделенных запятой значений. Аргумент размера fgetcsv является необязательным, начиная с PHP 5.

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

$fp = fopen(“data.csv”, “r”);
while ($record = fgetcsv($fp, 1000)) {
    echo $record;
}

Чтение CSV-файлов. Функция fgetcsv требует аргумент длины, как и fgets. В предыдущем примере, выбрано произвольное значение 1000. Но нужно точно знать, что самое большое значение меньше аргумента длины.

Есть специальный механизм записи в CSV-файл без кодирования в этот формат. На вход функции fputcsv передается обработчик файла с массивом аргументов, которые она записывает в отформатированном виде в файл.

Третий и четвертый аргументы fputcsv позволяют задать альтернативный разделитель и ограничивающий символы, соответственно. По умолчанию это запятая и символ двойной кавычки.

Работа с URL

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

Оба выражения правильные:

$page = file_get_contents(“http://www.samspublishing.com/”);
$fp = fopen(“http://www.samspublishing.com/”, “r”);

Несмотря на это, нельзя записывать информацию по HTTP-адресу с помощью file_get_contents или fputs.

Работа с каталогами

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

Три функции работают с обработчиком каталога: readdir, rewinddir и closedir. На вход им нужно передать только обработчик каталога.

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

Функция rewinddir сбрасывает позицию обработчика каталога в начало списка файлов, а closedir закрывает обработчик каталога.

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

Резюме

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


<<назад

Погода в Рудне
(Волгоградcкая обл.)

Подробнее >>


Курс валют
на 10 Дек 2024 г.
704 - Вьетнамских донгов
- 1