Szukaj…


Składnia

  • Każdy strumień ma schemat i cel:
  • <scheme>: // <target>

Parametry

Nazwa parametru Opis
Strumień zasobów Dostawca danych składający się ze składni <scheme>://<target>

Uwagi

Strumienie są zasadniczo transferem danych między miejscem pochodzenia a miejscem docelowym, aby sparafrazować Josha Lockharta w jego książce Modern PHP.

Pochodzenie i miejsce docelowe mogą być

  • plik
  • proces wiersza poleceń
  • połączenie sieciowe
  • archiwum ZIP lub TAR
  • pamięć tymczasowa
  • standardowe wejście / wyjście

lub dowolny inny zasób dostępny za pośrednictwem owijarek strumieniowych PHP .

Przykłady dostępnych opakowań ( schemes ):

  • file: // - Dostęp do lokalnego systemu plików
  • http: // - Dostęp do adresów URL HTTP
  • ftp: // - Dostęp do adresów URL FTP
  • php: // - Dostęp do różnych strumieni we / wy
  • phar: // - Archiwum PHP
  • ssh2: // - Secure Shell 2
  • ogg: // - Strumienie audio

Schemat (pochodzenie) jest identyfikatorem opakowania strumienia. Na przykład dla systemu file:// jest to file:// . Celem jest źródło danych strumienia, na przykład nazwa pliku.

Rejestrowanie opakowania strumienia

Opakowanie strumieniowe zapewnia moduł obsługi dla jednego lub więcej określonych schematów.

Poniższy przykład pokazuje proste opakowanie strumienia, które wysyła żądania PATCH HTTP, gdy strumień jest zamknięty.

// 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);
    }
}

Ten przykład pokazuje tylko niektóre przykłady tego, co zawiera ogólne opakowanie strumieniowe. Nie wszystkie metody są dostępne. Pełna lista metod, które można zaimplementować, znajduje się na stronie http://php.net/streamWrapper .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow