Windows. Вирусы. Ноутбуки. Интернет. Office. Утилиты. Драйверы

У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта!

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

Работа с файлами - важный инструмент PHP.

Включение внешних файлов

В каждый PHP-документ можно включить файл с помощью инструкции include() . Её аргумент: путь к файлу. Этой инструкцией удобно пользоваться при наличии одинаковых кусков кода во многих PHP-программах. Содержимое включаемого файла обрабатывается как простой HTML-текст. Для того, чтобы содержимое этого файла обрабатывалось как PHP-программа, нужно обрамлять его открывающим и закрывающим тегами PHP.

Пример 1

Использование include() ...Основная часть..."; ?>

Echo "

...Общее приветствие...

"

РЕЗУЛЬТАТ ПРИМЕРА 1:

...Общее приветствие...

...Основная часть...

В данном случае результат будет тем же, если включаемый файл top.php содержит только строку HTML-текста:

...Общее приветствие...

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

Пример 2

Использование инструкции include(), возвращающей значение Включаемый файл вернул $res"; ?>

Включаемый файл top.php с PHP-программой:

РЕЗУЛЬТАТ ПРИМЕРА 2:

Включаемый файл вернул 56

Инструкцию include() можно использовать внутри цикла. В цикле include() выполняется при каждой итерации. Это можно использовать для включения нескольких файлов. Например:

For ($i=1; $i<=5; $i++) include("incfile{$i}.htm");

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

Оператор include() также можно включать в тело условного оператора.

Несмотря на сходство по внешнему виду с функцией, include() функцией не является, а представляет собой специальную конструкцию языка.

Для указания что файл нужно подключать только один раз используется оператор include_once()

Анализ файлов

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

  • file_exists() - определяет существование файла. Например: if (!file_exists("aaa.php")) echo "Внимание! Файл aaa.php не найден!";
  • is_file() - определяет, является ли исследуемый объект файлом. Например: if (is_file("bbb.txt")) echo "Можете не сомневаться, bbb.txt - это файл";
  • is_dir() - определяет, является ли исследуемый объект каталогом. Например: if (is_dir("/tmp")) echo "Действительно, /tmp - это каталог";
  • is_readable() - определяет, доступен ли файл для чтения. Например: if (is_readable("db.dbf")) echo "db.dbf можно читать";
  • is_writable() - определяет, доступен ли файл для записи. Например: if (is_writable("db.dbf")) echo "В db.dbf писать можно";
  • filesize() - определяет размер файла в байтах.
  • filemtime() - определяет дату и время последнего изменения файла.
  • fileatime() - определяет дату и время последнего обращения к файлу.

Пример 3

Информация о файле "; echo "$f - ".(is_dir($f) ? "" : "не ")."каталог
"; echo "$f ".(is_readable($f) ? "" : "не ")."доступен для чтения
"; echo "$f ".(is_writable($f) ? "" : "не ")."доступен для записи
"; echo "размер $f в байтах - ".(filesize($f))."
"; echo "последнее изменение $f - ".(date("d M Y H:i", filemtime($f)))."
"; echo "последнее обращение к $f - ".(date("d M Y H:i", fileatime($f)))."
"; } ?>

РЕЗУЛЬТАТ ПРИМЕРА 3:

Top.php - файл top.php - не каталог top.php доступен для чтения top.php доступен для записи размер top.php в байтах - 732 последнее изменение top.php - 04 Oct 2005 20:21 последнее обращение к top.php - 20 Oct 2005 14:01

Внимание! С удаленными файлами эти функции не работают. Их можно применять только к локальной файловой системе.

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

PHP содержит множество функций управления файлами. Наиболее употребимыми являются:

  • touch() - создает пустой файл с заданным именем. Если такой файл уже существует, то функция изменит дату модификации. Например: touch("ex1.txt");
  • copy() - копирует файл. Для копирования файлов в php применяется функция copy ($source, $result). Ей нужно передать лишь два параметра - источник $source и имя файла-копии - $result. Стоит отметить, что следует указывать полные адреса к файлам. Пример применения функции copy:

  • unlink() - удаляет заданный файл. Например:
  • fopen() - открывает локальный или удаленный файл и возвращает указатель на него. Указатель используется во всех операциях с содержимым файла. Аргументы: имя файла и режим открытия.
    r чтение. Указатель файла устанавливается на его начало
    r+ чтение и запись. Указатель файла устанавливается на его начало
    w запись. Указатель файла устанавливается на его начало. Все старое содержимое файла теряется. Если файл с указанным именем не существует, функция пытается его создать
    w+ чтение и запись. Указатель файла устанавливается на его начало. Все старое содержимое файла теряется. Если файл с указанным именем не существует, функция пытается его создать
    a запись. Указатель файла устанавливается на его конец. Если файл с указанным именем не существует, функция пытается его создать
    a+ чтение и запись. Указатель файла устанавливается на его конец. Если файл с указанным именем не существует, функция пытается его создать

    Например:

    $fp = fopen("http://www.php.net/", "r"); // для чтения $fp = fopen("ex1.txt", "w"); // для записи $fp = fopen("ex2.txt", "a"); // для добавления в конец

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

    $fp = fopen("ex1.txt", "w") or die ("Не удалось открыть файл");

  • fclose() - закрывает файл. Аргумент: указатель файла, полученный ранее от функции fopen() . Например: fclose($fp);
  • feof() - проверка конца файла. Аргумент: указатель файла.
  • fgetc() - чтение очередного символа из файла. Аргумент: указатель файла.
  • fgets() - чтение очередной строки файла. Аргументы: указатель файла и длина считываемой строки. Операция прекращается либо после считывания указанного количества символов, либо после обнаружения конца строки или файла.

    Пример 4

    Чтение строк из файла "; ?>
  • fread() - общая функция чтения из файла. Аргументы: указатель файла и количество считываемых символов.
  • fseek() - отступ от начала файла. Аргументы: указатель файла и смещение.

    Пример 5

    Вывод на экран второй половины файла
  • fputs() - запись строки в файл. Аргументы: указатель файла и строка.
  • fwrite() - полный аналог функции fputs() .

    Пример 6

    Запись и добавление в файл
  • flock() - блокирует файл, т.е. не позволяет другим пользователям читать этот файл или писать в него, пока тот, кто наложил блокировку не закончит работу с данным файлом. Аргументы: указатель файла и номер режима блокировки.

    Пример 7

    Блокировка файла

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

В PHP версии >= 4.3.0 появились новые удобные функции работы с файлами:

  • file_get_contents() - прочитать весь файл или URL
  • file_put_contents() - записать файл

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

В PHP есть несколько функций для работы с каталогами:

  • mkdir() - создание каталога. Аргументы: путевое имя каталога и режим доступа. Режим доступа - восьмеричное число из трех цифр с ведущим нулем. Первая цифра - право доступа для владельца, вторая - для группы, третья - для всех остальных. В системе Windows режим доступа игнорируется. В системе UNIX определены следующие права доступа:

    Например, право полного доступа для владельца, чтения и запуска для группы и запуска для всех остальных:

    Mkdir("testdir", 0751);

  • rmdir() - удаление каталога. Аргумент: путевое имя каталога. Удалить можно лишь пустой каталог при наличии права на это. При успешном выполнении функция возвращает true .
  • opendir() - открытие каталога. Аргумент: путевое имя каталога. В случае возникновения ошибки функция возвращает false . Ошибка при открытии может быть вызвана тем, что каталог не существует или программа не имеет права его читать.
  • readdir() - чтение каталога. Аргумент: путевое имя каталога. Возвращает строку, содержащую имя найденного файла или подкаталога. По достижении конца каталога функция возвращает false .

    Пример 8

    Чтение каталога "; ?>

    Проверочное выражение цикла сработает не так, как хотелось бы, если в каталоге есть файл с именем "0". В таком случае имя "0" будет преобразовано в 0, что вызовет завершение цикла. Избежать подобного можно, если принять дополнительные меры безопасности, изменив проверочное выражение:

    Gettype($f = readdir($dh)) != "boolean"

    Помимо использования функция fgetc() fgets() fgetss(), Вы можете использовать
    $file = file($filename). Она читает $filename в массив($file).

    Пример:

    $file=file($filename); for ($i=0; $i<=count($file); $i++) { echo $file[$i], "
    "; }

Передача файла с сервера. Скачать файл. DownLoad.

Ручной Download, или как скриптом открыть пользователю окошко сохранения файла. Чтобы в браузере открылся диалог "Сохранить файл" с названием файла file.dat, скрипт должен послать такие заголовки:

Header("Content-Disposition: attachment; filename=file.dat"); header("Content-Type: application/x-force-download; name=\"file.dat\"");

Готовый пример отправки файла с диска:

Не мешало бы также ссылаться на скрипт как http://.../download.php?file.dat, иначе браузеры, основанные на Mozilla, могут попытаться записать файл как file.dat.php. или указать атрибут download: Скачать Примечание: Не используйте заголовок header("Cache-Control: no-cache") в таких скриптах, большинство версий Internet Explorer не смогут скачать файл.

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

Предполагается, что $cd - путь к файлу, $fn - имя файла Как передать файл на сервер?

Функции для работы с каталогами

  • chdir() - Сменить каталог
  • boolean chdir (string str)

    Изменяет текущий каталог PHP на указанный в качестве параметра str. Возвращает TRUE в случае успешного завершения, FALSE в случае возникновения ошибки

  • chroot() - Сменить корневой каталог
  • boolean chroot (string str)

    Изменяет корневой каталог текущего процесса на переданный в качестве параметра str. Возвращает TRUE в случае успешного завершения, FALSE в случае возникновения ошибки..

    Замечание: Для Windows-платформ эта функция не реализована.

  • closedir() - Освободить дескриптор каталога
  • void closedir (resourse catalog)

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

    dir - Класс directory

class dir { dir (string str) string path resource handle string read (void) void rewind (void) void close (void) }

Псевдо-объектно-ориентированный механизм для чтения каталога, переданного в параметре каталог. С момента открытия каталога становятся доступными два свойства класса. Свойство "handle" может быть использовано с другими функциями для работы с каталогами, например, с функциями readdir() , rewinddir() и closedir() . Свойство "path" содержит путь к открытому каталогу. Доступны три метода: read, rewind and close.

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

Пример кода:

handle."
\n"; echo "Путь: ".$d->path."
\n"; while (false !== ($entry = $d->read())) { echo $entry."
\n"; } $d->close(); ?>

Замечание: Порядок, в котором метод "read" возвращает элементы каталога, зависит от операционной системы.

Замечание: Также, PHP автоматически определяет внутренний класс Directory, что означает, что вы не сможете определять собственные классы с таким же именем.


  • getcwd() - Получить имя текущего рабочего каталога
  • string getcwd (void)

    Возвращает имя текущего рабочего каталога.


  • opendir() - Открыть каталог
  • resourse opendir (string path)

    Возвращает дескриптор каталога для последующего использования с функциями closedir(), readdir() и rewinddir().

    Если путь не существует или каталог, расположенный по указанному пути, не может быть открыт вследствие правовых ограничений или ошибок файловой системы, функция opendir() возвращает значение FALSE и генерирует сообщение PHP об ошибке уровня E_WARNING. Вы можете запретить вывод сообщения об ошибке, предварив имя функции opendir() символом "@".

    Пример кода

    Начиная с версии PHP 4.3.0, параметр путь может также являться любым URL"ом, обращение к которому приводит к получению списка его файлов и каталогов. Однако, данный способ работает только при использовании url-упаковщика file://. В версии PHP 5.0.0 была добавлена поддержка url-упаковщика ftp://.


  • readdir - Получить элемент каталога по его дескриптору
  • string readdir (resource catalog)

    Возвращает имя следующего по порядку элемента каталога. Имена элементов возвращаются в порядке, зависящем от файловой системы.

    Обратите внимание на способ проверки значения, возвращаемого функцией readdir() в приведенном ниже примере. В этом примере осуществляется проверка значения на идентичность (выражения идентичны, когда они равны и являются значениями одного типа - за более подробной информацией обратитесь к главе Операторы сравнения) значению FALSE, поскольку в ином случае, любой элемент каталога, чье имя может быть выражено как FALSE, остановит цикл (например, элемент с именем "0").

    Пример кода

    Обратите внимание, что функция readdir() также возвращает элементы с именами, и, если вы не хотите получать эти значения, просто отбрасывайте их:

    Пример кода


  • rewinddir() - Сбросить дескриптор каталога
  • void rewinddir (resource catalog)

    Сбрасывает поток каталога, переданный в параметре catalog таким образом, чтобы тот указывал на начало каталога


  • scandir() - Получить список файлов и каталогов, расположенных по указанному пути
  • array scandir (string catalog [, int order])

    Возвращает массив, содержащий имена файлов и каталогов, расположенных по пути, переданном в параметре catalog. Если каталог не является таковым, функция возвращает логическое значение FALSE и генерирует сообщение об ошибке уровня E_WARNING.

    По умолчанию, сортировка производится в алфавитном порядке по возрастанию. Если указан необязательный параметр order (равен 1), сортировка производится в алфавитном порядке по убыванию. Пример кода

    Результатом будет нечто вроде:

    Array ( => . => .. => bar.php => foo.txt => somedir) Array ( => somedir => foo.txt => bar.php => .. => .)

    Пример кода

    РЕЗУЛЬТАТ ПРИМЕРА:

    Array ( => . => .. => bar.php => foo.txt => somedir) Array ( => somedir => foo.txt => bar.php => .. => .)

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

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

    Открыть текстовый файл

    Для открытия текстового файла используем функцию fopen . Вот её синтаксис:

    Fopen(filename, mode )

    Filename Имя открываемого файла. mode Mode/Режим может быть "r" (reading/чтение), "w" (writing/запись) или "a" (appending/присоединение). В этом уроке мы будем только читать из файла и, соответственно, используем "r". В следующем уроке мы научимся записывать и присоединять текст.

    Примеры этого урока используют файл unitednations.txt . Это простой список программ и фондов ООН и их доменов. Можете загрузить этот файл или создать свой и использовать его в примерах.

    Сначала попробуем открыть unitednations.txt:

    // Открыть текстовый файл // Закрыть текстовый файл fclose($f); ?>

    Пример 1: Чтение строки из текстового файла

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

    Для получения информации из каждой строки используем массив. См. в Уроке 8 о массивах.

    Чтение из текстовых файлов $f = fopen("unitednations.txt", "r"); // Читать построчно до конца файла while (!feof($f)) { // Создать массив с запятой-разделителем $arrM = explode(",",fgets($f)); // Записать ссылки (получить данные из массива) echo "

  • " . $arrM. "
  • "; } fclose($f); ?>

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

    В следующем уроке мы мы посмотрим, как записать в текстовый файл.

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

    file_exists() и is_file().

    Функция f ilе_ехists () проверяет, существует ли заданный файл. Если файл существует, функция возвращает TRUE, в противном случае возвращается FALSE. Синтаксис функции file_exists():

    bool file_exists(string файл)

    Пример проверки существования файла:

    if (! file_exists ($filename)) :

    print "File $filename does not exist!";

    is_file()

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

    bool is_file(string файл)

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

    $file = "somefile.txt";

    if (is_file($file)) :

    print "The file $file is valid and exists!";

    print "The file $file does not exist or it is not a valid file!";

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

    Функция filesize() возвращает размер (в байтах) файла с заданным именем или FALSE в случае ошибки. Синтаксис функции filesize():

    int filesize(string имя_файла)

    Предположим, вы хотите определить размер файла pastry.txt. Для получения нужной информации можно воспользоваться функцией filesize():

    $fs = filesize("pastry.txt"); print "Pastry.txt is $fs bytes.";

    Выводится следующий результат:

    Pastry.txt is 179 bytes.

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

    Открытие и закрытие файлов

    Прежде чем выполнять операции ввода/вывода с файлом, необходимо открыть его функцией fopen().

    Функция fopen() открывает файл (если он существует) и возвращает целое число -- так называемый файловый манипулятор (file handle). Синтаксис функции fopen():

    int fopen (string файл, string режим [, int включение_пути])

    Открываемый файл может находиться в локальной файловой системе, существовать в виде стандартного потока ввода/вывода или представлять файл в удаленной системе, принимаемой средствами HTTP или FTP.

    Параметр файл может задаваться в нескольких формах, перечисленных ниже:

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

    Если параметр задан в виде php://stdin, php://stdout или php://stderr, открывается соответствующий стандартный поток ввода/вывода.

    Если параметр начинается с префикса http://, функция открывает подключение HTTP к серверу и возвращает манипулятор для указанного файла.

    Если параметр начинается с префикса ftp://, функция открывает подключение FTP к серверу и возвращает манипулятор для указанного файла. В этом случае следует обратить особое внимание на два обстоятельства: если сервер не поддерживает пассивный режим FTP, вызов fopen() завершается неудачей. Более того, FTP-файлы открываются либо для чтения, либо для записи.

    При работе в пассивном режиме сервер ЯР ожидает подключения со стороны клиентов. При работе в активном режиме сервер сам устанавливает соединение с клиентом. По умолчанию обычно используется активный режим.

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

    Таблица 7.1. Режимы открытия файла

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

    Если необязательный третий параметр включение_пути равен 1, то путь к файлу определяется по отношению к каталогу включаемых файлов, указанному в файле php.ini (см. главу 1).

    Ниже приведен пример открытия файла функцией fopen(). Вызов die(), используемый в сочетании с fopen(), обеспечивает вывод сообщения об ошибке в том случае, если открыть файл не удастся:

    $file = "userdata.txt"; // Некоторый файл

    $fh = fopen($file, "a+") or die("File ($file) does not exist!");

    Следующий фрагмент открывает подключение к сайту PHP (http://www.php.net):

    $site = "http://www.php.net": // Сервер, доступный через HTTP

    $sh = fopen($site., "r"); //Связать манипулятор с индексной страницей Php.net

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

    Функция fclose() закрывает файл с заданным манипулятором. При успешном закрытии возвращается TRUE, при неудаче -- FALSE. Синтаксис функции fclose():

    int fclose(int манипулятор)

    Функция fclose() успешно закрывает только те файлы, которые были ранее открыты функциями fopen() или fsockopen(). Пример закрытия файла:

    $file = "userdata.txt";

    if (file_exists($file)) :

    $fh = fopen($file, "r");

    // Выполнить операции с файлом

    print "File Sfile does not exist!";

    Запись в файл

    С открытыми файлами выполняются две основные операции -- чтение и запись.

    Функция is_writeable() позволяет убедиться в том, что файл существует и для него разрешена операция записи. Возможность записи проверяется как для файла, так и для каталога. Синтаксис функции is_writeable():

    bool is_writeable (string файл)

    Одно важное обстоятельство: скорее всего, PHP будет работать под идентификатором пользователя, используемым web-сервером (как правило, «nobody»). Пример использования is_writeable() приведен в описании функции fwrite().

    Функция fwrite() записывает содержимое строковой переменной в файл, заданный файловым манипулятором. Синтаксис функции fwrite():

    int fwrite(int манипулятор, string переменная [, int длина])

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

    // Информация о трафике на пользовательском сайте

    $data = "08:13:00|12:37:12|208.247.106.187|Win98";

    $filename = "somefile.txt";

    // Если файл существует и в него возможна запись

    if (is_writeable($filename)) :

    $fh = fopen($filename, "a+");

    // Записать содержимое $data в файл

    $ success - fwrite($fh, $data);

    // Закрыть файл

    fclose($fh); else:

    print "Could not open Sfilename for writing";

    Функция fputs() является псевдонимом fwrite() и может использоваться всюду, где используется fwrite().

    Функция fputs() является псевдонимом fwrite() и имеет точно такой же синтаксис. Синтаксис функции fputs():

    int fputs(int манипулятор, string переменная [, int длина])

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

    Чтение из файла

    Несомненно, чтение является самой главной операцией, выполняемой с файлами. Ниже описаны некоторые функции, повышающие эффективность чтения из файла. Синтаксис этих функций практически точно копирует синтаксис аналогичных функций записи.

    Функция i s_readable() позволяет убедиться в том, что файл существует и для него разрешена операция чтения. Возможность чтения проверяется как для файла, так и для каталога. Синтаксис функции is_readable():

    boo! is_readable (string файл]

    Скорее всего, PHP будет работать под идентификатором пользователя, используемым web-сервером (как правило, «nobody»), поэтому для того чтобы функция is_readable() возвращала TRUE, чтение из файла должно быть разрешено всем желающим. Следующий пример показывает, как убедиться в том, что файл существует и доступен для чтения:

    if (is_readable($filename)) :

    // Открыть файл и установить указатель текущей позиции в конец файла

    $fh = fopen($filename, "r");

    print "$filename is not readable!";

    Функция fread() читает из файла, заданного файловым манипулятором, заданное количество байт. Синтаксис функции fwrite():

    int fread(int манипулятор, int длина)

    Манипулятор должен ссылаться на открытый файл, доступный для чтения (см. описание функции is_readable()). Чтение прекращается после прочтения заданного количества байт или при достижении конца файла. Рассмотрим текстовый файл pastry.txt, приведенный в листинге 7.1. Чтение и вывод этого файла в браузере осуществляется следующим фрагментом:

    $fh = fopen("pastry.txt", "r") or die("Can"t open file!");

    $file = fread($fh, filesize($fh));

    Используя функцию fllesize() для определения размера pastry.txt в байтах, вы гарантируете, что функция fread() прочитает все содержимое файла.

    Листинг 7.1. Текстовый файл pastry.txt

    Recipe: Pastry Dough

    1 1/4 cups all-purpose flour

    3/4 stick (6 tablespoons) unsalted butter, chopped

    2 tablespoons vegetable shortening 1/4 teaspoon salt

    3 tablespoons water

    Функция fgetc() возвращает строку, содержащую один символ из файла в текущей позиции указателя, или FALSE при достижении конца файла. Синтаксис функции fgetc():

    string fgetc (int манипулятор)

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

    $fh = fopen("pastry.txt", "r"); while (! feof($fh)) :

    $char = fgetc($fh):

    print $char; endwhile;

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

    string fgets (int манипулятор, int длина)

    Чтение прекращается при выполнении одного из следующих условий:

    • из файла прочитано длина -- 1 байт;
    • из файла прочитан символ новой строки (включается в возвращаемую строку);
    • из файла прочитан признак конца файла (EOF).

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

    $fh = fopen("pastry.txt", "r");

    while (! feof($fh));

    $line = fgets($fh, 4096);

    print $line. "
    ";

    Функция fgetss() полностью аналогична fgets() за одним исключением -- она пытается удалять из прочитанного текста все теги HTML и PHP:

    string fgetss (Int манипулятор, int длина [, string разрешенные_теги])

    Прежде чем переходить к примерам, ознакомьтесь с содержимым листинга 7.2 -- этот файл используется в листингах 7.3 и 7.4.

    Листинг 7.2. Файл science.html

    Breaking News - Science

    Alien lifeform discovered


    August 20. 2000

    Early this morning, a strange new form of fungus was found growing in the closet of W. J. Gilmore"s old apartment refrigerator. It is not known if powerful radiation emanating from the tenant"s computer monitor aided in this evolution.

    Листинг 7.З. Удаление тегов из файла HTML перед отображением в браузере

    $fh = fopen("science.html", "r");

    while (! feof($fh)) :

    print fgetss($fh, 2048);

    Результат приведен ниже. Как видите, из файла science.html были удалены все теги HTML, что привело к потере форматирования:

    В некоторых ситуациях из файла удаляются все теги, кроме некоторых -- например, тегов разрыва строк
    . Листинг 7.4 показывает, как это делается.

    Листинг 7.4. Выборочное удаление тегов из файла HTML

    $fh = fopenC"science.html", "r");

    $allowable = "
    ";

    while (! feof($fh)) :

    print fgetss($fh. 2048, $allowable);

    Результат:

    Breaking News - Science Alien lifeform discovered August 20. 2000 Early this morning, a strange new form of fungus was found growing in the closet of W. J. Gilmore"s old apartment refrigerator. It is not known if powerful radiation emanating from the tenant"s computer monitor aided in this evolution.

    Как видите, функция fgetss() упрощает преобразование файлов, особенно при наличии большого количества файлов HTML, отформатированных сходным образом.

    Чтение файла в массив

    Функция file() загружает все содержимое файла в индексируемый массив. Каждый элемент массива соответствует одной строке файла. Синтаксис функции filе ():

    array file (string файл [, int включение_пути])

    Если необязательный третий параметр включение_пути равен 1, то путь к файлу определяется по отношению к каталогу включаемых файлов, указанному в файле php.ini (см. главу 1). В листинге 7.5 функция file() используется для загрузки файла pastry.txt (см. листинг 7.1).

    $file_array = file("pastry.txt");

    while (list($line_num. $line) = eacht($file_array)):

    print "Line $line_num: ", htmlspecialchars($line), "
    \n"

    Каждая строка массива выводится вместе с номером:

    Line 0: Recipe: Pastry Dough

    Line 1: 1 1/4 cups all-purpose flour

    Line 2: 3/4 stick (6 tablespoons) unsalted butter, chopped

    Line 3: 2 tablespoons vegetable shortening

    Line 4: 1/4 teaspoon salt

    Line 5: 3 tablespoons water

    Перенаправление файла в стандартный выходной поток

    Функция readfile() читает содержимое файла и направляет его в стандартный вывод (в большинстве случаев -- в браузер). Синтаксис функции readfile():

    int readfile (string файл [, int включение_пути])

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

    Предположим, у вас имеется файл latorre.txt, содержимое которого вы хотите вывести в браузере:

    Restaurant "La Тоrrе." located in Nettuno, Italy, offers an eclectic blend of style. history, and fine seafood cuisine. Within the walls of the medieval borgo surrounding the city, one can dine while watching the passersby shop in the village boutiques. Comfort coupled with only the freshest seafare make La Torre one of Italy"s finest restaurants.

    При выполнении следующего фрагмента все содержимое latorre.txt направляется в стандартный выходной поток:

    $restaurant_file = "latorre.txt";

    // Направить весь файл в стандартный выходной поток

    readfile($restaurant_filе);

    Открытие файлового манипулятора процесса

    Наряду с обычными файлами можно открывать файловые манипуляторы для взаимодействия с процессами на сервере. Задача решается функцией рореn(), которая имеет следующий синтаксис:

    int popen (string команда, string режим)

    Параметр команда определяет выполняемую системную команду, а параметр режим описывает режим доступа:

    // Открыть файл "spices.txt" для записи

    $fh = fopen("spices.txt","w");

    // Добавить несколько строк текста

    fputs($fh, "Parsley, sage, rosemary\n");

    fputs($fh, "Paprika, salt, pepper\n");

    fputs($fh, "Basil, sage, ginger\n");

    // Закрыть манипулятор

    // Открыть процесс UNIX grep для поиска слова Basil в файле spices.txt

    $fh - popen("grep Basil < spices.txt", "r");

    // Вывести результат работы grep

    Результат выглядит так:

    Basil, sage, ginger

    Функция fpassthru() является аналогом функции passthru(), рассматриваемой в разделе «Запуск внешних программ» этой главы.

    После выполнения всех операций файл или процесс необходимо закрыть. Функция pclose() закрывает соединение с процессом, заданным манипулятором, по аналогии с тем, как функция fclose() закрывает файл, открытый функцией fopen(). Синтаксис функции pclose():

    int pclose (int манипулятор}

    В параметре манипулятор передается манипулятор, полученный ранее при успешном вызове рореn().

    Открытие соединения через сокет

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

    Функция fsockopen() устанавливает сокетное соединение с сервером в Интернете

    через протокол TCP или UDP. Синтаксис функции fsockopen():

    int fsockopen (string узел, int порт [, int код_ошибки [, string текст_ошибки [, int тайм-аут]]])

    Необязательные параметры код_ошибки и текст_ошибки содержат информацию, которая будет выводиться в случае неудачи при подключении к серверу. Оба параметра должны передаваться по ссылке. Третий необязательный параметр, тайм-аут, задает продолжительность ожидания ответа от сервера (в секундах). В листинге 7.6 продемонстрировано применение функции fsockopen() для получения информации о сервере. Однако перед рассмотрением листинга 7.6 необходимо познакомиться еще с одной функцией -- socket_set_blocking().

    UDP (User Datagram Protocol) -- коммуникационный протокол, не ориентированный на соединение.

    socket_set_blocking()

    Функция socket_set_b1ocki ng() позволяет установить контроль над тайм-аутом для операций с сервером:

    socket_set_blocking(int манипулятор, boolean режим)

    Параметр манипулятор задает открытый ранее сокет, а параметр режим выбирает режим, в который переключается сокет (TRUE для блокирующего режима, FALSE для неблокирующего режима). Пример использования функций fsockopen() и socket_set_blocking() приведен в листинге 7.6.

    Листинг 7.6. Использование функции fsockopen() для получения информации о сервере

    function getthehost($host.$path) {

    // Открыть подключение к узлу

    $fp - fsockopen($host, 80, &$errno, &$errstr, 30);

    // Перейти в блокирующий режим

    socket_set_blocking($fp, 1),

    // Отправить заголовки

    fputs($fp,"GET $path HTTP/1.1\r\n");

    fputs ($fp, "Host: $host\r\n\r\n"); $x = 1;

    // Получить заголовки

    while($x < 10) :

    $headers = fgets ($fp, 4096);

    // Закрыть манипулятор

    getthehost("www. apress.com", "/");

    В результате выполнения листинга 7.6 выводится следующий результат:

    НТТР/1.1 200 OK Server: Microsoft-IIS/4.0 Content-location:

    2000 20:25:06 GMT ETag: "f0a61666dbff1bf1:34a5" Content-Length: 1311

    Функция pfsockopen() представляет собой устойчивую (persistent) версию fsockopen(). Это означает, что соединение не будет автоматически разорвано по завершении сценария, в котором была вызвана функция. Синтаксис функции pfsockopen():

    int pfsockopen (string узел, int порт [, int код_ошибки [, string текст _ошибки [, int тайм-аут]]])

    В зависимости от конкретных целей вашего приложения может оказаться удобнее использовать pfsockopen() вместо fsockopen().

    Запуск внешних программ

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

    Функция ехес() запускает заданную программу и возвращает последнюю строку ее выходных данных. Синтаксис функции ехес():

    string exec (string команда [, string массив [, int возврат]])

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

    Листинг 7.7 показывает, как использовать функцию ехес() для выполнения системной функции UNIX ping.

    Листинг 7.7. Проверка связи с сервером с применением функции ехес()

    exec("ping -с 5 www.php.net", $ping);

    // В Windows - exec("ping -n 5 www.php.net. $ping);

    for ($i=0; $i< count($ping);$i++) :

    print "
    $ping[$i]";

    Результат:

    PING www.php.net (208.247.106.187): 56 data bytes

    64 bytes from 208.247.106.187: icmp_seq=0 ttl=243 time=66.602 ms

    64 bytes from 208.247.106.187: icmp_seq=1 ttl=243 time=55.723 ms

    64 bytes from 208.247.106.187: icmp_seq=2 ttl=243 time=70.779 ms

    64 bytes from 208.247.106.187: icmp_seq=3 ttl=243 time=55.339 ms

    64 bytes from 208.247.106.187: icmp_seq=4 ttl=243 time=69.865 ms

    Www.php.net ping statistics --

    5 packets transmitted. 5 packets received. 0% packet loss

    round-trip min/avg/max/stddev - 55.339/63.662/70.779/6.783 ms

    Обратные апострофы

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

    print "

    $output
    ";

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

    Внутренний параметр ping -с 5 (-п 5 в системе Windows) задает количество опросов сервера.

    Если вы хотите просто вернуть неформатированные результаты выполнения команды, воспользуйтесь функцией passthru(), описанной ниже.

    Функция passthru() работает почти так же, как ехес(), за одним исключением -- она автоматически выводит результаты выполнения команды. Синтаксис функции passthru():

    void passthru(string команда [, int возврат])

    Если при вызове passthru() передается необязательный параметр возврат, этой переменной присваивается код возврата выполненной команды.

    escapeshellcmd()

    Функция escapeshellcmd() экранирует все потенциально опасные символы, которые могут быть введены пользователем (например, на форме HTML), для выполнения команд exec(), passthru(), system() или рореn(). Синтаксис:

    string escapeshellcmd (string команда)

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

    $user_input = `rm -rf *`; // Удалить родительский каталог и все его подкаталоги

    ехес($user_input); // Выполнить $user_input !!!

    Если не предпринять никаких мер предосторожности, такая команда приведет к катастрофе. Впрочем, можно воспользоваться функций escapeshellcmd() для экранирования пользовательского ввода:

    $user_input = `rm - rf *`; // Удалить родительский каталог и все его подкаталоги

    ехес(escapeshellcmd($user_input)); // Экранировать опасные символы

    Функция escapeshellcmd() экранирует символ *, предотвращая катастрофические последствия выполнения команды.

    Безопасность является одним из важнейших аспектов программирования в среде Web, поэтому я посвятил целую главу этой теме и ее отношению к программированию PHP. За дополнительной информацией обращайтесь к главе 16.

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

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

    Функция basename() выделяет имя файла из переданного полного имени. Синтаксис функции basename():

    string basename(string полное_имя)

    Выделение базового имени файла из полного имени происходит следующим образом:

    $path = "/usr/local/phppower/htdocs/index.php"; $file = basename($path); // $file = "index.php"

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

    Функция getlastmod() возвращает дату и время последней модификации страницы, из которой вызывается функция. Синтаксис функции getlastmod():

    int getlastmod(void)

    Возвращаемое значение соответствует формату даты/времени UNIX, и для его форматирования можно воспользоваться функцией date(). Следующий фрагмент выводит дату последней модификации страницы:

    echo "Last modified: ".date("H:i:s a". getlastmod());

    Функция stat() возвращает индексируемый массив с подробной информацией о файле с заданным именем:

    array stat(string имя_файла)

    В элементах массива возвращается следующая информация:

    0 У стройство

    2 Режим защиты индексного узла

    3 Количество ссылок

    4 Идентификатор пользователя владельца

    5 Идентификатор группы владельца

    6 Тип устройства индексного узла

    7 Размер в байтах

    8 Время последнего обращения

    9 Время последней модификации

    10 Время последнего изменения

    11 Размер блока при вводе/выводе в файловой системе

    12 Количество выделенных блоков

    Таким образом, если вы хотите узнать время последнего обращения к файлу, обратитесь к элементу 8 возвращаемого массива. Рассмотрим пример:

    $file - "datafile.txt";

    list($dev, $inode, $inodep, $nlink, $uid, $gid, $inodev, $size, $atime, $mtime, $ctime,

    $bsize) = stat($file);

    print "$file is $size bytes.
    ";

    print "Last access time: $atime
    ";

    print "Last modification time: $mtime
    ";

    Результат:

    popen.php is 289 bytes.

    Last access time: August 15 2000 12:00:00

    Last modification time: August 15 2000 10:07:18

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

    Отображение и изменение характеристик файлов

    У каждого файла в системах семейства UNIX есть три важные характеристики:

    • принадлежность группе;
    • владелец;
    • разрешения (permissions).

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

    Если у вас нет опыта работы в операционных системах UNIX, информацию о характеристиках файловой системы UNIX можно получить по адресу http://sunsite.auc.dk/linux-newbie/FAQ2.htm . Темы принадлежности группе, владения и разрешений рассматриваются в разделе 3.2.6.

    Функция chgrp() пытается сменить группу, которой принадлежит заданный файл. Синтаксис функции chgrp():

    int chgrp (string имя_файла, mixed группа)

    Функция filegroup() возвращает идентификатор группы владельца файла с заданным именем или FALSE в случае ошибки. Синтаксис функции filegroup():

    int filegroup (string имя_файла)

    Функция chmod() изменяет разрешения файла с заданным именем. Синтаксис функции chmod():

    int chmod (string имя_файла, int разрешения)

    Разрешения задаются в восьмеричной системе. Специфика задания параметра функции chmod () продемонстрирована в следующем примере:

    chmod("data_file.txt", g+r); // He работает

    chmod("data_file.txt", 766); // Не работает

    chmod("data_file.txt", 0766); // Работает

    Функция fileperms() возвращает разрешения файла с заданным именем или FALSE в случае ошибки. Синтаксис функции fileperms():

    int fileperms (string имя_файла)

    Функция chown() пытается сменить владельца файла. Право изменения владельца файла предоставляется только привилегированному пользователю. Синтаксис функции chown():

    int chown (string имя_файла, mixed пользователь)

    Функция fileowner() возвращает идентификатор пользователя для владельца файла с заданным именем. Синтаксис функции fileowner():

    int fileowner (string имя_файла)

    Копирование и переименование файлов

    К числу других полезных системных функций, которые могут выполняться в сценариях PHP, относятся копирование и переименование файлов на сервере. Эти операции выполняются двумя функциями: сору() и rename().

    Скопировать файл в сценарии PHP ничуть не сложнее, чем при помощи команды UNIX ср. Задача решается функцией PHP сору(). Синтаксис функции сору():

    int copy (string источник, string приемник)

    Функция сору() пытается скопировать файл источник в файл приемник; в случае успеха возвращается TRUE, а при неудаче -- FALSE. Если файл приемник не существует, функция сору() создает его. Следующий пример показывает, как создать резервную копию файла при помощи функции сору():

    $data_file = "datal.txt";

    copy($data_file. $data_file".bak") or die("Could not copy $data_file");

    Функция rename() переименовывает файл. В случае успеха возвращается TRUE, a при неудаче -- FALSE. Синтаксис функции rename():

    bool rename (string старое_имя, string новое_имя)

    Пример переименования файла функцией rename():

    $data_file = "datal.txt";

    rename($data file, $datafile".old") or die ("Could not rename $data file");

    Удаление файлов

    Функция unlink() удаляет файл с заданным именем. Синтаксис:

    int unlink (string файл)

    Если вы работаете с PHP в системе Windows, при использовании этой функции иногда возникают проблемы. В этом случае можно воспользоваться описанной выше функцией system() и удалить файл командой DOS del:

    system ("del filename.txt");

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

    Функции PHP позволяют просматривать содержимое каталогов и перемещаться по ним. В листинге 7.8 изображена типичная структура каталогов в системе UNIX.

    Листинг 7.8. Типичная структура каталогов

    Функция dirname() дополняет basename() -- она извлекает путь из полного имени файла. Синтаксис функции dirname():

    string dirname (string путь)

    Пример использования dirname() для извлечения пути из полного имени:

    $path = "/usr/locla/phppower/htdocs/index.php";

    $file = dirname($path); // $file = "usr/local/phppower/htdocs"

    Функция dirname() иногда используется в сочетании с переменной $SCRIPT_FILENAME для получения полного пути к сценарию, из которого выполняется команда:

    $dir - dirname($SCRIPT_FILENAME);

    Функция is_dir() проверяет, является ли файл с заданным именем каталогом:

    bool is_dir (string имя_файла)

    В следующем примере используется структура каталогов из листинга 7.8:

    $ isdir = is_dir("index.html"); // Возвращает FALSE

    $isdir = is_dir("book"); // Возвращает TRUE

    Функция mkdir() делает то же, что и одноименная команда UNIX, -- она создает новый каталог. Синтаксис функции mkdir():

    int mkdir (string путь, int режим)

    Параметр путь определяет путь для создания нового каталога. Не забудьте завершить параметр именем нового каталога! Параметр режим определяет разрешения, назначаемые созданному каталогу.

    Подобно тому как функция fopen() открывает манипулятор для работы с заданным файлом, функция opendir() открывает манипулятор для работы с каталогом. Синтаксис функции opendir():

    int opendir (string путь)

    Функция closedir() закрывает манипулятор каталога, переданный в качестве параметра. Синтаксис функции closedir():

    void closedir(int манипулятор_каталога)

    Функция readdir() возвращает очередной элемент заданного каталога. Синтаксис:

    string readdir(int манипулятор_каталога)

    С помощью этой функции можно легко вывести список всех файлов и подкаталогов, находящихся в текущем каталоге:

    $dh = opendir(" .);

    while ($file = readdir($dh)) :

    print "$file
    "; endwhile;

    Функция chdir() работает так же, как команда UNIX cd, -- она осуществляет переход в каталог, заданный параметром. Синтаксис функции chdir():

    int chdir (string каталог)

    В следующем примере мы переходим в подкаталог book/ и выводим его содержимое:

    $newdir = "book";

    chdir($newdir) or die("Could not change to directory ($newdir)"); $dh = opendir(" . ");

    while ($file = readdir($dh)) ;

    print "$file
    ";

    Функция rewlnddir() переводит указатель текущей позиции в начало каталога, открытого функцией opendir(). Синтаксис функции rewinddir():

    void rewinddir (int нанипулятор_каталога)

    Проект 1: простой счетчик обращений

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

    1. Присвоить переменной $access имя файла, в котором будет храниться значение счетчика.
    2. Использовать функцию filе() для чтения содержимого $access в массив $visits. Префикс @ перед именем функции подавляет возможные ошибки (например, отсутствие файла с заданным именем).
    3. Присвоить переменной $current_visitors значение первого (и единственного) элемента массива $visits.
    4. Увеличить значение $current_visitors на 1.
    5. Открыть файл $access для записи и установить указатель текущей позиции в начало файла.
    6. Записать значение $current_visitors в файл $access.
    7. Закрыть манипулятор, ссылающийся на файл $access.

    Листинг 7.9. Простой счетчик обращений

    // Сценарий: простой счетчик обращений

    // Назначение: сохранение количества обращений в файле

    $access = "hits.txt"; // Имя файла выбирается произвольно

    $current_visitors = $visits; // Извлечь первый (и единственный) элемент

    ++$current_visitors; // Увеличить счетчик обращений

    $fh = fopen($access. "w"); // Открыть файл hits.txt и установить

    // указатель текущей позиции в начало файла

    @fwrite($fh, $current_visitors);// Записать новое значение счетчика

    // в файл "hits.txt"

    fclose($fh); // Закрыть манипулятор файла "hits.txt"

    Проект 2: построение карты сайта

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

    1. Объявить служебные переменные для хранения родительского каталога, имени графического файла с изображением папки, названия страницы и флага серверной ОС (Windows или другая система).
    2. Объявить функцию display_directory(), которая читает содержимое каталога и форматирует его для вывода в браузере.
    3. Построить путь к каталогу объединением имени, передаваемого в переменной $dir1, с $dir.
    4. Открыть каталог и прочитать его содержимое. Отформатировать имена каталога и файлов и вывести их в браузере.
    5. Если текущий файл является каталогом, рекурсивно вызвать функцию display_di rectory() и передать ей имя нового каталога для вывода. Вычислить отступ, используемый при форматировании вывода.

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

    Листинг 7.10. Программа sitemap.php

    // Файл: sitemap.php

    // Назначение: построение карты сайта

    // Каталог, с которого начинается построение карты

    $beg_path = "C:\Program FilesVApache Group\Apache\htdocs\phprecipes";

    // Файл с графическим изображением папки.

    // Путь должен задаваться Относительно* корневого каталога сервера Apache

    $folder_location = "C:\My Documents\PHP for Programmers\FINAL CHPS\graphics\folder.gif";

    // Текст в заголовке окна $page_name = "PHPRecipes SiteMap";

    // В какой системе будет использоваться сценарий - Linux или Windows?

    // (0 - Windows; 1 - Linux)

    $usingjinux = 0;

    // Функция: display_directory

    // Назначение: чтение содержимого каталога, определяемого параметром

    // $dir1, с последующим форматированием иерархии каталогов и файлов.

    // Функция может вызываться рекурсивно.

    function display_directory ($dir1, $folder_location, $using_linux, $init_depth) {

    // Обновить путь

    Sdh = opendir($dir);

    while($file = readdir($dh)) :

    // Элементы каталогов "." и ".." не выводятся.

    if (($file != ".") && ($file != "..")) :

    if ($using_linux == 0) :

    $depth = explode("\\", $dir): else:

    $depth = explode("/", $dir); endif ; $curtent_depth = sizeof($depth);

    // Построить путь по правилам используемой операционной системы. if ($using_linux == 0) :

    $tab_depth = $current_deptn - $init_depth;

    $file = $dir. "\\", $file; else:

    $file = $dir. "/",$file; endif;

    // Переменная $file содержит каталог? if (is dir($file)) :

    // Вычислить отступ

    while ($х < ($tab_depth * 2)) :

    $х++; endwhile;

    print "

    ".basename($file)."
    ";

    // Увеличить счетчик

    // Рекурсивный вызов функции display_directory()

    display_directory($file, $folder_location, $using_linux, $init_depth);

    // He каталог

    // Построить путь по правилам используемой

    // операционной системы.

    if ($using_linux == 0) :

    $tab_depth = ($current_depth - $init_depth) - 2; $x = 0;

    // Вычислить отступ

    while ($x < (($tab_depth * 2) + 5)) :

    print "".basename($file)."
    ";

    print "".basename($file)."
    ";

    endif; // Is_dir(file) endif: // If ! "." or ".."

    // Закрыть каталог closedir($dh);

    <? print "$page_name"; ?>

    // Вычислить начальный отступ

    if ($using_linux == 0) :

    $depth = explode("\\", $beg_path);

    $depth = explode("/", $beg_path);

    $init_depth = sizeof($depth);

    display_directory ($beg_path, $folder_location, $using_linux, $init_depth);

    На рис. 7.1 изображен результат выполнения сценария для каталога с несколькими главами этой книги.

    Рис. 7.1. Вывод структуры каталога на сервере с использованием сценария sitemap.php

    Итоги

    В этой главе были представлены многие средства PHP, предназначенные для работы с файлами. В частности, мы рассмотрели следующие вопросы:

    • проверку существования файлов;
    • открытие и закрытие файлов и потоков ввода/вывода;
    • запись в файл и чтение из него;
    • перенаправление файла в выходной поток;
    • запуск внешних программ;
    • операции с файловой системой.

    Материал этой главы подготовил почву для следующей главы, «Строки и регулярные выражения», поскольку при разработке web-приложений обработка строк и операции ввода/вывода очень тесно связаны.

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

    Работа с файлами разделяется на 3 этапа:

    1. Открытие файла.
    2. Манипуляции с данными.
    3. Закрытие файла.

    I . Открытие файла

    Для того чтобы открыть файл в среде PHP используется функция fopen() . Обязательными параметрами этой функции является имя файла и режим файла.

    $fp = fopen("counter.txt", "r");

    Согласно документации PHP выделяют следующие виды режимов файлов:

    1. r – открытие файла только для чтения.
    2. r+ - открытие файла одновременно на чтение и запись.
    3. w – создание нового пустого файла. Если на момент вызова уже существует такой файл, то он уничтожается.
    4. w+ - аналогичен r+, только если на момент вызова фай такой существует, его содержимое удаляется.
    5. a – открывает существующий файл в режиме записи, при этом указатель сдвигается на последний байт файла (на конец файла).
    6. a+ - открывает файл в режиме чтения и записи при этом указатель сдвигается на последний байт файла (на конец файла). Содержимое файла не удаляется.

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

    Для демонстрации рассмотрим следующий сценарий:

    //Открывает файл в разных режимах
    $fp = fopen("counter.txt", "r"); // Бинарный режим
    $fp = fopen("counter.txt", "rt"); // Текстовый режим
    $fp = fopen("http://www.yandex.ru", "r");// Открывает HTTP соединение на чтение
    $fp = fopen("ftp://user:[email protected]", "w"); //Открываем FTP соединение с указанием логина и пароля
    ?>

    II . Манипуляции с данными файла

    Записывать данные в файл при помощи PHP можно при помощи функции fwrite() . Это функция принимает 2 обязательных параметра и 1 необязательный. В качестве обязательных параметров выступает дескриптор файла и режим файла:

    $fp = fopen("counter.txt", "a"); // Открываем файл в режиме записи
    $mytext = "Это строку необходимо нам записать\r\n"; // Исходная строка
    $test = fwrite($fp, $mytext); // Запись в файл
    if ($test) echo "Данные в файл успешно занесены.";
    else echo "Ошибка при записи в файл.";
    fclose($fp); //Закрытие файла
    ?>

    Для построчного считывания файла используют функцию fgets() . Функция принимает 2 обязательных параметра:


    if ($fp)
    {
    while (!feof($fp))
    {
    $mytext = fgets($fp, 999);
    echo $mytext."
    ";
    }
    }

    fclose($fp);
    ?>

    Примечание: В данном примере значение 999 определяет количество символов, которые будут считываться до тех пор, пока указатель не достигнет конца файла (EOF).

    Для того, чтобы считать файл как единое целое, нужно использовать функцию readfile() , принимающая 1 обязательный параметр. Функция открывает файл, отображает его содержимое в окне браузера, а затем закрывает файл:

    echoreadfile("counter.txt");
    ?>

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

    $fp = fopen("counter.txt", "r"); // Открываем файл в режиме чтения
    if ($fp) echo fpassthru($fp);
    elseecho "Ошибка при открытии файла";
    ?>

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

    Примечание: Не следует применять функцию file() к двоичным файлам (binary-safe), т.к. она не является безопасной в плане считывания двоичных файлов, если при этом, где-то встретиться символ конца файла (EOF), то она не гарантирует вам чтение всего двоичного файла.

    $file_array = file("counter.txt"); // Считывание файла в массив $file_array
    // Работа с данными массива
    ?>

    Примечание: Работа с массивами подробно описывается , авторы: Мухаметшин Д.Ф., Симдянов И.В.

    В конце статьи, вы найдете хороший «сборник рецептов» по массивам, который дает решение многих проблем, с которыми ежедневно встречается веб-программист.

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

    $fp = fopen("counter.txt", "r"); // Открываем файл в режиме чтения
    if ($fp)
    {
    while(!feof($fp))
    {
    $char = fgetc($fp);
    if ($char == "с") $i = $i + 1;// Находим символ «с»
    }
    echo "Количество букв "c" в файле: ". $i;
    }
    else echo "Ошибка при открытии файла";
    ?>

    III . Закрытие файла

    Закрытие файла происходить с помощью функции fclose() , которая принимает 1 обязательный параметр.

    $fp = fopen("counter.txt", "r");
    if ($fp)
    {
    echo "Файл открыт";
    fclose($fp); // Закрытие файла
    }
    ?>

    Сборник рецептов

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

    myfile("counter.txt"); // Используем функцию myfile, передав в качестве аргумента имя файла

    function myfile($name) //Создаем функцию для проверки существования файла
    {
    if (file_exists($name)) echo "Файл существует";

    }
    ?>

    Примечание: Функция file_exists не производит проверку файлов на удаленном веб-сервере. Для правильной работы функции, файл со скриптом должен находиться на том сервере, где и проверяемый файл.

    2) Определяем размер файла с помощью функции filesize ()

    myfile("counter.txt");

    function myfile($name) //Создаем функцию для проверки существования файла и определения размера файла
    {
    if (file_exists($name)) echo "Размер файла: ".filesize($name)." байт";
    else echo "Файл не существует";
    }
    ?>

    3) Создание временного файла с помощью функции tmpfile ()

    $myfile = tmpfile();
    fwrite($myfile, "Эта строка записывается во временный файл."); // Записываем во временный файл
    fseek($myfile, 0); // Устанавливаем указатель файла
    echo fread($myfile, 1024); // выводим содержимое файла
    ?>

    4) Вам необходимо определить количество строк в файле. Для этого используем функцию count ()

    $fp = file("counter.txt");
    echo "Количество строк в файле: ".count($fp);
    ?>

    5) Нам необходимо использовать механизм блокировки файла

    $fp = fopen("counter.txt", "a");
    flock($fp, LOCK_EX); // Блокирование файла для записи
    fwrite($fp, "Строка для записи");
    flock($fp, LOCK_UN); // Снятие блокировки
    fclose($fp);
    ?>

    6) Нам необходимо удалить определенную строку из файла

    $num_stroka = 5; //Удалим 5 строку из файла
    $file = file("counter.txt"); // Считываем весь файл в массив

    for($i = 0; $i < sizeof($file); $i++)
    if($i == $num_stroka) unset($file[$i]);

    $fp = fopen("counter.txt", "w");
    fputs($fp, implode("", $file));
    fclose($fp);
    ?>

    7) Определение типа файла. Используем функцию

    Об использовании функций fopen, fclose, feof, fgets, fgetss, и fscanf

    Давайте перечислим все возможности

    Одним из преимуществ работы с современными языками программирования, такими как PHP, является количество доступных возможностей. PHP легко мог бы присвоить девиз языка Perl, "Существует несколько способов сделать что-либо", особенно, когда речь идет об обработке файлов. Но при изобилии доступных средств, возникает вопрос, какое из них лучше для выполнения работы. Конечно, в действительности, ответ на этот вопрос зависит от того, какие цели вы ставите при обработке файла, поэтому изучение всех возможностей языка стоит потраченного времени.

    Традиционные методы fopen

    Методы fopen , возможно, лучше других знакомы программистам C и C++ былых времен, поскольку в большей или меньшей степени являются именно теми инструментами, которые на протяжении долгих лет были всегда у вас под рукой, если вы работали с этими языками программирования. Для любого из этих методов вы выполняете стандартную процедуру, используя fopen для открытия файла, функцию для чтения данных, а затем fclose для закрытия файла, как показано в Листинге 1.

    Листинг 1. Открытие и чтение файла с помощью fgets
    $file_handle = fopen("myfile", "r"); while (!feof($file_handle)) { $line = fgets($file_handle); echo $line; } fclose($file_handle);

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

    1. Открываете файл. $file_handle хранит ссылку на сам файл.
    2. Проверяете, не достигли ли вы конца файла.
    3. Продолжаете считывание файла, пока не достигнете конца, печатая каждую строку, которую читаете.
    4. Закрываете файл.

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

    Функция fopen

    Функция fopen устанавливает связь с файлом. Я говорю "устанавливает связь, " поскольку, кроме открытия файла, fopen может открыть и URL:

    $fh = fopen("http://127.0.0.1/", "r");

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

    Примечание: Параметр "r" , использованный в fopen , указывает на то, что файл открыт только для чтения. Поскольку запись в файл не входит в круг вопросов, рассматриваемых в данной статье, я не стану перечислять все возможные значения параметра. Тем не менее, вам необходимо изменить "r" на "rb" если вы производите чтение из двоичных файлов для межплатформенной совместимости. Ниже будет приведен пример данного типа.

    Функция feof

    Команда feof определяет, произведено ли чтение до конца файла, и возвращает значение True (Истина) или False (Ложь). Цикл, приведенный в продолжается, пока не будет достигнут конец файла "myfile." Обратите внимание, что feof также возвращает False, если вы читаете URL и произошло превышение времени ожидания подключения, поскольку не имеется более данных для считывания.

    Функция fclose

    Пропустим середину Листинга 1 и перейдем в конец; fclose выполняет задачу, противоположную fopen: она закрывает подключение к файлу или URL. После выполнения данной функции вы больше не сможете выполнять чтение из файла или сокета.

    Функция fgets

    Возвращаясь на несколько строк назад в Листинге 1, вы попадаете в самый центр процесса обработки файлов: непосредственно чтение файла. Функция fgets - это выбранное вами "оружие" для первого примера. Она захватывает строчку данных из файла и возвращает ее как строку. Оттуда вы можете выводить данные или обрабатывать их иным образом. В примере, приведенном в Листинге 1, распечатывается весь файл целиком.

    Если вы решите ограничить размер порции данных, с которой работаете, можно добавить fgets аргумент для ограничения максимальной длины строки захватываемых данных. Например, используйте следующий программный код для ограничения длины строки в 80 символов:

    $string = fgets($file_handle, 81);

    Вспомните "\0", указатель конца строки в C и установите длину на один символ больше, чем вам в действительности необходимо. Как видите, в приведенном выше примере используется 81, тогда как вам нужно 80 символов. Сделайте вашей привычкой добавление дополнительного символа всегда, когда вам понадобится задать ограничение длины строки для данной функции.

    Функция fread

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

    И здесь мы обращаемся к fread . Функция fread используется в несколько иных целях, чем fgets: она предназначена для чтения из двоичных файлов (то есть файлов, не состоящих изначально из текста, удобочитаемого для человека). Поскольку понятие "строк" не актуально для двоичных файлов (логические структуры данных обычно не разбиваются на строки), вы должны указывать количество байтов, которое нужно считывать.

    $fh = fopen("myfile", "rb"); $data = fread($file_handle, 4096);

    В приведенном выше примере считывается 4096 байтов (4 KB) данных. Обратите внимание, что, независимо от указанного вами значения, fread будет считывать не более 8192 байтов (8 KB).

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

    $fh = fopen("myfile", "rb"); $data = fread($fh, filesize("myfile")); fclose($fh);

    Если размер файла больше, вам придется использовать цикл для считывания оставшейся его части.

    Функция fscanf

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

    list ($field1, $field2, $field3) = fscanf($fh, "%s %s %s");

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

    Функция fgetss

    Функция fgetss отличается от традиционных функций для работы с файлами и дает вам лучшее представление о возможностях PHP. Она работает наподобие fgets , но отбрасывает любые обнаруженные ею теги HTML или PHP, оставляя только "голый" текст. Возьмем приведенный ниже HTML-файл.

    Листинг 2. Пример файла HTML
    My title

    If you understand what "Cause there ain"t no one for to give you no pain" means then you listen to too much of the band America

    Пропустим его через функцию fgetss .

    Листинг 3. Использование fgetss
    $file_handle = fopen("myfile", "r"); while (!feof($file_handle)) { echo = fgetss($file_handle); } fclose($file_handle);

    Вот что вы получите в качестве выходных данных:

    My title If you understand what "Cause there ain"t no one for to give you no pain" means then you listen to too much of the band America

    Функция fpassthru

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

    fpassthru($fh);

    Эта функция выводит данные на печать, поэтому вам не нужно помещать их в переменную.

    Нелинейная обработка файла: перемещение по файлу

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

    fseek($fh, 0);

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

    fseek($fh, 1024);

    Начиная с PHP V4.0, доступны также несколько других опций. Например, если нужно перейти вперед на 100 байт от вашей текущей позиции, вы можете использовать следующий код:

    fseek($fh, 100, SEEK_CUR);

    Аналогично, переход назад на 100 байт осуществляется посредством:

    fseek($fh, -100, SEEK_CUR);

    Если вы хотите перейти назад в положение 100 байт до конца файла, используйте вместо этого SEEK_END .

    fseek($fh, -100, SEEK_END);

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

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

    Захват целого файла

    Теперь мы переходим к рассмотрению некоторых уникальных возможностей PHP для обработки файлов: обработка больших блоков данных в одной или двух строках. Например, как можно захватить файл и вывести все его содержимое на вашу Web-страницу? Что же, вы видели пример использования цикла с fgets . Но как сделать это проще? Процесс почти смехотворно прост при использовании fgetcontents , которая помещает весь файл в строку.

    $my_file = file_get_contents("myfilename"); echo $my_file;

    Хотя это и не лучший вариант, вы можете записать эту команду еще короче:

    echo file_get_contents("myfilename");

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

    echo file_get_contents("http://127.0.0.1/");

    Это команда фактически та же, что и:

    $fh = fopen("http://127.0.0.1/", "r"); fpassthru($fh);

    Должно быть, вы смотрите на эти примеры и думаете, "Это все-таки слишком трудоемкий способ". PHP-разработчики согласны с вами. Поэтому вы можете сократить приведенную выше команду до:

    readfile("http://127.0.0.1/");

    Функция readfile передает на вывод все содержимое файла или Web-страницы в выходной буфер по умолчанию. По умолчанию эта команда выводит сообщение об ошибке при сбое. Во избежание такого поведения (если вы этого хотите), попробуйте команду:

    @readfile("http://127.0.0.1/");

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

    $array = split("\n", file_get_contents("myfile"));

    Но к чему вам все эти сложности, если есть идеально подходящая функция, которая сделает за вас эту работу? Функция PHP file() выполняет эту задачу в один шаг: она возвращает строковый массив, элементами которого являются строки файла.

    $array = file("myfile");

    Следует заметить, что между двумя приведенными выше примерами есть небольшое отличие. Команда split удаляет знаки перехода на новую строку, тогда как при использовании команды file строки массива оканчиваются знаками перехода на новую строку (также, как и при использовании fgets).

    Возможности PHP, тем не менее, далеко превосходят описанные выше. Вы можете разбить целые.ini-файлы в стиле PHP всего одной командой parse_ini_file . Команда parse_ini_file применима к файлам, сходным с приведенным в Листинге 4.

    Листинг 4. Пример файла.ini
    ; Comment name = "King Arthur" quest = To seek the holy grail favorite color = Blue Samuel Clemens = Mark Twain Caryn Johnson = Whoopi Goldberg

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

    $file_array = parse_ini_file("holy_grail.ini"); print_r $file_array;

    В результате будут получены следующие выходные данные:

    Листинг 5. Выходные данные
    Array ( => King Arthur => To seek the Holy Grail => Blue => Mark Twain => Whoopi Goldberg)

    Конечно, вы можете заметить, что данная команда объединила разделы. Это действие по умолчанию, но вы легко можете произвести необходимую настройку, воспользовавшись вторым аргументом parse_ini_file: process_sections , который является переменной логического типа (Boolean). Установите значение process_sections как True (истина).

    $file_array = parse_ini_file("holy_grail.ini", true); print_r $file_array;

    И ваши выходные данные будут иметь вид:

    Листинг 6. Выходные данные
    Array ( => Array ( => King Arthur => To seek the Holy Grail => Blue) => Array ( => Mark Twain => Whoopi Goldberg))

    PHP помещает данные в легко разбиваемый для анализа многомерный массив.

    Но это лишь верхушка айсберга, если говорить об обработке файлов в PHP. Более сложные функции, например tidy_parse_file и xml_parse могут помочь вам с обработкой соответственно HTML- и XML-документов. Обратитесь к разделу , чтобы получить более подробную информацию о работе этих функций. Обе они стоят внимания, если вы будете работать с файлами указанных типов, но вместо рассмотрения всех возможных типов файлов, вы можете внимательно ознакомиться с содержанием данной статьи, где есть несколько неплохих общих правил по работе с функциями, описанными мной к настоящему моменту.

    Хороший стиль программирования

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

    Листинг 7. Использование file_exists и is_readable
    $filename = "myfile"; if (file_exists($filename) && is_readable ($filename)) { $fh = fopen($filename, "r"); # Processing fclose($fh); }

    Тем не менее, на практике этот фрагмент программы будет, пожалуй, чрезмерным для вашей задачи. Обработка значений, возвращаемых fopen , проще и точнее.

    if ($fh = fopen($filename, "r")) { # Processing fclose($fh); }

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

    Как и fopen , функции file_get_contents , file и readfile возвращают значение False, если не удается открыть или обработать файл. Функции fgets , fgetss , fread , fscanf и fclose также возвращают значение False при возникновении ошибки. Конечно, за исключением fclose , вы, вероятно уже обработали возвращенные ими результаты. Что касается fclose , мало что можно сделать, если дескриптор файла не закрывается должным образом, поэтому проверка возвращенного значения функции fclose , как правило, является излишней.

    Выбор за вами

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

    Если вы обрабатываете большие объемы данных, вероятно, fscanf окажется более полезной и эффективной, чем, скажем, использование file в сочетании с последующими командами split и sprintf . Если же вы просто отображаете текст большого объема с незначительными изменениями, напротив, использование функций file , file_get_contents , или readfile , возможно, будет более целесообразным. Это решение, вероятно, будет верным при использовании PHP для кэширования или даже создания временного прокси сервера.

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

    Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter
    ПОДЕЛИТЬСЯ: