Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung der Verwendung von Streams in PHP

Detaillierte Erklärung der Verwendung von Streams in PHP

WBOY
WBOYOriginal
2016-08-08 09:33:32938Durchsuche

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&#038;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&lt ;/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&#038;foo=bar&#038;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.
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn