PHP流和封装器的应用

PHP 5 支持流的封装器,流封装器是封装流的代码实现,根据协议来管理流。
PHP默认支持几种流封装器,可以在这些经常使用的协议上透明地绑定流,类似于下面的代码:
wrapper: //data name
一个封装的标准如file:// ,它简化了对需要频繁使用的本地文件的访问。
封装器适用于以下两种情况:当数据从一个数据源取得,或要向一个数据源写入时(如文件存取);另一种是使用新的访问方法(如HTTP 或FTP)存取数据。PHP5 都提供了标准化的访问方式。
PHP5 已经提供了一些预置的流包装器,这可以应付大多数的应用,我们可以通过phpinfo() 函数找到这些流包装器,例如:


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

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

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


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

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

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

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

  4. 上例我们已经将取得文件流的数据,并压缩保存成一个文件,我们仍然用compress.zlib对文件进行解压缩,然后我们将内容以行号分行显示出来。
    $url = "www.ccjk.com";
    $page = file_get_contents("http://$url");
    if(strlen($page)>0){
    //压缩后的文件名
    $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应用中。

Words translated by CCJK

146,096,379

We are Certified

Our Client Satisfaction

rating for previous quarte

4.00

Over 95% of our clients recommend our language services to others


Copyright © CCJK Technologies Co., Ltd. 2000-2017. All rights reserved.
TOP