CascadiaPHP 2024

php://

php://Доступ к различным потокам ввода-вывода

Описание

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

php://stdin, php://stdout и php://stderr

Потоки php://stdin, php://stdout и php://stderr открывают прямой доступ к соответствующему потоку ввода или вывода PHP-процесса. Поток указывает на копию файлового дескриптора, поэтому, если открыть php://stdin а потом закрыть его, закроется только копия дескриптора — фактический поток, на который ссылается STDIN, останется неизменным. Рекомендуется просто использовать константы STDIN, STDOUT и STDERR вместо ручного открытия потоков через эти обёртки.

Поток php://stdin доступен только для чтения, тогда как потоки php://stdout и php://stderr — только для записи.

php://input

Поток php://input — поток только для чтения, который разрешает читать необработанные данные из тела запроса. Поток php://input недоступен в POST-запросах с типом кодирования enctype="multipart/form-data", если включили опцию enable_post_data_reading.

php://output

Поток php://output — поток только для записи, который разрешает записывать данные в механизм буфера вывода так же, как это делают языковые конструкции print и echo.

php://fd

Поток php://fd разрешает прямой доступ к файловому дескриптору. Например, php://fd/3 относится к файловому дескриптору 3.

php://memory и php://temp

Потоки php://memory и php://temp — потоки чтения и записи, которые разреашют сохранять временные данные в файлоподобной обёртке. Единственная разница между ними заключается в том, что поток php://memory будет всегда хранить данные в оперативной памяти, тогда как php://temp будет использовать временный файл, как только объем хранимой информации достигнет предопределённого предела (по умолчанию 2 МБ). Расположение этого временного файла определяется аналогично функции sys_get_temp_dir().

Ограничением памяти для потока php://temp управляют путём добавления суффикса /maxmemory:NN, где NN — максимальный размер данных в байтах для хранения в памяти перед тем как PHP создаст временный файл.

Предостережение

Отдельным PHP-модулям иногда требуется стандартный поток ввода-вывода и модули могут попытаться преобразовать заданный поток в стандартный поток ввода-вывода. Это преобразование может завершиться ошибкой для потоков памяти, поскольку для такого приведения необходима функция fopencookie() языка C. Такая функция языка C недоступна в операционных системах Windows.

php://filter

Поток php://filter — вид мета-обёртки, которая разрешает применять фильтры к потоку во время открытия. Это полезно при работе с универсальными файловыми функциями наподобие readfile(), file() и file_get_contents(), где иначе нет возможности применить фильтр к потоку до считывания содержимого.

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

Параметры для php://filter
Название Описание
resource=<поток для фильтрации> Этот параметр обязателен. Он указывает поток, который необходимо отфильтровать.
read=<список фильтров для применения к цепочке чтения> Этот параметр необязателен. Здесь можно указать одно или несколько имён фильтров через символ вертикальной черты (|).
write=<список фильтров для применения к цепочке записи> Этот параметр необязателен. Здесь можно указать одно или несколько имён фильтров через символ вертикальной черты (|).
<список фильтров для применения к обеим цепочкам> Любые списки фильтров без префикса read= или write= будут применяться как к цепочкам чтения, так и к цепочкам записи.

Опции

Краткое описание обёртки (для потока php://filter смотрите информацию по фильтруемой обёртке)
Атрибут Поддержка
Ограничение по 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 поддерживают fstat().
Поддержка unlink() Нет
Поддержка rename() Нет
Поддержка mkdir() Нет
Поддержка rmdir() Нет
Поддержка stream_select() только php://stdin, php://stdout, php://stderr, php://fd и php://temp.

Примеры

Пример #1 php://temp/maxmemory

Этот необязательный параметр разрешает установить ограничение памяти до того, как поток php://temp начнёт использовать временный файл.

<?php

// Устанавливаем предел в 5 МБ
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');

fputs($fp, "hello\n");

// Читаем то, что записали
rewind($fp);
echo
stream_get_contents($fp);

?>

Пример #2 php://filter/resource=<поток для фильтрации>

Этот параметр должен находиться в конце спецификации php://filter и указывать на поток, который необходимо отфильтровать.

<?php

/* Это просто эквивалентно:
readfile("http://www.example.com");
поскольку на самом деле фильтры не указали */

readfile("php://filter/resource=http://www.example.com");
?>

Пример #3 php://filter/read=<список фильтров для применения к цепочке чтения>

Этот параметр принимает один или более имён фильтров, разделённых вертикальной чертой |.

<?php

/* Этот скрипт выведет содержимое
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

/* Этот скрипт будет фильтровать строку "Hello World"
через фильтр rot13, затем записывать результат
в файл example.txt в текущем каталоге */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");

?>

Пример #5 php://memory и php://temp нельзя переиспользовать

Потоки php://memory и php://temp нельзя переиспользовать, то есть после закрытия потоков невозможно сослаться на них снова.

<?php

file_put_contents
('php://memory', 'PHP');
echo
file_get_contents('php://memory'); // Ничего не выведет

?>
add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top