Отправляет email-рассылки с помощью сервиса Sendsay

PHP 5 для начинающих

  Все выпуски  

Файлы и потоки


Вниманию читателей!

Отдельные выпуски рассылки в той или иной мере взаимосвязаны. С предыдущими выпусками Вы можете ознакомиться:

  1. в архиве рассылки (оригиналы выпусков);
  2. на сайте рассылки (исправленные и дополненные версии).

# # #

Вы также можете подписаться на рассылку "PHP 5: Новые возможности".

PHP 6 уже в разработке!

Еще в ноябре 2005 года на встрече в Париже разработчики обсудили новые возможности следующей, шестой, версии PHP. Интересует ли Вас, какой будет эта версия? Примите участие в опросе, который проводится на сайте рассылки.

http://pterodactyl.l2p.net/e107/

[опрос на английском языке: PHP 6: Are you interesting in? (PHP 6: Вы зантересованы?) - YES (ДА) - NO (НЕТ)]

PHP 5 для начинающих

The Pterodactyl

Copyright 2006 Pterodactyl's School

02.06.2006

История переиздания
Издание 1.00 [ Дата ]
Первоначальная версия.

Аннотация

Рассмотрены основные особенности работы с потоками в PHP (локальными, удаленными и сжатыми файлами; стандартными потоками ввода-вывода; трубами). Перечислены основные функции для работы с файлами и потоками, поддерживаемые протоколы. Дано представление о контексте потока и пользовательских потоках.


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

Базовые функции для работы с файлами (точнее, с файловой системой) - Filesystem Functions - существуют в PHP давно и должны быть хорошо знакомы разработчикам; поэтому ограничимся лишь кратким (и далеко не полным) перечислением.

Функция fopen(). Открывает указатель на файл.

Подсказка

Следует упомянуть о двух не слишком известных режимах доступа к открываемому файлу, поддерживаемых, начиная с версии PHP 4.3.2, - x и x+. Файл с заданным именем создается и открывается в режиме записи (x) и чтения (x+), если только он не был создан ранее; в противном случае генерируется предупреждение. Эти два режима применимы только к локальным файлам.

Функция fread(). Считывает блок данных из файла.

Функция fgets(). Считывает строку из файла.

Функция fwrite() / fputs(). Записывает блок данных в файл.

Функция fclose(). Закрывает открытый указатель на файл.

Функция feof(). Проверяет, достигнут ли конец файла.

Также назовем следующие функции.

Функция file(). Считывает весь файл целиком как массив строк.

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

Подсказка

Считывать в память содержимое файла целиком бывает не всегда целесообразно. В случае очень больших файлов может оказаться предпочтительнее открыть файл (fopen()) и затем циклически (while (!feof($fp))) считать из него данные сравнительно небольшими блоками (fread()) или построчно (fgets()).

Функция file_put_contents(). Доступна только в PHP 5. Записывает данные в файл.

Некоторые другие функции для работы с файлами будут упомянуты в секции «Прочие манипуляции».

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

Отметим, что, начиная с PHP 5.0.0, функции, работающие с названиями файлов (fopen(), file() и т. п.), могут принимать дополнительный аргумент - контекст, определяющий поведение открываемого файла (см. «Контекст»).

Поток (stream) представляет собой обобщение для файла, сети, сжатых данных и других ресурсов; все они могут быть использованы сходным образом при помощи общего набора функций. В частности, такими функциями являются функции для работы с файловыми системами, рассмотренные в секции «Базовые функции» (таким образом, возможность их применения расширяется далеко за пределы одних только локальных файловых систем), а также специальные потоковые функции (Stream Functions). С некоторыми из них мы вскоре познакомимся ближе.

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

Поток, в общем случае, может быть адресован при помощи следующего формата: scheme://target. Здесь scheme - это протокол доступа (например, file, http, ftp и т. д.), а target - непосредственно название ресурса, представлением которого является данный поток; оно зависит от используемого протокола (например, в случае файловой системы, это путь и название файла). Например: http://example.com/path/to/file.txt.

Унифицированность доступа к разнотипным ресурсам обеспечивается за счет использования дополнительного кода, специфического для каждого типа. Однако, этот код "скрыт" от разработчика и автоматически вызывается унифицированными функциями. Такой дополнительный код служит как бы оболочкой для обслуживаемого им ресурса и называется wrapper. Его название совпадает с названием протокола (scheme). В частности, могут поддерживаться следующие протоколы: file, http, https, ftp, ftps, php, zlib, compress.zlib, compress.bzip2 и некоторые другие. Поддерживается также работа с сокетами (sockets). Возможно даже добавить поддержку собственных протоколов. Получить перечень всех доступных (зарегистрированных) в данной системе протоколов можно с помощью функции stream_get_wrappers().

print_r(stream_get_wrappers());
Array
(
    [0] => php
    [1] => file
    [2] => http
    [3] => ftp
    [4] => compress.bzip2
    [5] => compress.zlib
    [6] => https
    [7] => ftps
)
            

Трубы (pipes). Открыть поток для чтения или записи к исполняемой программе можно при помощи функции popen(). Закрывается открытый поток при помощи функции pclose(). В остальном работа с потоком ничем не будет отличаться от работы с обычным файлом.


<?php

$fp = popen('ls -l /', 'r');    // for Windows: popen('dir /', 'r');
while (!feof($fp)) {
    print fgets($fp);
}
pclose($fp);

?>
            
bin
boot
dev
etc
home
lib
lost+found
media
misc
mnt
net
opt
proc
root
sbin
selinux
srv
sys
tmp
usr
var
            

Стандартные потоки. Стандартные потоки ввода-вывода stdin, stdout stderr, input, output и filter доступны с помощью протокола php.

<?php

$fp = fopen('php://output', 'w');
fwrite($fp, 'Blah blah blah');
fclose($fp);

?>
            
Blah blah blah

Архивы. С помощью одного из протоколов для работы со сжатыми файлами - zlib, compress.zlib или compress.bzip2 - можно легко получить доступ к архивным файлам. После исполнения следующего скрипта в текущей директории будет находиться архивный файл foo.gz, включающий файл foo, содержащий текст Blah blah blah.

<?php

$fp = fopen('compress.zlib://foo.gz', 'w');
fwrite($fp, 'Blah blah blah');
fclose($fp);

?>
            

URL. Получить доступ к удаленным файлам можно с помощью протоколов http (https) и ftp (ftps). Например, следующий код выведет домашнюю страницу сайта Pterodactyl's School.

<?php

$fp = fopen('http://pterodactyl.l2p.net/', 'r');
while (!feof($fp)) {
    print fgets($fp);
}
fclose($fp);

?>
            

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

Функция tmpfile(). Создает временный файл с уникальным именем и открывает его для записи и чтения (в режиме w+). Файл будет автоматически удален при закрытии с помощью функции fclose() или по завершению скрипта.

<?php

$fp = tmpfile();
fwrite($fp, 'Blah blah blah');
fseek($fp, 0);
print fgets($fp);
fclose($fp);    // it removes the file

?>
        
Blah blah blah

Функция flock(). "Запирает" заданный файл, т. е. устанавливает определенный режим совместного доступа к этому файлу из других программ. Установленный режим действует до тех пор пока не будет изменен этой же функцией либо файл не будет закрыт функцией fclose() или по завершению скрипта.

<?php

$fp = fopen('foo.txt', 'w');
flock($fp, LOCK_EX);    // exlusive
fwrite($fp, 'Blah blah blah');
flock($fp, LOCK_UN);    // unrelease
fclose($fp);

?>
        

Функция rename(). Переименовывает заданный файл или директорию. Функция безопасна, если переименование производится в пределах одной и той же файловой системы (раздела диска). Начиная с PHP 5.0.0, может принимать дополнительный аргумент - контекст, а также работать с FTP (FTPS).

rename('old.txt', 'new.txt');

Функция unlink(). Удаляет заданный файл. Начиная с PHP 5.0.0, может принимать дополнительный аргумент - контекст, а также работать с FTP (FTPS).

ulink('ftp://user:password@example.com/pub/file.txt');

Функция rmdir(). Удаляет заданную директорию (в удаляемой директории не должно быть ни одного файла). Начиная с PHP 5.0.0, может принимать дополнительный аргумент - контекст, а также работать с FTP (FTPS).

ulink('ftp://user:password@example.com/pub');

Created with DocBook Created with Libxslt

Created with DocBook Created with Libxslt


В избранное