PHP-4 Эффективная работа


Интерфейс с файловой системой
Проверка отдельных характеристик файлов
Операции с содержимым файлов
Операции с конвейерами
Специальные и необычные функции

Важную роль в любой системе программирования играют средства взаимодействия с внешней файловой системой. И поскольку РНР представляет собой полноценный язык программирования, в нем также предусмотрены средства для работы с внешними файлами. Но есть в РНР и очень важная особенность: в качестве файлов могут выступать не только файлы локальной машины (например, той, на которой установлен WWW-сервер), но и, вообще говоря, произвольные URL-ресурсы.

В этой главе мы детально разберем возможности, предоставляемые РНР-машиной для работы с файлами, и посмотрим, как эти возможности применить на практике. Изложение в главе построено следующим образом. В разделе 10.1 рассматриваются функции, которые оперируют с файлом «одним кусочком», то есть работают с именами, правами доступа к файлу и т. д., не затрагивая их внутреннего содержимого. Затем, в разделе 10.3, мы перейдем к рассмотрению методов работы с содержимым файла. Остальные разделы в этой главе посвящены функциям, которые используются реже, но, тем не менее, являются мощным средством в руках знающего о них программиста.

10.1. Интерфейс с файловой системой

10.1.1. Выделение имени файла: basename

string basename (string path)

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

примечание
       Мученики Windows! При работе в этой среде вы можете использовать для разделения фрагментов путевого имени как /, так и\. В остальных операционных системах используется только /.

Вот пример использования этой функции:
$path = "/home/httpd/html/index.php";
$file = basename ($path);
В результате выполнения этого фрагмента переменная $file получит значение, равное index.php.
См. также описание di rnameQ (раздел 10.1.8).

10.1.2. Изменение групповой принадлежности:chgrp

int chgrp (string filename, mixed group)

Функция производит попытку изменить группу, к которой принадлежит flename, на группу group. Произвольное изменение группы разрешается только суперпользователю, но я не могу представить себе ситуацию, в которой администратор системы использует web-интерфейс для доступа к подконтрольной машине.

Что касается обычных пользователей, то они могут работать только с теми группами, членами которых они являются [2].

Функция возвращает true при успешном завершении и false — при ошибке. См. также описания chown () (раздел 10.1.4) и chmod() (раздел 10.1.3).

прмечание
       В РНР для Windows эта функция не работает.

10.1.3. Модификация прав доступа: chmod

int chmod (string filename, int mode)

Функция предпринимает попытку изменить права доступа указанного файла на значение аргумента mode.

В отличие от командной строки UNIX (команда chmod) PHP-машина не считает, что аргумент передается в восьмеричной системе счисления, а кроме того, вы не можете использовать привычные строковые обозначения, такие например, как «g+w». Если же вы предпочитаете использовать числовое обозначение прав доступа, не забывайте приписывать перед началом восьмеричной маски 0, который заставляет РНР интерпретировать число как восьмеричное.

Вот несколько примеров использования этой функции:
// Десятичное число - это явно ошибочная строка
chmod ("/somedir/somefile", 755);

// Строка вместо числовой маски - тоже недопустимо
chmod ("/somedir/somefile", "u+rwx,go+rx");

// А вот так правильно!
chmod ("/somedir/somefile", 0755);

В случае успешного завершения функция возвращает true, а в противном случае — false.

примечание
       В РНР для Windows эта функция не работает.

10.1.4. Смена владельца файла: chown

int chown (string filename, mixed user)

Функция производит попытку изменить владельца файла filename на user. Право на такую операцию имеет только суперпользователь.

В случае успешного завершения функция возвращает true, а в противном случае — false.

примечание
       В РНР для Windows эта функция не работает.

10.1.5. Очистка файлового кэша: clearstatcache

void clearstatcache ()

В большинстве операционных систем вызовы stat или ls tat требуют довольно приличных вычислительных ресурсов, поэтому результат последнего такого вызова обычно запоминается в специальной области памяти с целью последующего использования при обращении к обработанным этими функциями файлам. Если же вы хотите принудительно провести новую проверку состояния файловой системы (например, вас интересует изменение размера файла или проверка, не был ли файл удален другим процессом), то можете использовать данную функцию для сброса результатов последнего вызова last и инициализации новой проверки состояния файла.

Эффект от выполнения этой функции сохраняется только до очередного запроса. К числу функций, на которые оказывает влияние эта функция, относятся: stat () (раздел 10.5.5), l stat () (раздел 10.5.6), f i le_exi sts () (раздел 10.2.1), i s_wri table() (раздел 10.2.16), is_readable () (раздел 10.2.15), i s_executable () (раздел 10.2.12), is_file() (раздел 10.2.13), is_dir() (раздел 10.2.11), is_link() (раздел 10.2.14), filectime() (раздел 10.2.3),fileatime (раздел 10.2.2),filemtime() (раздел 10.2.6), f i lei node () (раздел 10.2.5), f ilegroup() (раздел 10.2.4), fileowner() (раздел 10.2.7), fi1еsize()(раздел10.2.9),filetуре() (раздел10.2.10)и fileperms()(раздел10.2.8).

10.1.6. Копирование файла: copy

int copy (string source, string dest)

Функция производит копирование файла. В случае успешного завершения возвращает true, а при ошибке — false. Имейте в виду, что при работе в ОС UNIX должны быть соблюдены права доступа как к файлу-источнику, так и к приемнику данных:

if (!copy($file, $file.'.bak')) {
       print ("He удалось создать резервную копию $filе...
\n") ;
}
См. также rename () (раздел 10.1.14).

10.1.7. Удаление файла: delete

void delete (string file) Такой функции в PHP нет!

примечание
       А зачем тогда автор включил в книгу этот раздел? Все очень просто. Начинающие пользователи РНР неизбежно будут искать функцию удаления именно под этим именем. И эта маленькая закладочка позволит сэкономить время при решении проблемы.

Если вам необходимо удалить файл, вы должны воспользоваться либо unlink() (раздел 10.5.11), либо функцией unset (), которая просто удаляет значение пере- менной, устанавливая ей «неопределенное значение».

10.1.8. Имя каталога: dirname

string dirname (string path)

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

10.1.9. Свободное пространство: diskfreespace

float diskfreespace (string directory)

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

$df = diskf reespace("/") ;

переменная $df содержит размер свободной области файловой системы, смонтированной как / (корневая файловая система UNIX).

10.1.10. Размер каталога: disk_total_space

float disk_total_space (string directory)

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

Вот пример использования этой функции:
$df = disk_total_space("/");

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

10.1.11. Создание каталога: mkdir

int mkdir (string pathname, int mode)

Функция пытается создать каталог, путевое имя которого задано аргументом pathname. Традиционно режим доступа к создаваемому каталогу задается с помощью восьмеричного числа. Поэтому не забывайте добавлять к нему ведущий нуль: mkdir ("/path/to/my/dir", 0700);

При успешном завершении функция возвращает true, а при возникновении ошиб- ки — false.

10.1.12. Перенос загруженных файлов:move_uploaded_file

bool move_uploaded_file (string filename, string destination)

Функция пытается убедиться, что файл fi1 ename был загружен из сети через HTTP POST. В этом случае производится его перемещение в файл, имя которого задано аргументом desti nation.

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

См. также описание is_uploaded_f ile() (раздел 10.2.17) и раздел 15.4.

10.1.13. Информация о путевом имени: pathinfo

array pathinfo (string path)

Функция возвращает ассоциативный массив, содержащий информацию о заданном путевом имени path. Массив содержит три элемента: dirname, basename и extension.

Следующий фрагмент:
<?php

$path_parts = pathinfo("/www/htdocs/index.html") ;

echo $path_parts["dirname"] . "\n";
echo $path_parts ["basename"] . "\n";
echo $path_parts ["extension"] . "\n";

приведет к выводу на экран:
/www/htdocs
index.html
html

См. также описание di rname() (раздел 10.1.8),basename() (раздел 10.1. 1) и realpath() (раздел 10.1.5).

10.1.14. Переименование файла: rename

int rename (string oldname, string newname)

Функция пытается переименовать файл oldname в newname. В случае успеха возвращает true, а при возникновении ошибки — false.

10.1.15. Выделение путевого имени: realpath

string realpath (string path)

Функция realpath () корректно следует по всем символьным ссылкам, которых может быть и несколько, а также обрабатывает ссылки на текущий и родительский каталоги (/./, /../) и лишние символы / во входном имени файла. Результатом работы функции является канонизированное имя файла (каталога), из которого исключены символьные ссылки, а также компоненты /./ и /../.

Используется функция достаточно просто:
$real_path = realpath ("../.. /index. php") ;

10.1.16. Удаление каталога: rmdir

int rmdir (string dirname)

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

назад
далее

Сайт управляется системой uCoz