PHP
streams
Zoeken…
Syntaxis
- Elke stream heeft een schema en een doel:
- <Schema>: // <target>
parameters
Parameternaam | Beschrijving |
---|---|
Stroombron | De gegevensaanbieder die bestaat uit de syntaxis <scheme>://<target> |
Opmerkingen
Stromen zijn in wezen een overdracht van gegevens tussen een oorsprong en een bestemming, om Josh Lockhart te parafraseren in zijn boek Modern PHP.
De oorsprong en de bestemming kunnen zijn
- een bestand
- een opdrachtregelproces
- een netwerkverbinding
- een ZIP- of TAR-archief
- tijdelijk geheugen
- standaard invoer / uitvoer
of andere bronnen die beschikbaar zijn via PHP's stream wrappers .
Voorbeelden van beschikbare stream wrappers ( schemes
):
- file: // - Toegang tot lokaal bestandssysteem
- http: // - Toegang tot HTTP (s) URL's
- ftp: // - Toegang tot FTP (s) URL's
- php: // - Toegang tot verschillende I / O-streams
- phar: // - PHP-archief
- ssh2: // - Veilige shell 2
- ogg: // - Audiostreams
Het schema (oorsprong) is de identificatie van de verpakking van de stream. Voor het bestandssysteem is dit bijvoorbeeld file://
. Het doel is de gegevensbron van de stream, bijvoorbeeld de bestandsnaam.
Een streamwrapper registreren
Een streamwikkelaar biedt een handler voor een of meer specifieke schema's.
Het onderstaande voorbeeld toont een eenvoudige streamwikkelaar die PATCH
HTTP-verzoeken verzendt wanneer de stream wordt gesloten.
// 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);
}
}
Dit voorbeeld toont slechts enkele voorbeelden van wat een generieke streamwrapper zou bevatten. Dit zijn niet alle beschikbare methoden. Een volledige lijst met methoden die kunnen worden geïmplementeerd, is te vinden op http://php.net/streamWrapper .