采用 PEAR 来缓冲 PHP 程序(一)

程序

PHP 世界中缓冲是一个热门的话题,因为 PHP 产生的动态页面,每次用户请求都需要重新计算,不论请求的结果是否一样,同时,PHP 每次都会编译一次脚本。这样的超负荷运转对一个流量很高的网站来说肯定难以忍受。幸运的是, Web 的结果可以缓冲,而不需要重新运行和编译脚本,商品化的产品像 ZendCache 或者开源的 Alternate PHP Cache都提供了把 PHP 脚本编译为字节代码并缓冲的办法。

PEAR 的缓冲包提供了缓冲动态内容,数据库查询和 PHP 函数调用的框架。

就像 Perl 有 CPAN, TeX 有 CTAN,PHP 也有自己的中心资源库,存放类,库和模块。这个库称为 PEAR(PHP Extension and Add-On Repository)。

本文假设你已经安装了 PEAR 环境,如果没有的话,可以去 PHP 网站下载。

PEAR 的缓冲包包含一个总体的缓冲类和几个特别的子类。缓冲类使用容器类来存贮和管理缓冲数据。

下面是 PEAR 缓冲当前所包含的容器,以及各自的参数:

file -- file 容器在文件系统存储了缓冲的数据,是最快的容器。

cache_dir -- 这是容器存储文件的目录。

filename_prefix -- 缓冲文件的前缀,例如:"cache_"。

shm -- shm 容器把缓冲数据放入共享内存,基准测试显示,目前的实现下,这个容器的速度要比文件容器慢。

shm_key -- 共享内存使用的键值。

shm_perm -- 使用共享内存数据段的权限。

shm_size -- 分配共享内存的大小。

sem_key -- 信号灯的键值。

sem_perm -- 信号灯的权限。

db -- PEAR 的数据库抽象层。

dsn -- 数据库连接的 DSN 。可以参考 PEAR 的 DB 文档。

cache_table -- 表的名字。

phplib -- phplib 容器使用数据库抽象层存储缓冲。

db_class

db_file

db_path

local_file

local_path

ext/dbx -- PHP 的数据库抽象层扩展,如果像把缓冲存入数据库,可以采用这个容器。

module

host

db

username

password

cache_table

persistent

使用 PEAR Cache 所得到的性能提升取决于你所选择的缓冲容器,例如,把数据库的结果再次存入数据库缓冲中就显得毫无意义。

PEAR Cache 的函数缓冲模块能把任何函数或者方法的结果缓冲,不论是 PHP 的内置函数还是用户自定义函数,他缺省采用文件容器,把缓冲数据放入到一个叫做
function_cache 的目录。

Cache_Function 类的构造器可以有三个可选的参数:

$container :缓冲容器的名字。

$container_options :缓冲容器的数组参数。

$expires:缓冲对象过期的时间(秒数)。

普通的函数调用采用 Cache_Function 类的 call() 方法时,就能触发缓冲。调用 call() 很容易,的一个参数是函数的名字,然后是函数的参数,第二个参数是要调用函数中的第一个,依此类推,我们来看例子:

例 1: 缓冲函数和方法的调用

// 调用 PEAR Cache 的函数缓冲。

<?php
require_once ’Cache/Function.php’;

// 定义一些类和函数。

class foo {
function bar($test) {
echo "foo::bar($test)<br>";
}
}

class bar {
function foobar($object) {
echo ’$’.$object.’->foobar(’.$object.’)
’;
}
}

$bar = new bar;

function foobar() {
echo ’foobar()’;
}

// 取得 Cache_Function 对象

$cache = new Cache_Function();

// 对 foo 类的静态函数 bar() 作缓冲(foo::bar())。
$cache->call(’foo::bar’, ’test’);

// $bar->foobar()
$cache->call(’bar->foobar’, ’bar’);

$cache->call(’foobar’);
?>

下面我们采用 Cache_Output 来把输出作缓冲:

例子 2: 缓冲脚本的输出

// 加载 PEAR Cache 的输出缓冲

<?php
require_once ’Cache/Output.php’;

$cache = new Cache_Output(’file’, array(’cache_dir’ => ’.’) );

// 计算要缓冲页面的标记,我们假定页面的缓冲取决于
// URL, HTTP GET 和 POST 变量以及 cookies。

$cache_id = $cache->generateID(array(’url’ => $REQUEST_URI, ’post’ => $HTTP_POST_VARS, ’cookies’ => $HTTP_COOKIE_VARS) );

// 查询缓冲

if ($content = $cache->start($cache_id)) {

// 缓冲命中
echo $content;
die();
}

// 缓冲丢失

// -- 在这里插入内容产生代码 --

// 把页面存入缓冲
echo $cache->end();
?>

利用 Cache_Output 类,很容易把一个动态的数据库驱动的网站应用转化为静态,从而极大的提升站点的性能。

越来越多的站点在采用 GZIP 压缩 HTML 内容,这样减少了服务器的带宽消耗,对于使用 Modem 上网的用户来说也能受益不少。

Cache_OutputCompression 扩展了 Cache_Output 类的功能,他把 GZIP 压缩的 HTML 内容进行缓冲,从而节省了 CPU 压缩的时间。

待续...

时间: 2024-08-17 13:57:42

采用 PEAR 来缓冲 PHP 程序(一)的相关文章

采用PEAR来缓冲PHP程序

PHP 世界中缓冲是一个热门的话题,因为 PHP 产生的动态页面,每次用户请求都需要重新计算,不论请求的结果是否一样,同时,PHP 每次都会编译一次脚本.这样的超负荷运转对一个流量很高的网站来说肯定难以忍受.幸运的是, Web 的结果可以缓冲,而不需要重新运行和编译脚本,商品化的产品像 ZendCache 或者开源的 Alternate PHP Cache都提供了把 PHP 脚本编译为字节代码并缓冲的办法.PEAR 的缓冲包提供了缓冲动态内容,数据库查询和 PHP 函数调用的框架.就像 Perl

采用 PEAR 来缓冲 PHP 程序(二)

程序 最后,我们来定制一个应用,综合的来解释 PEAR 缓冲机制的整体框架. 我们定义一个叫做 MySQL_Query_Cache 的类,缓冲 SELECT 的查询结果. 我们首先定义类的变量: <?php require_once 'Cache.php'; class MySQL_Query_Cache extends Cache {var $connection = null;var $expires = 3600; var $cursor = 0;var $result = array()

Pear Benchmarking测试PHP程序效率

以前都是自己用microtime()鼓捣的,不好用,显示结果也不够清晰明了. 记得pear里面有个Benchmarking类可以搞定,一直没时间尝试下,终于刚才尝试了下,很好用,呵呵 先安装Benchmarking pear install Benchmarking#命令行下安装Benchmarking Benchmarking中有3个php文件,分别是: Benchmark_Timer 这个包里面最基本的类. 执行简单的函数去记录总的时间和设定的代码片段时间. Benchmark_Profil

用Pear加速PHP程序开发

程序 及时交付应用程序是确定解决方案采用何种技术的关键所在,PHP借助于PEAR(PHP Extension and Application Repository:PHP扩展与应用库)会大大促进其开发过程.PEAR是一种代码库,它为标准程序功能提供预先编写的类,从而大大降低了应用程序的开发时间.PEAR在概念上类同于Perl的CPAN,PEAR包含了具有丰富特性的功能函数,包括数据库.邮件和错误处理等.在采用PEAR的情况下,开发人员就可以部署和增强已经编写的基本函数同时把注意力集中到编写程序新

《UNIXLinux程序设计教程》一2.7 流缓冲

2.7 流缓冲 每一个流都有一个输入输出缓冲区.写入流的字符并不立即写到文件中,而是先在缓冲区中聚集为一块,然后异步地以块为单位传送到文件.类似地,从流读出的字符也不是逐个地从文件中读出,而是以块为单位从文件读到缓冲区,然后从缓冲区传送给进程.这种处理方式称为缓冲. 采用缓冲的目的是为了减少调用低级I/O函数(如read()和write())的次数,因为这些真正读写文件的函数是系统调用,它们是较费时间的操作.例如,对于存储在硬盘上的文件,当进程用read()或write()读写数据时,设备驱动程

.NET客户端应用程序:.NET应用程序更新组件(1)

程序|客户端 作者:Jamie Cool Microsoft Corporation 3/4/02 翻译:李嘉 北京.东方瑞道 2004-6-1 译者小记:智能升级.自动更新,这是我们以前开发Windows应用程序时经常碰到而且必须注意的问题.在.NET应用程序更新组件没有出现之前这个问题曾经令人非常头疼(除非你就不打算进行升级:)).谁又不希望自己开发的应用程序象Windows XP自身或Microsoft Money那样具备自动更新的功能呢?使用.NET应用程序更新组件将会使这一切变得非常简

用vfp与sql server构建Client/Server应用程序(远程视图)(4)

缓冲(Buffering) Visual FoxPro 中的缓冲技术 当远端数据下载到客户端时,这些数据就被压入缓冲之中.在客户端用户对数据的各种移动并不反映到数据源,而是在用户确认对数据的变动后,才把各种变动以SQL描述的形式发送到后端.那么为什么不让Visual FoxPro直接一步一动的操控远程数据,就像在不使用缓冲技术控制Visual FoxPro本地数据那样.我想原因在于: 在 Client/Server 构架的应用中,数据库服务器需要同时处理许多客户的请求,如果有一个客户"直接&qu

模型驱动的云安全性-利用云应用程序安全策略自动化提高云安全性

安全性是采用云技术所必需的一个要素,缺乏安全性通常会阻碍云技术的采用.然而,随着安全策略和合规复杂性.IT 复杂性和 IT 敏捷性的增加,将安全策略转化为安全实现的任务变得更加耗时.重复.昂贵且容易出错,并且很容易增加最终用户组织的安全工作量.自动化可帮助最终用户组织(和云提供商)减少该工作量,并提高策略实施准确度.本文将重点介绍一个特别有趣的.富有挑战且经常被遗忘的话题:应用程序层的安全策略自动化. 云应用程序安全性自动化 应用程序安全策略自动化主要是一个自动化流程,将人类可理解的安全需求(比

深入学习JavaFX脚本语言(面向Swing程序员) ---(上)

内容 比较声明式语法与过程式语法 为程序增加动态行为 学习更多的JavaFX GUI组件 关于译者 比较声明式语法和过程式语法 正像我们在前一节所看到的,JavaFX语言提供了一种声明式语法来表达结构和用户接口组件的内容.为了帮助你理解,让我们以纯过程的方式重写上面的程序,就像我们在编写Swing程序时经常做的那样: var win = new Frame(); win.title = "Hello World JavaFX"; win.width = 200; var label =