php://
Оновлено: 09.05.2023
php:// - доступ до різних потоків вводу/виводу
PHP надає ряд різноманітних потоків вводу/виводу, які дозволяють отримати доступ до власних потоків вводу і виводу PHP, стандартних дескрипторів файлів вводу, виводу і помилок, тимчасових файлових потоків в пам'яті і на диску, а також фільтрів, які можуть маніпулювати іншими файловими ресурсами під час зчитування і запису в них.
php://stdin, php://stdout і php://stderr надають прямий доступ до відповідного потоку вводу або виводу процесу PHP. Потік посилається на дублікат дескриптора файлу, тому якщо ви відкриваєте php://stdin, а потім закриваєте його, ви закриваєте лише свою копію дескриптора - фактичний потік, на який посилається STDIN, не змінюється. Рекомендується просто використовувати константи STDIN, STDOUT і STDERR замість того, щоб вручну відкривати потоки за допомогою цих обгорток.
php://stdin доступний лише для читання, тоді як php://stdout і php://stderr доступні лише для запису.
php://input - це потік тільки для читання, який дозволяє зчитувати необроблені дані з тіла запиту. php://input недоступний з enctype="multipart/form-data".
php://output - це потік тільки для запису, який дозволяє записувати в буфер виводу так само, як print і echo.
php://fd дозволяє прямий доступ до заданого дескриптора файлу. Наприклад, php://fd/3 посилається на дескриптор файлу 3.
php://memory і php://temp - це потоки читання і запису, які дозволяють зберігати тимчасові дані у файлоподібній обгортці. Єдина відмінність між ними полягає в тому, що php://memory завжди зберігає дані в пам'яті, тоді як php://temp використовує тимчасовий файл, коли обсяг даних, що зберігаються, досягає визначеного ліміту (за замовчуванням - 2 МБ). Розташування цього тимчасового файлу визначається так само, як і у функції sys_get_temp_dir().
Обмеження пам'яті php://temp можна контролювати, додавши /maxmemory:NN, де NN - максимальний обсяг даних, який можна зберігати в пам'яті перед використанням тимчасового файлу, в байтах.
php://filter - це своєрідна мета-обгортка, призначена для застосування фільтрів до потоку під час його відкриття. Це корисно для універсальних файлових функцій, таких як readfile(), file() і file_get_contents(), де немає можливості застосувати фільтр до потоку до того, як його вміст буде прочитано.
Цільовий php://фільтр приймає наступні параметри як частину свого шляху. В одному шляху можна вказати декілька ланцюжків фільтрів. Будь ласка, зверніться до прикладів, щоб дізнатися про особливості використання цих параметрів.
resource=<stream to be filtered>
read=<filter list to apply to read chain>
|
).
write=<filter list to apply to write chain>
|
).
<filter list to apply to both chains>
read=
or write=
will be applied to both the read and
write chains as appropriate.
php://filter
, refer to the
summary of the wrapper being filtered)
php://input
,
php://stdin
,
php://memory
and
php://temp
only.
php://stdin
,
php://input
,
php://fd
,
php://memory
and
php://temp
only.
php://stdout
,
php://stderr
,
php://output
,
php://fd
,
php://memory
and
php://temp
only.
php://stdout
,
php://stderr
,
php://output
,
php://fd
,
php://memory
and
php://temp
only. (Equivalent to writing)
php://fd
,
php://memory
and
php://temp
only.
php://memory
and
php://temp
support fstat().
php://stdin
,
php://stdout
,
php://stderr
,
php://fd
and
php://temp
only.
Приклад #1 php://temp/maxmemory
Цей необов'язковий параметр дозволяє встановити ліміт пам'яті перед тим, як php://temp почне використовувати тимчасовий файл.
<?php
// Set the limit to 5 MB.
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');
fputs($fp, "hello\n");
// Read what we have written.
rewind($fp);
echo stream_get_contents($fp);
?>
Приклад #2 php://filter/resource=<потік, який потрібно відфільтрувати
Цей параметр повинен знаходитися в кінці специфікації php://filter і вказувати на потік, який ви хочете відфільтрувати.
<?php
/* This is equivalent to simply:
readfile("http://www.example.com");
since no filters are actually specified */
readfile("php://filter/resource=http://www.example.com");
?>
Приклад #3 php://filter/read=<список фільтрів для застосування до ланцюжка читання
Цей параметр приймає одне або декілька імен фільтрів, розділених символом труби |.
<?php
/* This will output the contents of
www.example.com entirely in uppercase */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");
/* This will do the same as above
but will also ROT13 encode it */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>
Приклад #4 php://filter/write=<список фільтрів для застосування до ланцюжка запису
Цей параметр приймає одне або декілька імен фільтрів, розділених символом труби |.
<?php
/* This will filter the string "Hello World"
through the rot13 filter, then write to
example.txt in the current directory */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>
Приклад #5 php://memory та php://temp не можна використовувати повторно
php://memory і php://temp не можна використовувати повторно, тобто після закриття потоків до них не можна звернутися знову.
file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // prints nothing