PHP 5 支持流的封装器,流封装器是封装流的代码实现,根据协议来管理流。

PHP默认支持几种流封装器,可以在这些经常使用的协议上透明地绑定流,类似于下面的代码:
wrapper: //data name

一个封装的标准如file:// ,它简化了对需要频繁使用的本地文件的访问。

封装器适用于以下两种情况:当数据从一个数据源取得,或要向一个数据源写入时(如文件存取);另一种是使用新的访问方法(如HTTP 或FTP)存取数据。PHP5 都提供了标准化的访问方式。

PHP5 已经提供了一些预置的流包装器,这可以应付大多数的应用,我们可以通过phpinfo() 函数找到这些流包装器,例如:

1. 已注册的PHP 流包装器:php、file、http、ftp、compress.zlib、compress.bzip2

2. 已注册流的Socket传输方式:tcp、udp、unix、udg

3. 已注册的流过滤器:bzip2*,convert.iconv.*、string.rot13、string.toupper、string.tolower、string.strip_tags、convert.*、consumed、zlib.*

在PHP程序中应用封装器是很简单的,实际上我们只要能够处理file即可。下面介绍几个流封装器开发的使用例子。

1. 从一个网站获取meta标签内容

下面的脚本读取网站的HTML数据,并确定内容的meta标签,然后显示出来,代码如下:
foreach($tags as $name=>$content){
echo strtoupper($name);
echo ” = $content
“;
}
}
该脚本运行后,会显示当前网页中的meta标识符以及关键字,如果页面上没有,则不会显示内容。如果该脚本运行时间略长,则可能有一段时间是用于连接的建立和传输,此外,也需要注意比如网络原因等都会导致脚本运行失败。

2. 使用HTTP、FTP、电子邮件进行通讯

下面的脚本的功能是取得远程页面内容的网页,并转存到本地硬盘。
$file = “data/$url.html”;
$f = fopen($file,‘w’);
fwrite($f,$page);
fclose($f);
echo “文件成功写入”.filesize($file).”字节”
}
?>
这里我们仅仅用了一个内置函数:file_get_content(),它负责检查页面的尺寸大小是否小于0,如果条件满足,则将取得的网页内容以$url的名称保存,并使用filesize()函数返回页面的字节数。

1. 流数据压缩存储

我们还能对流数据进行压缩方式的保存。下面的例子进一步使用封装器compress.zlib,将流格式数据保存为压缩格式文件。
$file = “data/$url.gz”;
//加入压缩流过滤器
$f = fopen(“compress.zlib://$file”,”w”);
fwrite($f,$page);
fclose($f);
echo “文件成功写入”.filesize($file).”字节”;
}
?>

1. 上例我们已经将取得文件流的数据,并压缩保存成一个文件,我们仍然用compress.zlib对文件进行解压缩,然后我们将内容以行号分行显示出来。
//压缩后的文件名
$file = “data/$url.gz”;
$f = fopen(“compress.zlib://$file”,”w”);
fwrite($f,$page);
fclose($f);
echo “网页文件已经被压缩为:”.filesize($file).”字节”;
echo “”;
$farray = file(“compress.zlib://$file”);
//将内容以源代码形式和行号显示
foreach($farray as $num => $content){
printf(‘%o3d:%s
‘,$num,htmlspecialchars($content));
}
}
?>

实际上,压缩和解压缩的过程对用户是透明的,我们使用包装器可以让用户灵活地实现流数据的操作,封装器常用在Socket应用中。