Streams ist ein leistungsstarkes Tool, das von PHP bereitgestellt wird. Wir verwenden es oft aus Versehen. Wenn wir es gut nutzen, wird es die Produktivität von PHP erheblich verbessern. Wenn Sie die Leistungsfähigkeit von Streams nutzen, heben Sie Ihre Anwendungen auf die nächste Stufe.
Im Folgenden finden Sie eine Beschreibung von Streams aus dem PHP-Handbuch:
Streams wurde in PHP Version 4.3.0 eingeführt. Es dient zur Vereinheitlichung der Betriebsmethoden von Dateien, Netzwerken, Datenkomprimierung usw. und bietet eine Reihe gemeinsamer Funktionsschnittstellen für diese Dateivorgänge. Kurz gesagt ist ein Stream ein Ressourcenobjekt mit Streaming-Verhalten. Mit anderen Worten: Wir können den Stream linear lesen und schreiben. Und Sie können fseek() verwenden, um zu jeder Position im Stream zu springen.
Jedes Streams-Objekt verfügt über eine Wrapper-Klasse, in der Code für die Handhabung spezieller Protokolle und Codierungen hinzugefügt werden kann. PHP hat einige häufig verwendete Verpackungsklassen integriert, und wir können auch benutzerdefinierte Verpackungsklassen erstellen und registrieren. Wir können die Wrapper-Klasse sogar mithilfe vorhandener Kontexte und Filter ändern und erweitern.
Stream-Grundlagen
Der Stream kann über :// referenziert werden. Unter ihnen ist der Name der Verpackungsklasse, und der Inhalt in wird durch die Syntax der verschiedenen Verpackungsklassen angegeben.
Die Standardverpackungsklasse von PHP ist file://, was bedeutet, dass wir beim Zugriff auf das Dateisystem tatsächlich einen Stream verwenden. Wir können den Inhalt der Datei auf die folgenden zwei Arten lesen: readfile('/path/to/somefile.txt') oder readfile('file:///path/to/somefile.txt'). . Wenn Sie readfile('http://google.com/') verwenden, wählt PHP die HTTP-Stream-Wrapper-Klasse aus, die ausgeführt werden soll.
Wie oben erwähnt, bietet PHP viele integrierte Paketklassen, Protokolle und Filter. Mit der unten beschriebenen Methode können Sie die von dieser Maschine unterstützten Verpackungsklassen abfragen:
1
2
3
4
|
<?php
print_r(stream_get_transports());
print_r(stream_get_wrappers());
print_r(stream_get_filters());
|
1
<🎜>
<🎜>
2
<🎜>
<🎜>
3
<🎜>
<🎜>
4
<🎜>
|
<🎜>
<🎜>
<?php
<🎜>
<🎜>
print_r(stream_get_transports());
<🎜>
<🎜>
print_r(stream_get_wrappers());
<🎜>
<🎜>
print_r(stream_get_filters());
<🎜>
<🎜>
|
Die Ausgabe auf meiner Maschine ist:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
einundzwanzig
zweiundzwanzig
dreiundzwanzig
vierundzwanzig
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
Array
(
[0] => tcp
[1] => udp
[2] => unix
[3] => udg
[4] => ssl
[5] => sslv3
[6] => sslv2
[7] => tls
)
Array
(
[0] => https
[1] => ftps
[2] => compress.zlib
[3] => compress.bzip2
[4] => php
[5] => file
[6] => glob
[7] => data
[8] => http
[9] => ftp
[10] => zip
[11] => phar
)
Array
(
[0] => zlib.*
[1] => bzip2.*
[2] => convert.iconv.*
[3] => string.rot13
[4] => string.toupper
[5] => string.tolower
[6] => string. strip_tags
[7] => convert.*
[8] => consumed
[9] => dechunk
[10] => mcrypt.*
[11] => mdecrypt.*
)
|
Es sind viele Funktionen vorhanden. Sieht es nicht gut aus?
Zusätzlich zum oben genannten integrierten Stream können wir auch weitere Streams von Drittanbietern für Amazon S3, MS Excel, Google Storage, Dropbox und sogar Twitter schreiben.
php:// Verpackungsklasse
PHP verfügt über eine integrierte Wrapper-Klasse für die Verarbeitung von I/O-Streams in dieser Sprache. Es kann in mehrere Kategorien unterteilt werden: php://stdin, php://stdout und php://stderr. Gleichzeitig stellt PHP auch die Eingabe php:// bereit, über die schreibgeschützt auf den Rohtext in der POST-Anfrage zugegriffen werden kann. Dies ist eine sehr nützliche Funktion, insbesondere wenn es um Remote-Dienste geht, die Datennutzlasten in POST-Anfragen einbetten.
Im Folgenden verwenden wir das cURL-Tool, um einen einfachen Test durchzuführen:
1
|
curl -d "Hello World" -d "foo=bar&name=John" <a href= "http://localhost/dev/streams/php_input.php" >http://localhost/dev/streams/php_input.php</a>
|
1
|
curl -d "Hallo Welt" -d "foo=bar&name=John" <a href= "http://localhost/dev/streams/php_input.php" >http://localhost/dev/streams/php_input.php< ;/a>
1
2
3
4
5
|
Array
(
[foo] => bar
[name] => John
)
|
Die Testergebnisse der Verwendung von print_r($_POST) im PHP-Skript lauten wie folgt:
1
|
Hello World&foo=bar&name=John
|
1
2
3
1
2
3
4
5
6
|
<?php
// Write encoded data
file_put_contents ( "php://filter/write=string.rot13/resource=file:///path/to/somefile.txt" , "Hello World" );
// Read data and encode/decode
readfile( "php://filter/read=string.toupper|string.rot13/resource=http://www.google.com" );
|
4
<🎜>
<🎜>
5
<🎜>
<🎜>
|
<🎜>
<🎜>
Array
<🎜>
<🎜>
(
<🎜>
<🎜>
<🎜>[foo] => bar
[name] => John
Wir beachten, dass auf das erste Datenelement im Array $_POST nicht zugegriffen werden kann. Wenn wir jedoch readfile('php://input') verwenden, ist das Ergebnis anders:
1
|
Hallo Welt&foo=bar&name=John
PHP 5.1 fügt zwei weitere Paketklassen hinzu, php://memory und php://tempstream, zum Lesen und Schreiben temporärer Daten. Wie der Name der Wrapper-Klasse andeutet, werden diese Daten im Speicher oder in temporären Dateien im zugrunde liegenden System gespeichert.
php://filter ist eine Metapaketklasse, die zum Hinzufügen von Filterfunktionen zu Streams verwendet wird. Der Filter wird aktiviert, wenn ein Stream mit readfile() oder file_get_contents()/stream_get_contents() geöffnet wird. Hier ist ein Beispiel:
1
2
3
4
5
6
|
<?php
<🎜>
<🎜>
//Codierte Daten schreiben
<🎜>
<🎜>
file_put_contents ( "php://filter/write=string.rot13/resource=file:///path/to/somefile.txt" , "Hallo Welt" );
<🎜>
<🎜>
<🎜>
<🎜>
// Daten lesen und kodieren/dekodieren
<🎜>
<🎜>
readfile( "php://filter/read=string.toupper|string.rot13/resource=http://www.google.com" );
<🎜>
<🎜>
<🎜>
<🎜>
<🎜>
<🎜>
Im ersten Beispiel wird ein Filter verwendet, um die auf der Festplatte gespeicherten Daten zu kodieren. Im zweiten Beispiel werden zwei kaskadierte Filter verwendet, um die Daten von der Remote-URL zu lesen. Die Verwendung von Filtern kann Ihrer Anwendung äußerst leistungsstarke Funktionen verleihen.
Stream-Kontext
Der Kontext ist eine Reihe streambezogener Parameter oder Optionen. Verwenden Sie den Kontext, um das Verhalten der Wrapper-Klasse zu ändern oder zu verbessern. Beispielsweise ist die Verwendung von Kontext zum Ändern des HTTP-Wrappers ein häufig verwendetes Verwendungsszenario. Auf diese Weise können wir einige einfache Netzwerkvorgänge ausführen, ohne das cURL-Tool zu verwenden. Hier ist ein Beispiel:
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php
$opts = array (
'http' => array (
'method' => "POST" ,
'header' => "Auth: SecretAuthTokenrn" .
"Content-type: application/x-www-form-urlencodedrn" .
"Content-length: " . strlen ( "Hello World" ),
'content' => 'Hello World'
)
);
$default = stream_context_get_default( $opts );
readfile( 'http://localhost/dev/streams/php_input.php' );
|
1
2
3
4
5
1
2
3
4
5
6
7
|
Array
(
[Host] => localhost
[Auth] => SecretAuthToken
[Content-type] => application/x-www-form-urlencoded
[Content-length] => 11
)
|
6
7
8
9
10
11
12
|
<?php
<🎜>
<🎜>
$opts = array (
<🎜>
<🎜>
'http' => array (
'method' => "POST" ,
'header' => "Auth: SecretAuthTokenrn" .
"Content-type: application/x-www-form-urlencodedrn" .
"Content-length: " strlen ( "Hallo Welt " ),
'content' => 'Hallo Welt'
)
);
$default = stream_context_get_default( $opts );
readfile( 'http://localhost/dev/streams/php_input.php' );
|
Zuerst müssen Sie ein Optionsarray definieren, bei dem es sich um ein zweistelliges Array handelt. Auf die Parameter kann in der Form $array['wrapper']['option_name'] zugegriffen werden. (Beachten Sie, dass die Kontextoptionen in jeder Wrapper-Klasse unterschiedlich sind). Rufen Sie dann stream_context_get_default() auf, um diese Optionen festzulegen. Stream_context_get_default() gibt als Ergebnis auch den Standardkontext zurück. Nachdem die Einstellung abgeschlossen ist, rufen Sie readfile () auf und der gerade festgelegte Kontext wird zum Erfassen des Inhalts verwendet.
Im obigen Beispiel ist der Inhalt in den Anforderungstext eingebettet, sodass Remote-Skripte php://input verwenden können, um den Inhalt zu lesen. Gleichzeitig können wir auch apache_request_headers() verwenden, um den Anforderungsheader abzurufen, wie unten gezeigt:
1
2
3
4
5
6
7
|
Array
(
[Host] => localhost
[Auth] => SecretAuthToken
[Content-type] => application/x-www-form-urlencoded
[Content-length] => 11
)
|
Im obigen Beispiel werden die Parameter des Standardkontexts geändert. Natürlich können wir auch einen neuen Kontext erstellen und diesen alternativ verwenden.
1
2
3
|
<?php
$alternative = stream_context_create( $other_opts );
readfile( 'http://localhost/dev/streams/php_input.php' , false, $alternative );
|
1
2
3
|
<?php
$alternative = stream_context_create( $other_opts );
readfile( 'http://localhost/dev/streams/php_input.php' , false, $alternative );
|
abschließend
Wie nutzen wir die Kraft von Streams in der realen Welt? Welche praktischen Vorteile kann die Verwendung von Streams für unsere Programme bringen? Wie bereits erwähnt, abstrahiert Stream alle dateisystembezogenen Funktionen. Das erste Anwendungsszenario, an das ich denke, besteht darin, die Wrapper-Klasse des virtuellen Dateisystems zu verwenden, um auf Dienste zuzugreifen, die von PaaS-Anbietern bereitgestellt werden, z. B. auf HeroKu oder AppFog, keines davon tatsächlich ein echtes Dateisystem haben. Mithilfe von Streams können wir unsere Anwendung mit nur geringfügigen Änderungen in die Cloud portieren. Als nächstes – in meinem nächsten Artikel – werde ich beschreiben, wie man benutzerdefinierte Wrapper-Klassen schreibt, um mit speziellen Dateiformaten und Kodierungsformaten zu arbeiten.
Oben wurde eine detaillierte Erklärung der Verwendung von Streams in PHP vorgestellt, einschließlich verschiedener Aspekte. Ich hoffe, dass sie für Freunde, die sich für PHP-Tutorials interessieren, hilfreich sein wird.
|
|
|
|