Введение в PHP Потоки
В программировании постоянно приходиться работать с различными ресурсами: файлами, сокетами, http-соединениями. И у них у всех есть некий интерфейс доступа, часто несовместимый друг с другом. Поэтому, чтобы устранить данные несоответствия и унифицировать работу с различными источниками данных, начиная с PHP 4.3 были придуманы PHP Streams - потоки.
Несмотря на то, что PHP 4.3 вышел давным-давно, многие PHP-программисты имеют весьма отдаленное представление о потоках в PHP, и продолжают использовать CURL везде, хотя в PHP для этого существует более удобная альтернатива в виде контекста потоков (Stream Context).
Следующие виды потоков существуют в PHP:
- Файл на жестком диске;
- HTTP-соединение с веб-сайтом;
- Соединение UDP с сервером;
- ZIP-файл;
- Файл *.mp3.
Что общего есть во всех этих ресурсах? Все они могут быть прочитаны и записаны, т.е. к ним ко всем могут быть применены операции чтения и записи. Сила потоков PHP как раз и заключается в том, что вы можете получить доступ ко всем этим ресурсам, используя один и тот же набор функций. Это очень удобно. Также, если вдруг возникнет такая необходимость, Вы можете написать свою собственную реализацию обработчика потоков "stream wrapper". Помимо чтения и записи, потоки в PHP также позволяет выполнять другие операции, такие как переименование и удаление.
Программируя на PHP, Вы уже встречались с потоками, хотя возможно не догадывались об этом. Так, функции, работающие с потоками - это fopen(), file_get_contents(), file() и т.д. Поэтому, фактически, Вы уже используете файловые потоки все это время, полностью прозрачно.
Для работы с другим типом потока, необходимо указать его протокол (wrapper) следующим образом: wrapper://some_stream_resource, где wrapper:// - это, например http://, file://, ftp://, zip:// и т.д., а some_stream_resource - URI-адрес, идентифицирует то, что вы хотите открыть. URI-адрес не накладывает каких-либо ограничений на формат. Примеры:
- http://myrusakov.ru/php-stream-introduction.html
- file://C:/Projects/rostov-on-don.jpg
- ftp://user:[email protected]/pub/file.txt
- mpeg://file:///music/song.mp3
- data://text/plain;base64,SSBsb3ZlIFBIUAo=
Однако, учтите, что не все протоколы и обработчики могут работать у Вас, так как поддержка некоторых оболочек зависит от Ваших настроек. Поэтому, чтобы узнать какие протоколы поддерживаются необходимо выполнить следующий скрипт:
<?php
// список зарегистрированных транспортов сокета
print_r(stream_get_transports());
// список зарегистрированных потоков (обработчиков)
print_r(stream_get_wrappers());
// список зарегистрированных фильтров
print_r(stream_get_filters();
?>
Контексты потоков PHP
Часто возникает необходимость указания дополнительных параметров при http-запросе. Контексты потоков решают эту проблему, позволяя указать дополнительные параметры. У многих функций, поддерживающих работу с потоками, есть необязательный параметр контекста потока. Давайте посмотрим на функцию file_get_contents():
string file_get_contents(string $filename [, int $flags = 0 [, resource $context [, int $offset = -1 [, int $maxlen = -1]]]])
Как видно, третьим параметром передается контекст потока. Контексты создаются с помощью функции stream_context_create(), которая принимает массив и возвращает ресурс контекста.
<?php
$options = array(
'http' => array(
'method' => "GET",
'header' => "Accept-language: en\r\n".
"Cookie: foo = bar\r\n"
)
);
$context = stream_context_create($options);
// Используя это с file_get_contents ...
echo file_get_contents ("http://www.example.com/", 0, $context);
?>
Таким образом, сегодня мы узнали, что такое потоки и контексты потоков в PHP, рассмотрели примеры их использования, а в следующих статьях мы поговорим о метаданных потока и создадим свой собственный обработчик.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.