Введение в PHP Потоки
Несмотря на то, что PHP 4.3 вышел давным-давно, многие PHP-программисты имеют весьма отдаленное представление о потоках в PHP, и продолжают использовать CURL везде, хотя в PHP для этого существует более удобная альтернатива в виде контекста потоков (Stream Context).
Следующие виды потоков существуют в PHP:
Что общего есть во всех этих ресурсах? Все они могут быть прочитаны и записаны, т.е. к ним ко всем могут быть применены операции чтения и записи. Сила потоков PHP как раз и заключается в том, что вы можете получить доступ ко всем этим ресурсам, используя один и тот же набор функций. Это очень удобно. Также, если вдруг возникнет такая необходимость, Вы можете написать свою собственную реализацию обработчика потоков «stream wrapper». Помимо чтения и записи, потоки в PHP также позволяет выполнять другие операции, такие как переименование и удаление.
Однако, учтите, что не все протоколы и обработчики могут работать у Вас, так как поддержка некоторых оболочек зависит от Ваших настроек. Поэтому, чтобы узнать какие протоколы поддерживаются необходимо выполнить следующий скрипт:
Контексты потоков PHP
Часто возникает необходимость указания дополнительных параметров при http-запросе. Контексты потоков решают эту проблему, позволяя указать дополнительные параметры. У многих функций, поддерживающих работу с потоками, есть необязательный параметр контекста потока. Давайте посмотрим на функцию file_get_contents():
Как видно, третьим параметром передается контекст потока. Контексты создаются с помощью функции stream_context_create(), которая принимает массив и возвращает ресурс контекста.
array(
‘method’ => «GET»,
‘header’ => «Accept-language: en\r\n».
«Cookie: foo = bar\r\n»
)
);
Таким образом, сегодня мы узнали, что такое потоки и контексты потоков в PHP, рассмотрели примеры их использования, а в следующих статьях мы поговорим о метаданных потока и создадим свой собственный обработчик.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.
Строку в поток php
Уже открытый поток ввода ( stdin ). Это предотвращает необходимость его открывать следующим способом:
Уже открытый поток вывода ( stdout ). Это предотвращает необходимость его открывать следующим способом:
Уже открытый поток ошибок ( stderr ). Это предотвращает необходимость его открывать следующим способом:
User Contributed Notes 6 notes
The command line interface data in STDIN is not made available until return is pressed.
By adding «readline_callback_handler_install(», function()<>);» before reading STDIN for the first time single key presses can be captured.
Note: This only seems to work under Linux CLI and will not work in Apache or Windows CLI.
This cam be used to obscure a password or used with ‘stream_select’ to make a non blocking keyboard monitor.
Please remember in multi-process applications (which are best suited under CLI), that I/O operations often will BLOCK signals from being processed.
For instance, if you have a parent waiting on fread(STDIN), it won’t handle SIGCHLD, even if you defined a signal handler for it, until after the call to fread has returned.
Your solution in this case is to wait on stream_select() to find out whether reading will block. Waiting on stream_select(), critically, does NOT BLOCK signals from being processed.
// Get the path to the current console for STDOUT so we can reconnect later!
$strOldSTDOUT =( posix_ttyname ( STDOUT ));
echo( «This will go to the current console\r\n» );
// Close the STDOUT resource
fclose ( STDOUT );
The following code shows how to test for input on STDIN. In this case, we were looking for CSV data, so we use fgetcsv to read STDIN, if it creates an array, we assume CVS input on STDIN, if no array was created, we assume there’s no input from STDIN, and look, later, to an argument with a CSV file name.
Note, without the stream_set_blocking() call, fgetcsv() hangs on STDIN, awaiting input from the user, which isn’t useful as we’re looking for a piped file. If it isn’t here already, it isn’t going to be.
Строку в поток php
php:// — Доступ к различным потокам ввода-вывода
Описание
PHP предоставляет несколько разнообразных потоков ввода-вывода, которые позволяют получить доступ к собственным потокам ввода-вывода PHP, к дескрипторам стандартного ввода, вывода и потока ошибок, к временным файловым потокам в памяти и на диске, и фильтрам, которые могут манипулировать другими файловыми ресурсами по мере их считывания или записи.
php://stdin, php://stdout и php://stderr
Поток php://stdin предназначен только для чтения, тогда как php://stdout и php://stderr предназначены только для записи.
php://input
php://output
php://fd
php://fd предоставляет прямой доступ к указанному файловому дескриптору. Например, php://fd/3 относится к файловому дескриптору 3.
php://memory и php://temp
php://filter
Поток php://filter принимает следующие параметры как часть своего пути. В одном пути можно указать несколько цепочек фильтров. Пожалуйста, ознакомьтесь с примерами и особенностями при использовании этих параметров.
Опции
Примеры
Пример #1 php://temp/maxmemory
Этот необязательный параметр позволяет установить лимит памяти до того, как php://temp начнёт использовать временный файл.
Пример #2 php://filter/resource=
Этот параметр должен быть расположен в конце вашей спецификации php://filter и должен указывать на поток, который вы хотите фильтровать.
/* Это просто эквивалентно:
readfile(«http://www.example.com»);
так как на самом деле фильтры не указаны */
Пример #3 php://filter/read=
/* Этот скрипт выведет содержимое
www.example.com полностью в верхнем регистре */
readfile ( «php://filter/read=string.toupper/resource=http://www.example.com» );
/* Этот скрипт делает тоже самое, что вверхний, но
будет также кодировать алгоритмом ROT13 */
readfile ( «php://filter/read=string.toupper|string.rot13/resource=http://www.example.com» );
?>
Пример #4 php://filter/write=
php:// — Доступ к различным потокам ввода-вывода
Описание
PHP предоставляет несколько разнообразных потоков ввода-вывода, которые позволяют получить доступ к собственным потокам ввода-вывода PHP,к дескрипторам стандартного ввода, вывода и потока ошибок, к временным файловым потокам в памяти и на диске, и фильтрам, которые могут манипулировать другими файловыми ресурсами по мере их считывания или записи.
php://stdin, php://stdout и php://stderr
Поток php://stdin предназначен только для чтения, тогда как php://stdout и php://stderr предназначены только для записи.
php://input
Замечание: До версии PHP 5.6, поток, открытый с php://input может быть прочтен только один раз. Поток не поддерживает операции поиска. Тем не менее, в зависимости от реализации SAPI интерфейса, может быть возможно открыть другой поток php://input и повторить чтение. Это возможно только если тело запроса заранее сохраняется. Это типично для случая с POST-запросом, но не для других методов запросов, таких как PUT или PROPFIND.
php://output
php://fd
php://fd предоставляет прямой доступ к указанному файловому дескриптору. Например, php://fd/3 относится к файловому дескриптору 3.
php://memory и php://temp
php://filter
Поток php://filter принимает следующие параметры как часть своего пути. В одном пути можно указать несколько цепочек фильтров. Пожалуйста, ознакомьтесь с примерами и особенностями при использовании этих параметров.
| Название | Описание |
|---|---|
| resource= | Этот параметр является необходимым. Он указывает потоку, что его необходимо отфильтровать. |
| read= | Этот параметр является необязательным. Одно или более имен фильтров может быть указано здесь, разделенные вертикальной чертой (|). |
| write= | Этот параметр является необязательным. Одно или более имен фильтров может быть указано здесь, разделенные вертикальной чертой (|). |
| Любой список фильтров, которые используются без префиксов read= или write=, будет применен к обоим потокам на чтение и на запись при необходимости. |
Опции
| Атрибут | Поддержка |
|---|---|
| Ограничение по allow_url_fopen | Нет |
| Ограничение по allow_url_include | только php://input, php://stdin, php://memory и php://temp. |
| Чтение | только php://stdin, php://input, php://fd, php://memory и php://temp. |
| Запись | только php://stdout, php://stderr, php://output, php://fd, php://memory и php://temp. |
| Добавление | только php://stdout, php://stderr, php://output, php://fd, php://memory и php://temp. (Эквивалентно записи) |
| Одновременное чтение и запись | только php://fd, php://memory и php://temp. |
| Поддержка stat() | только php://memory и php://temp. |
| Поддержка unlink() | Нет |
| Поддержка rename() | Нет |
| Поддержка mkdir() | Нет |
| Поддержка rmdir() | Нет |
| Поддержка stream_select() | только php://stdin, php://stdout, php://stderr, php://fd и php://temp. |
Список изменений
Примеры
Пример #1 php://temp/maxmemory
Этот необязательный параметр позволяет установить лимит памяти до того, как php://temp начнет использовать временный файл.
Пример #2 php://filter/resource=
Этот параметр должен быть расположен в конце вашей спецификации php://filter и должен указывать на поток, который вы хотите фильтровать.
/* Это просто эквивалентно:
readfile(«http://www.example.com»);
так как на самом деле фильтры не указаны */
Пример #3 php://filter/read=
Этот параметр принимает один или более имен фильтров, разделенных вертикальной чертой |.
/* Этот скрипт выведет содержимое
www.example.com полностью в верхнем регистре */
readfile ( «php://filter/read=string.toupper/resource=http://www.example.com» );
/* Этот скрипт делает тоже самое, что вверхний, но
будет также кодировать алгоритмом ROT13 */
readfile ( «php://filter/read=string.toupper|string.rot13/resource=http://www.example.com» );
?>
Пример #4 php://filter/write=
Этот параметр принимает один или более имен фильтров, разделенных вертикальной чертой |.
Понимание потоков в PHP
Потоки ресурсов, предоставляемые PHP, которые мы зачастую используем — невидимые, но они могут быть очень мощным инструментом.
В руководстве по PHP описано много потоков:
Понимание потоков в PHP
Потоки были введены начиная с PHP 4.3.0, как способ обобщения файлов в сети, сжатие данных и для других операции, которые используют общий набор функций. В самом простом определении, stream — resource — это объекты, в которых экспонируется потоковое поведение. Это значит, что его можно прочитать или записать линейным способом, и может быть в состоянии fseek() для произвольного расположения внутри потока.
Каждый поток имеет реализацию Wrapper (обёртка), в которой существует дополнительный код, необходимый для обработки конкретного протокола или кодирования. PHP предоставляет несколько встроенных обёрток и мы легко можем создать и зарегистрировать собственные. Мы даже можем изменить или улучшить поведение обёрток, использовав контексты и фильтры.
Основы потока
По умолчанию обёртка file:// — это означает, что мы используем поток, каждый раз, когда мы получаем доступ к файловой системе. Мы можем написать к примеру readfile(‘/path/to/somefile.txt’) или readfile(‘file:///path/to/somefile.txt’) и получить тот же результат. Если мы используем readfile(‘http://google.com/’) тогда мы скажем PHP использовать HTTP обёртки потока.
Мои установки выглядят так:
Неплохой набор, не правда ли?
php://Wrapper
Давайте сделаем краткий тест с использованием cURL:
Результат print_r($_POST ) реагирования PHP скрипт будет:
Первый пример использует фильтр, чтобы закодировать данные, записанные на диск, а второй применяет два каскадных фильтра для чтения с удаленного URL-адреса. Результат может быть простым и очень мощным в наших приложениях.
Создать контекст потока
Контекст потока определен набором параметров, которые могут изменять и улучшать поведение наших обёрток. В контексте общего пользования является изменение обёртки HTTP. Это позволяет нам избежать использование cURL для простых сетевых операций.
В этом примере содержимое передается в теле запроса, так что удаленный скрипт будет использовать php://input чтобы прочитать его. Мы можем получить доступ к заголовку, используя apache_request_headers() и получаем:
Мы изменили параметры контекста по умолчанию, но мы можем создать альтернативные контексты и использовать по отдельности, вот так:
Заключение
В следующей статье, мы можем создавать пользовательские оболочки и фильтры для нашего приложения, которые реализуются собственные форматы файлов и кодировки.

