Maison  >  Article  >  développement back-end  >  À propos de l'analyse de l'outil Streams en PHP

À propos de l'analyse de l'outil Streams en PHP

不言
不言original
2018-06-21 10:21:361068parcourir

Cet article présente principalement l'outil Streams en PHP, qui est principalement utilisé pour gérer les classes d'empaquetage en PHP. Les amis qui en ont besoin peuvent s'y référer

Streams est un outil puissant fourni par PHP. Vous l'utiliserez par inadvertance, mais si vous en faites bon usage, cela améliorera grandement la productivité de PHP. Exploiter la puissance de Streams fera passer vos applications au niveau supérieur.

Ce qui suit est une description de Streams dans le manuel PHP :

  • Streams a été introduit dans la version PHP 4.3.0. Il est utilisé pour unifier les fichiers, les réseaux, etc. Le mode de fonctionnement de la compression de données et d'autres fichiers de classe fournit un ensemble d'interfaces de fonctions communes pour ces opérations sur les fichiers de classe. En bref, un flux est un objet ressource avec un comportement de streaming. En d’autres termes, nous pouvons lire et écrire dans le flux de manière linéaire. Et vous pouvez utiliser fseek() pour accéder à n'importe quelle position dans le flux.

Chaque objet Streams possède une classe wrapper, dans laquelle le code pertinent pour la gestion des protocoles et des encodages spéciaux peut être ajouté. Certaines classes d'empaquetage couramment utilisées ont été intégrées à PHP, et nous pouvons également créer et enregistrer des classes d'empaquetage personnalisées. Nous pouvons même modifier et améliorer la classe wrapper en utilisant le contexte et les filtres existants.

Bases du flux

Le flux peut être référencé via e8ecf1fabecb2bbf3952eba1f0f8a7ec://b4bef09dd2761803871f1d83e55d08b2. Parmi eux, e8ecf1fabecb2bbf3952eba1f0f8a7ec est le nom de la classe d'empaquetage, et le contenu de b4bef09dd2761803871f1d83e55d08b2 est spécifié par la syntaxe de la classe d'empaquetage. La syntaxe des différentes classes d'empaquetage sera différente.

La classe d'empaquetage par défaut de PHP est file://, ce qui signifie que lorsque nous accédons au système de fichiers, nous utilisons en fait un flux. Nous pouvons lire le contenu du fichier des deux manières suivantes, readfile('/path/to/somefile.txt') ou readfile('file:///path/to/somefile.txt'). Les méthodes sont équivalentes. . Si vous utilisez readfile('http://google.com/'), alors PHP sélectionnera la classe wrapper de flux HTTP à utiliser.

Comme mentionné ci-dessus, PHP fournit de nombreuses classes de packages, protocoles et filtres intégrés. Selon la méthode décrite ci-dessous, vous pouvez interroger les classes de packaging supportées par cette machine :

<?php
print_r(stream_get_transports());
print_r(stream_get_wrappers());
print_r(stream_get_filters());

Le résultat de sortie sur ma machine est :

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.*
)

Il offre beaucoup de fonctions, n'est-ce pas beau ?

En plus des flux intégrés ci-dessus, nous pouvons également écrire davantage de flux tiers pour Amazon S3, MS Excel, Google Storage, Dropbox et même Twitter.

php:// wrapper class

PHP a des classes wrapper intégrées pour gérer les flux d'E/S dans ce langage. Il peut être divisé en plusieurs catégories. Les plus basiques sont php://stdin, php://stdout et php://stderr. Ces trois flux sont respectivement mappés aux ressources d'E/S par défaut. Dans le même temps, PHP fournit également php://input, via lequel le corps brut de la requête POST est accessible en lecture seule. Il s'agit d'une fonctionnalité très utile, en particulier lorsqu'il s'agit de services distants qui intègrent des charges utiles de données dans les requêtes POST.

Ci-dessous, nous utilisons l'outil cURL pour faire un test simple :

curl -d "Hello World" -d "foo=bar&name=John" http://localhost/dev/streams/php_input.php

Utilisez print_r($ dans le script PHP _POST) les résultats des tests sont les suivants :

Array
(
  [foo] => bar
  [name] => John
)

On note que la première donnée n'est pas accessible dans le tableau $_POST. Mais si on utilise readfile('php://input'), le résultat est différent :

Hello World&foo=bar&name=John

PHP 5.1 ajoute php Les deux les classes de package ://memory et php://tempstream sont utilisées pour lire et écrire des données temporaires. Comme le nom de la classe wrapper l'indique, ces données sont stockées en mémoire ou dans des fichiers temporaires du système sous-jacent.

php://filter est une classe de méta-package utilisée pour ajouter une fonctionnalité de filtre au flux. Le filtre sera activé lors de l'ouverture d'un flux en utilisant readfile() ou file_get_contents()/stream_get_contents(). Voici un exemple :

<?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");

Dans le premier exemple, un filtre est utilisé pour encoder les données enregistrées sur le disque, dans les deux. Par exemple, deux filtres en cascade sont utilisés pour lire les données de l'URL distante. L'utilisation de filtres peut apporter des fonctionnalités extrêmement puissantes à votre application.

Contexte du flux

Le contexte est un ensemble de paramètres ou d'options liés au flux. Utilisez le contexte pour modifier ou améliorer le comportement de la classe wrapper. Par exemple, l'utilisation du contexte pour modifier le wrapper HTTP est un scénario d'utilisation couramment utilisé. De cette façon, nous pouvons effectuer quelques opérations réseau simples sans utiliser l'outil cURL. Voici un exemple :

<?php
$opts = array(
 &#39;http&#39;=>array(
  &#39;method&#39;=>"POST",
  &#39;header&#39;=> "Auth: SecretAuthTokenrn" .
    "Content-type: application/x-www-form-urlencodedrn" .
       "Content-length: " . strlen("Hello World"),
  &#39;content&#39; => &#39;Hello World&#39;
 )
);
$default = stream_context_get_default($opts);
readfile(&#39;http://localhost/dev/streams/php_input.php&#39;);

Tout d'abord, définissez un tableau d'options, qui est un tableau à deux chiffres. Vous pouvez transmettre $array. ['wrapper' ]['option_name'] pour accéder aux paramètres. (Notez que les options de contexte dans chaque classe wrapper sont différentes). Appelez ensuite stream_context_get_default() pour définir ces options. stream_context_get_default() renverra également le contexte par défaut. Une fois le réglage terminé, appelez readfile() et le contexte que vous venez de définir sera utilisé pour capturer le contenu.

在上面的例子中,内容被嵌入到request的body中,这样远端的脚本就可以使用php://input来读取这些内容。同时,我们还能使用apache_request_headers()来获取request的header,如下所示:

Array
(
  [Host] => localhost
  [Auth] => SecretAuthToken
  [Content-type] => application/x-www-form-urlencoded
  [Content-length] => 11
)

在上面的例子中是修改默认context的参数,当然我们也可以创建一个新的context,进行交替使用。 

<?php
$alternative = stream_context_create($other_opts);
readfile(&#39;http://localhost/dev/streams/php_input.php&#39;, false, $alternative);

结论

我们怎样在现实世界中驾驭stream的强大力量呢?使用stream能为我们的程序带来什么现实的好处? 正如前文介绍的那样,stream对所有文件系统相关的功能进行了抽象,所以我第一个想到的应用场景是使用虚拟文件系统的包装类来访问PaaS供应商提供的服务,比如说访问HeroKu或者AppFog,它们实际上都没有真正文件系统。 使用stream只要对我们的应用程序稍作修改,就可以将其移植到云端。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于php_pdo 预处理语句的解析

PHP针对伪静态注入的解析

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn