PHP
Streams
Поиск…
Синтаксис
- У каждого потока есть схема и цель:
- <Схема>: // <цель>
параметры
Имя параметра | Описание |
---|---|
Ресурс потока | Поставщик данных, состоящий из синтаксиса <scheme>://<target> |
замечания
Потоки - это, по сути, передача данных между источником и пунктом назначения, перефразируя Джоша Локхарта в его книге «Современный PHP».
Происхождение и пункт назначения могут быть
- файл
- процесс командной строки
- сетевое соединение
- архив ZIP или TAR
- временная память
- стандартный ввод / вывод
или любой другой ресурс, доступный через обтекатели потоков PHP .
Примеры доступных потоковых оболочек ( schemes
):
- file: // - Доступ к локальной файловой системе
- http: // - Доступ к URL-адресам HTTP (-ов)
- ftp: // - Доступ к FTP-адресам
- php: // - Доступ к различным потокам ввода-вывода
- phar: // - Архив PHP
- ssh2: // - Secure Shell 2
- ogg: // - Аудиопотоки
Схема (origin) - это идентификатор обертки потока. Например, для файловой системы это file://
. Цель - источник данных потока, например имя файла.
Регистрация обтекателя потока
Обтекатель потока предоставляет обработчик для одной или нескольких конкретных схем.
В приведенном ниже примере показана простая обтекатель потоков, которая отправляет HTTP-запросы PATCH
когда поток закрыт.
// register the FooWrapper class as a wrapper for foo:// URLs.
stream_wrapper_register("foo", FooWrapper::class, STREAM_IS_URL) or die("Duplicate stream wrapper registered");
class FooWrapper {
// this will be modified by PHP to show the context passed in the current call.
public $context;
// this is used in this example internally to store the URL
private $url;
// when fopen() with a protocol for this wrapper is called, this method can be implemented to store data like the host.
public function stream_open(string $path, string $mode, int $options, string &$openedPath) : bool {
$url = parse_url($path);
if($url === false) return false;
$this->url = $url["host"] . "/" . $url["path"];
return true;
}
// handles calls to fwrite() on this stream
public function stream_write(string $data) : int {
$this->buffer .= $data;
return strlen($data);
}
// handles calls to fclose() on this stream
public function stream_close() {
$curl = curl_init("http://" . $this->url);
curl_setopt($curl, CURLOPT_POSTFIELDS, $this->buffer);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PATCH");
curl_exec($curl);
curl_close($curl);
$this->buffer = "";
}
// fallback exception handler if an unsupported operation is attempted.
// this is not necessary.
public function __call($name, $args) {
throw new \RuntimeException("This wrapper does not support $name");
}
// this is called when unlink("foo://something-else") is called.
public function unlink(string $path) {
$url = parse_url($path);
$curl = curl_init("http://" . $url["host"] . "/" . $url["path"]);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_exec($curl);
curl_close($curl);
}
}
В этом примере показаны только некоторые примеры того, что будет содержать общая оболочка потока. Это не все доступные методы. Полный список методов, которые можно реализовать, можно найти по адресу http://php.net/streamWrapper .