php中stream的用法_php实例_脚本之家

上边是一个应用socket来抓取多少的例证:

过滤器流最切合做的就是文件格式调换了,富含压缩,编解码等,除了这个“边门”的用法外,filter流更管用的三个地点在于调节和测量试验和日志功用,举例说在socket开荒中,注册叁个过滤器流举行log记录。比方上边包车型大巴例证:

意料之中,大家会想到定义自个儿的过滤器,这一个也轻便:

在上面包车型客车事例中,尽管大家把过滤器的类别设置为STREAM_FILTER_ALL,即同不经常候作用在读写流上,那么读写的数额都将被rot13过滤器管理,大家读出的多少就和写入的固有数据是同意气风发的。

介意:过滤器名能够随便取。

复制代码 代码如下:new
DataOutputStream(new BufferedOutputStream(new FileOutputStream;

复制代码 代码如下:class md5_filter
extends php_user_filter{ function filter($in, $out, &$consumed,
$closing) { while ($bucket = stream_bucket_make_writeable {
$bucket->data = md5; $consumed += $bucket->datalen;
stream_bucket_append; }

//数据管理成功,可供别的管道读取 return PSFS_PASS_ON;
}}stream_filter_register(“string.md5”, “md5_filter”);

我们也得以用stream_socket
完毕,那很简短,只需求开垦socket的代码换到下边包车型大巴就能够:

复制代码 代码如下:$fp = fopen;

能够这么使用:

复制代码 代码如下:$opts = array
(‘http’=>array( ‘method’ => ‘POST’, ‘header’=> “Content-type:
application/x-www-form-urlencodedrn” . “Content-Length: ” . strlen .
“rn”, ‘content’ => $data));

/* 把rot13过滤器成效在写入流上 */stream_filter_append($fp,
“string.rot13”, STREAM_FILTER_WRITE);

复制代码 代码如下:streamlist =
stream_get_filters();print_r;

您恐怕会古怪stream_filter_append中的
“string.rot13″这几个变量来的无缘无故,那实在是PHP内置的一个过滤器。

$context =
stream_context_create;file_get_contents(‘//www.jb51.net/news’,
false, $context);

今后就能够使用”string.md5″这些我们自定义的过滤器了。

复制代码 代码如下:Array( [0] =>
convert.iconv.* [1] => mcrypt.* [2] => mdecrypt.* [3]
=> string.rot13 [4] => string.toupper [5] => string.tolower
[6] => string.strip_tags [7] => convert.* [8] =>
consumed [9] => dechunk [10] => zlib.* [11] => bzip2.*)

// output:Guvf vf n grfg

fclose;

输出:

PHP里的流和Java里的流实际上是同一个概念,只是轻易了少数。由于PHP重要用来Web开采,所以“流”那块的概念被波及的超少。如若有Java底子,对于PHP里的流就更便于明白了。其实PHP里的无数高端性子,举个例子SPL,相当,过滤器等都参照了Java的落到实处,在见识和规律上如出一辙。

我们能够通过多少个例证先来打探stream连串函数的行使。

复制代码
代码如下:stream_filter_prepend($fp, “string.md5”,
STREAM_FILTER_WRITE,$callback);

利用上面包车型客车法门就可以打字与印刷出PHP内置的流:

Java里也可能有和其千篇后生可畏律的代码:

/* 写入的数码通过rot13过滤器的管理*/fwrite($fp, “This is a
testn”);rewind;

本条过滤器既能够对输入流进行拍卖,仍然是能够回调三个函数来开展日志记录。

举这几个事例,一方面是印证PHP和Java在众多方面包车型大巴概念是风华正茂律的,驾驭生机勃勃种语言对精通此外一门语言会有相当的大的支援;其他方面,这几个事例也推进大家下边要提到的过滤器流-filter。其实也是意气风发种设计情势的展示。

$data=http_build_query;$fp = fsockopen(“nowamagic.net”, 80, $errno,
$errstr, 5);

fwrite;while { echo fgets;}

File[] files = f.listFiles;

复制代码 代码如下:$post_ =array
(‘author’ =>
‘Gonn’,’mail’=>’gonn@nowamagic.net’,’url’=>”);

$callback = function{ file_put_contents(“c:log.txt”,date;};

复制代码 代码如下:class
RecursiveFileFilterIterator extends FilterIterator{ // 满意条件的扩展名
protected $ext = array;

地点提到的多少个stream类别的函数都以近乎包装器的流,效能在某种公约的输入输出流上。那样的行使办法和定义,其实和Java中的流并未大的界别,比如Java中时时有那般的写法:

for { if { System.out.print; } else { System.out.print; }

再来看二个stream的事例:

复制代码 代码如下:class md5_filter
extends php_user_filter{ public function filter($in, $out, &$consumed,
$closing) { $data=””; while ($bucket = stream_bucket_make_writeable {
$bucket->data = md5; $consumed += $bucket->datalen;
stream_bucket_append; }

/* 读取写入的数量,独到的当然是被管理过的字符了 */fpassthru;

细心第八个参数,$context,即HTTP流上下文,能够通晓为套在file_get_contents函数上的生机勃勃根管道。同理,大家还足以创设FTP流,socket流,并把其套在相应的函数在。

$out=”POST
HTTP/1.1rn”;$out.=”Host: typecho.orgrn”;$out.=”User-Agent:
Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.13)
Gecko/20101203 Firefox/3.6.13″.”rn”;$out.=”Content-type:
application/x-www-form-urlencodedrn”;$out.=”PHPSESSID=082b0cc33cc7e6df1f87502c456c3eb0rn”;$out.=”Content-Length:
” . strlen . “rn”;$out.=”Connection:
closernrn”;$out.=$data.”rnrn”;

在Java里,流是一个很要紧的定义。

更加的多关于
stream_context_create,能够参谋:PHP函数补完:stream_context_create()模拟POST/GET。

复制代码 代码如下:$fp =
stream_socket_client(“tcp://nowamagic.net:80”, $errno, $errstr, 3);

复制代码 代码如下:public class
DirectoryContents{ public static void main throws IOException { File f =
new File; // current directory

// 实例化foreach (new RecursiveFileFilterIterator as $item){ echo $item
. PHP_EOL;}

System.out.println(file.getCanonicalPath; } }}

call_user_func; return PSFS_PASS_ON; }}

后生可畏层流嵌套着其余大器晚成层流,和PHP里有不约而合之妙。

笔者们再来看个过滤器流的机能:

PHP中的stream流体系函数中还会有三个比较重大的流,便是包装类流
streamWrapper。使用包装流能够使得分裂类别的合计利用相符的接口垄断数据。

流的概念来源于UNIX中管道的定义。在UNIX中,管道是一条不间断的字节流,用来贯彻程序或进程间的通信,或读写外围设备、外界文件等。依据流的动向又足以分为输入流和输出流,同一时间可以在其外围再套上别的流,比方缓冲流,那样就足以得到越多流管理措施。

比方上面是大器晚成段PHP SPL标准库的用法:

/** * 提供 $path 并生成对应的目录迭代器 */ public function
__construct { parent::__construct(new RecursiveIteratorIterator(new
RecursiveDirectoryIterator; }

file_get_contents函数通平常用来读取文件内容,但以此函数也能够用来抓取远程url,起到和curl近似的法力。

/** * 检查文件增加名是或不是满意条件 */ public function accept() { $item
= $this->getInnerIterator(); if && in_array(pathinfo,
PATHINFO_EXTENSION), $this->ext)) { return TRUE; } }}

FilenameFilter textFilter = new FilenameFilter() { public boolean
accept(File dir, String name) { String lowercaseName =
name.toLowerCase(); if (lowercaseName.endsWith { return true; } else {
return false; } } };

那个过滤器的写法看起来相当有一些糊里糊涂,事实上大家只须要看一下php_user_filter那几个类的结会谈松手药方法即摸底了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章