Home  >  Article  >  Backend Development  >  About the analysis of Streams tool in PHP

About the analysis of Streams tool in PHP

不言
不言Original
2018-06-21 10:21:361115browse

This article mainly introduces the Streams tool in PHP, which is mainly used to deal with packaging classes in PHP. Friends who need it can refer to it

Streams is a powerful tool provided by PHP. We often You will use it inadvertently, but if you make good use of it, it will greatly improve the productivity of PHP. Harnessing the power of Streams will take your applications to the next level.

The following is a description of Streams in the PHP manual:

  • Streams was introduced in PHP version 4.3.0. It is used to unify files, networks, The operation mode of class files such as data compression provides a set of common function interfaces for these class file operations. In short, a stream is a resource object with streaming behavior. In other words, we can read and write to the stream in a linear manner. And you can use fseek() to jump to any position within the stream.

Each Streams object has a wrapper class, in which relevant code for handling special protocols and encodings can be added. Some commonly used packaging classes have been built into PHP, and we can also create and register custom packaging classes. We can even modify and enhance the wrapper class using existing context and filters.

Stream Basics

Stream can be referenced through e8ecf1fabecb2bbf3952eba1f0f8a7ec://b4bef09dd2761803871f1d83e55d08b2. Among them, e8ecf1fabecb2bbf3952eba1f0f8a7ec is the name of the packaging class, and the content in b4bef09dd2761803871f1d83e55d08b2 is specified by the syntax of the packaging class. The syntax of different packaging classes will be different.

PHP’s default packaging class is file://, which means that when we access the file system, we are actually using a stream. We can read the contents of the file in the following two ways, readfile('/path/to/somefile.txt') or readfile('file:///path/to/somefile.txt'). The methods are equivalent. If you use readfile('http://google.com/'), then PHP will select the HTTP stream wrapper class to operate.

As mentioned above, PHP provides many built-in package classes, protocols and filters. According to the method described below, you can query the packaging classes supported by this machine:

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

The output result on my machine is:

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

provides a lot of functions, looks pretty good, right?

In addition to the above built-in Stream, we can also write more third-party Streams for Amazon S3, MS Excel, Google Storage, Dropbox and even Twitter.

php:// Wrapper class

PHP has a built-in wrapper class for processing I/O streams in this language. It can be divided into several categories. The basic ones are php://stdin, php://stdout, and php://stderr. These three streams are mapped to default I/O resources respectively. At the same time, PHP also provides php://input, through which the raw body in the POST request can be accessed in a read-only manner. This is a very useful feature, especially when dealing with remote services that embed data payloads into POST requests.

Below we use the cURL tool to do a simple test:

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

Use print_r($_POST) in the PHP script The test results are as follows:

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

We note that the first item of data cannot be accessed in the $_POST array. But if we use readfile('php://input'), the result is different:

Hello World&foo=bar&name=John

PHP 5.1 adds php:/ The two package classes /memory and php://tempstream are used to read and write temporary data. As the name of the wrapper class implies, this data is stored in memory or temporary files in the underlying system.

php://filter is a meta-packaging class used to add filter functionality to the stream. The filter will be enabled when opening a stream using readfile() or file_get_contents()/stream_get_contents(). The following is an example:

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

In the first example, a filter is used to encode the data saved to the disk. In both examples, two cascaded filters are used to read data from a remote URL. Using filters can bring extremely powerful functionality to your application.

Stream context

Context is a set of stream-related parameters or options. Use context to modify or enhance the behavior of the wrapper class. For example, using context to modify the HTTP wrapper is a commonly used usage scenario. In this way, we can complete some simple network operations without using the cURL tool. The following is an example:

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

First you need to define an options array, which is a two-digit array that can be passed $array['wrapper'][ 'option_name'] to access the parameters. (Note that the context options in each wrapper class are different). Then call stream_context_get_default() to set these options. stream_context_get_default() will also return the default context as a result. After the setting is completed, then call readfile(), and the context just set will be used to capture the content.

在上面的例子中,内容被嵌入到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针对伪静态注入的解析

The above is the detailed content of About the analysis of Streams tool in PHP. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn