Поиск…


Синтаксис

  • У каждого потока есть схема и цель:
  • <Схема>: // <цель>

параметры

Имя параметра Описание
Ресурс потока Поставщик данных, состоящий из синтаксиса <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 .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow