Введение
Потоки были введены как инструмент для
работы с файлами, сетевого обмена, сжатия данных и выполнения
других операций с помощью одного общего набора функций. Выражаясь
простыми понятиями, поток (stream
) - это ресурс
(resource
), который ведет себя как источник
непрерывной последовательности данных. Это означает, что из потока можно
последовательно читать данные, равно как и записывать в него. Также
возможно перемещаться (fseek()) в разные
позиции внутри потока.
Обертка (wrapper
) - дополнительный код, который
объясняет потоку особенности работы со специфичными протоколами
или кодировками. Например, обертка http
знает, как
преобразовать URL в HTTP/1.0
-запрос для файла на
удаленном сервере. Существует множество оберток, как встроенных в PHP
изначально (см. Поддерживаемые протоколы и обертки), так и дополнительных.
Дополнительные обертки можно добавлять либо отдельным скриптом с помощью функции
stream_wrapper_register(), либо напрямую из расширения,
используя API Working with streams. Добавлять можно
произвольное количество оберток, что делает возможности работы с потоками
практически безграничными. Посмотреть список зарегистрированных на данный
момент оберток можно с помощью функции
stream_get_wrappers().
Ссылка на поток записывается в следующем виде:
scheme
://target
-
scheme
(строка) - Название обертки. Например, file, http, https, ftp, ftps, compress.zlib, compress.bz2, php. Список встроенных оберток можно посмотреть здесь Поддерживаемые протоколы и обертки. Если название обертки не указано, каждая функция, работающая с потоком, использует обертку по умолчанию (обычно этоfile
://). -
target
- Зависит от того, какая обертка используется. Для потоков, связанных с файловой системой это обычно путь и имя файла. Для сетевых потоков это, как правило, имя хоста (зачастую с добавлением к нему пути). Описания целей для встроенных оберток приведены в Поддерживаемые протоколы и обертки.
Замечание:
Информация об использовании потоков внутри исходного кода PHP приведена в Streams API for PHP Extension Authors reference.