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://фільтр приймає наступні параметри як частину свого шляху. В одному шляху можна вказати декілька ланцюжків фільтрів. Будь ласка, зверніться до прикладів, щоб дізнатися про особливості використання цих параметрів.

php://filter parameters Name Description resource=<stream to be filtered> This parameter is required. It specifies the stream that you would like to filter. read=<filter list to apply to read chain> This parameter is optional. One or more filter names can be provided here, separated by the pipe character (|). write=<filter list to apply to write chain> This parameter is optional. One or more filter names can be provided here, separated by the pipe character (|). <filter list to apply to both chains> Any filter lists which are not prefixed by read= or write= will be applied to both the read and write chains as appropriate.
Wrapper Summary (for php://filter, refer to the summary of the wrapper being filtered) Attribute Supported Restricted by allow_url_fopen No Restricted by allow_url_include php://input, php://stdin, php://memory and php://temp only. Allows Reading php://stdin, php://input, php://fd, php://memory and php://temp only. Allows Writing php://stdout, php://stderr, php://output, php://fd, php://memory and php://temp only. Allows Appending php://stdout, php://stderr, php://output, php://fd, php://memory and php://temp only. (Equivalent to writing) Allows Simultaneous Reading and Writing php://fd, php://memory and php://temp only. Supports stat() No. However, php://memory and php://temp support fstat(). Supports unlink() No Supports rename() No Supports mkdir() No Supports rmdir() No Supports stream_select() 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