我们在google ob_start的时候,大家肯定会发现好多文章都说这个是“用PHP控制您的浏览器cache”,包括那个中文的php站点亦是如此,这个中文翻译,如果不是当初我去看php.net,依然会把我搞在云里雾里,不知道是翻译的人是不明白ob_start的意思还是不小心给翻译错了,从而一直延续下来了。稍微熟悉php或者b/s结构的朋友就知道,php怎么可能去控制浏览器的缓存,那些所谓控制缓存失效的代码也并非是php直接控制的,而是通过http的header头告诉浏览器页面的缓存如何设置。而这个ob_start根本就和浏览器扯不上关系,还居然用“用PHP控制您的浏览器cache”,我认为这样说是相当不负责的。 (read on …)
那些误导人的手册翻译
本地服务器搭建详解
本来前面已经写过相关的文章了(参见:wamp集成环境和php平台的搭建),可是最近还是不断有朋友问我BH上可不可以调试程序,当然我都会回答不可以,因为Bluehost的CPU控制机制很严格的,只要程序执行时超过30秒的CPU占用,则网站在接下来的几分钟之内都会被挂起,所以一个简单的while死循环都能轻松的将在BH上的站点搞崩,因此程序调试是绝对不允许的。换一个角度来说,在服务器上调试是相当不方便的,而且很浪费时间,如果能在本地搭建一个平台,还有必要去服务器调试么?有人可能会说我想测试兼容不兼容,一般来说,如果你的php会出现不兼容国外的虚拟主机了,只能说明你的程序有问题,因为国外的虚拟主机支持都很完善的,不像一些国内的虚拟主机,关闭了一大堆函数,事实如此,并非崇洋媚外,呵呵。下面我就详细的用图片介绍如何搭建一个本地的web服务器,这次介绍主要是基于wamp这款优秀的集成软件,而且搭建出来的服务器将支持urlrewrite,甚至通过插件的扩展还能支持更多的功能,总之,能用来调试几乎所有的PHP程序。 (read on …)
我的blog需要缓存么
为什么需要缓存,缓存的目的就是加速页面的载入,因此使用缓存之后,你的请求将会直接去获取html文件,传统的动态页面从数据库中获取数据,然后用程序将数据显示出来的这个过程就被绕过去了,而这个过程是最消耗系统资源的过程,静态页面传送过程中,系统I/O所占用的资源相比之下就可以忽略了。当然,更传统的其实还是静态页面,因为它出现在动态页面之前。有人说用缓存更新不及时,不够快,所以很不方便,这也是很有道理的,但是仅仅是因为这样就放弃使用缓存,或许不太划算,特别是在你服务器压力比较大的情况下。就说wordpress吧,他的这点交互,完全可以不用担心这点,你依然可以使用缓存插件,为了更好的说明这个问题,我下面来假设一个完美的缓存系统。 (read on …)
PEAR教程2.Pear的Cache介绍
前面介绍了pear的安装,今天开始介绍pear的几个知名的package之一,如果有不清楚的地方请站内搜索“PEAR教程”获取前面的教程!
今天我们要介绍的是PEAR的Cache_Lite包,做web的说到提速眼睛瞪大的程度绝不亚于男人见到绝色美女时眼睛所瞪大的程度,因此,我这里第一个要介绍的就是PEAR的Cache_lite包,利用这个package可以根据你的需要缓存网页的任何一个部分,从而大大的提高了页面的生成和载入速度!
首先去Pear的List Packages下载Cache_Lite这个安装包,写这个教程的时候,稳定的版本是1.7.2,所以我们就下载这个版本,下载下来后解压缩,然后将文件放置在PEAR的根目录下(文件目录如何组织,后面有介绍),然后我们去manual对应的章节看看如何使用。那些关于包的介绍你可以先看看,我们这里没有前戏,直接切入主题,下面是Cache_Lite::get() 的例子。我们就从这个例子入手,我在例子中增加了中文的注释
require_once "Cache/Lite.php";//这里是相对PEAR的地址,找到刚才下载的包中Lite.php这个文件后你就应该知道如何部署这个文件夹了!
$options = array(
'cacheDir' => '/tmp/',//这里是Cache的路径,最好用绝对路径,我们的例子中将会有说明
'lifeTime' =>7200,//缓存的失效时间,秒为单位
'pearErrorMode' =>CACHE_LITE_ERROR_DIE//报错模式
);
$cache = new Cache_Lite($options);//参数设置完之后建立缓存
if ($data = $cache->get('id_of_the_page')) {//如果id=id_of_the_page这个缓存存在的话,则直接将缓存数据echo出来
// Cache hit !
// Content is in $data
// (...)
} else {//缓存不存在,则生成缓存
// No valid cache found (you have to make and save the page)
// (...)
}
看了上面的这个例子,是不是发现很简单?其实缓存的关键之处不在于如何生成和删除缓存,而在于如何平衡缓存静止和动态的关系,如何在适当的时候重建缓存。下面我开始举例,让大家体会到缓存的好处!,请在tutor(我们教程中的例子对应的根目录)下建立文件cache,*nix操作系统请设置属性为0777,然后在tutor文件夹下建立cache.php,输入下面的代码
< ?php
require_once "config.php";
require_once "Cache/Lite.php";
//下面的代码是计算页面执行时间,和cache无关
function get_microtime()
{
list($usec, $sec) = explode(' ', microtime());
return ((float)$usec + (float)$sec);
}
$s = get_microtime();
//下面是缓存的设置
$options = array(
'cacheDir' => WEB_DIR."/cache/",
//请在tutor(我们教程中的例子对应的根目录)
//下建立文件cache,
//*nix操作系统请设置属性为0777
'lifeTime' => 10,//10秒失效时间
'pearErrorMode' => CACHE_LITE_ERROR_DIE
);
$cache = new Cache_Lite($options);
$cache_id = 'cache';//id一定要唯一
//否则会和别人的cache出现冲突
if ($data = $cache->get($cache_id)) {
//data是获取数据的结果,如果缓存存在并且没有过期,
//直接取出数据
echo $data;
} else {
//否则我们建立缓存
//下面我们故意用循环来耗时
while( $i < 10000000)
$i ++ ;
$data = '缓存建立的时间:'.date("Y-m-d H:i:s");
$data .="
没有缓存执行的时间是:".( get_microtime() - $s)."秒";
echo $data;
$cache->save($data);
}
echo "
当前页面耗时:".( get_microtime() - $s)."秒
";
?>
在浏览器中运行http://127.0.0.1/tutor/cache.php,然后看看cache的目录下是不是生成了一个文件,很有成就感吧?!
在web页面我们发现第一次运行的时间用时大约1秒,缓存生成之后用时则只为原来的1/1000,这样的效率就不需要我再多余描述了吧!!其实上面这个例子的大体流程是,1.建立缓存参数,包括缓存的ID;2.根据参数和ID检查缓存是否存在,如果存在,则缓存数据被获取在$data变量中,然后echo出来,否则重新生成缓存,将页面的结果保存在变量中,然后将变量的数据写入缓存。不过这样的方式很不方便,因为所有的输出我们必须将其写到一个变量中,这样其实是比较麻烦的,要用到很多字符串连接,代码很难维护,当然简单的cache最好还是建议采用这样的方式。不过你别担心,强大的PEAR不会这么弱智的,所以它也提供了另外一种方式,其实就是获取缓冲区取出变量的方式,下面看看这个简单的例子,对应的manual章节在这里。
< ?php
require_once "config.php";
require_once "Cache/Lite/Output.php";
//注意,这里require的文件不一样了哦
$options = array(
'cacheDir' => WEB_DIR."/cache/",
'lifeTime' => 10,//10秒失效时间
'pearErrorMode' => CACHE_LITE_ERROR_DIE
);
$cache = new Cache_Lite_Output($options);
$cache_id = 'obcache';
if (!($cache->start($cache_id ))) {
//如果不存在,则建立缓存,存在的话,程序自动就将缓存输出了
?>
这里你想干什么就干什么,
包括执行php
包括数据库查询
只要是php允许的都可以在这里完成
是不是很方便呢
< ?php
$cache->end();//这个千万别忘记了,
//否则缓存永远建立不成功,
//这个函数就是在出来output buffer
}
?>
再去看看cache的目录下是不是又多了一个文件?
cache就介绍到这里,下面有几个需要注意的地方:
1.cache的ID一定要唯一,可以将一些参数集成进来
2.cache的缓存路径最好写绝对路径
3.本节的重点在于注释,请仔细阅读注释
另外,通过我的介绍,如何删除缓存大家可以去看看对应的手册了,上面的例子在于抛砖引玉,如果上面的例子你会用了,接下的缓存操作应该不是难事了。
php初级教程电子书发布
多谢seavin的努力,将php初级教程做了校正,并且将零散的教程做成了统一的电子书籍,书籍做得很漂亮,再次感谢seavin。
这个电子书籍适合php入门者,本人写这个教程是完全按照自己当初的学习路线来进行的。在这个教程中,我对学习过程中遇到的弯路做了相应的说明,譬如文件夹的建立,目录的规划,配置文件的设计等等,旨在让初学者少走弯路,毕竟几乎没有一个学校会有这样的课程的,下面是下载地址:
exe格式:php-manual-for-beginner-exe.zip chm格式:php-manual-for-beginner-chm.zip
BloggerMap 新增友情链接功能
通过在bloggermap.org的帐户管理->我的好友 接栏目中,用户可以方便的将自己的友情链接地图集成近来了,效果请看本站的blogroll,下面介绍详细步骤:
- 登陆bloggermap.org,未注册用户请先注册;
- 进入我的好友添加好友blog,添加好友的方式有两种:
- 通过搜索关键字,查找bloggermap中的blog,然后添加,具体步骤如下图所示:

输入关键字,点击search,搜索出相应的blog

选择中意的blog,然后点击添加好友即可 - 通过链接导入方式加入,输入你的友情链接页面的地址,如下图所示:

点击导入可以预览程序采集到的链接,但是不需要人工干预,程序会自动识别链接的有效性。
然后点击添加好友即可将对应页面的链接导入进来,当然能导入的链接必须是在bloggermap登记过的blog
- 通过搜索关键字,查找bloggermap中的blog,然后添加,具体步骤如下图所示:
- bloggermap允许你将友情链接的地图嵌入到你的blog中,也可以直接放置一个链接链接到你的bloggermap友情链接页面,你可以选择你喜欢的方式链接到地图。

PEAR教程1.Pear的介绍和安装
我认为学习php至少有三个境界:
- 初级阶段。会用php编写简单的网站,会用php实现一般的功能。这个时候,往往什么代码都自己来实现,不太习惯也不太会用现成的库,而且一直都认为自己写代码的比成熟的库要方便得多,并且写代码的时候不太在乎效率。
- 中级状态。 会用成熟的库,写代码会考虑到效率,并且主导思想是能用库的就用库,而且这个阶段的phper一般都比较熟悉客户端的技术,譬如css,js等等,当然php程序员会html描述语言那是必须的!
- 高级阶段。会按照一些标准写成熟的库,会按照需要实现能实现的一切,程序的效率无可挑剔,往往是某些成熟库的贡献者。
上面是我大致的总结。其实php和其他语言一样,也有很多成熟优秀的库可以直接使用,并且使用这些库可以大大的提高你的开发效率,而且这些库中的优秀代码风格、优秀的思想都可以作为我们进一步学习的参照,因此,我打算给大家介绍一下这个知名的PHP库-PEAR,其实这个东西自己看手册都是可以上手的,但是很多朋友就是不太爱看手册,可能对那些繁琐的手册有严重的抵触心理吧,不过我这次对PEAR的介绍就根据手册来进行,而且使用在线手册,这样就能方便的引用链接。然后一步一步进行,希望能给一些朋友做一个正确的引导。
首先请大家打开这个链接http://pear.php.net/manual/en/我们来看看PEAR到底是什么东西,点击Chapter 1. Introduction。
PEAR is short for “PHP Extension and Application Repository” and is pronounced just like the fruit. The purpose of PEAR is to provide: Pear是”PHP Extension and Application Repository”的缩写,发音和英语单词“梨”一样,所以你看到这个网站的标志就是一个梨子。
- * A structured library of open-source code for PHP users 所有php开发者都可以使用的开源代码的库
- * A system for code distribution and package maintenance 是一个代码分发的打包系统
- * A standard style for code written in PHP, specified here是一个php代码格式的标准
- * The PHP Extension Community Library (PECL), see more below是一个PECL的库
- …
一句话,PEAR就是一个强大的php库,我的bloggermap也是使用的这个库,而且这个库的package很齐全,包括数据库、表单的生成、缓存应有尽有,后面我会逐步的给大家介绍。
读者要求:1.会搭建WAMP(window+apache+mysql+php)服务器。2.会简单的php 3.愿意使用PEAR
下面介绍一下PEAR的安装(这个很重要):
首先说说php的include的路径问题,这个和java的classpath比较类似,有默认的path,比如说php.ini设置了几个默认的路径/etc/include 或者 /etc/DEMO,那么在php的代码中,如果有类似“include ‘file.php’;”的包含语句,程序执行的时候就会在当前文件夹下搜索是否有file.php这个文件,如果没有,再去搜索/etc/include 或者 /etc/DEMO文件夹下是否有这个文件,如果依然没有,则报错!
对于国外的虚拟主机,很多都安装了PEAR的,而且安装的PEAR package都很齐全,所以你在php文件中引用 include “PEAR.php”,程序就会根据php.ini找到PEAR的路径而引用进来,但是如果虚拟主机未安装PEAR,就得我们自己安装了。
安装PEAR是一个很简单的过程,大可不必害怕,下面还是引导大家去看帮助手册,链接在这里(由于很多人弄不清楚PEAR的文件结构,所以这个manual被删除了),不过没有关系,可以去这个链接看看。可能很少有人有耐心看下去,反正我是看不下去的,其实最关键的就是这一行,那就是告诉你添加php的默认include路径的方法
<?php
ini_set('include_path', '~/pear/lib' . PATH_SEPARATOR
. ini_get('include_path'));
// From PHP 4.3.0 onward, you can use the following,
// which especially useful on shared hosts:
set_include_path('~/pear/lib' . PATH_SEPARATOR
. get_include_path());
?>
好了,开始介绍安装步骤吧:
- 首先在网站的根目录下建议文件夹“tutor”,然后建立一个文件夹inc,下载PEAR,目前最新版的下载地址是http://download.pear.php.net/package/PEAR-1.6.1.tgz。
- 下载完毕解压缩,将PEAR放在inc 目录下,展开的目录如图:

- tutor下建立文件demo.php,和一个空的config.php。demo.php的内容如下:
< ?php
include 'config.php';
include 'PEAR.php';
?>
然后访问http://127.0.0.1/tutor/demo.php,此时会出现错误提示:include路径有错误 - 所以这个时候我们要在config中配置好PEAR的include路径(类似java的classpath),打开config.php,添加代码如下
< ?php再次打开http://127.0.0.1/tutor/demo.php,发现什么样?错误消失了!
define('WEB_DIR',$_SERVER["DOCUMENT_ROOT"]."/tutor");//定义当前网站的根目录的路径
define('PEAR_DIR',WEB_DIR.'/inc/PEAR-1.6.1');//PEAR目录的路径
ini_set('include_path', PEAR_DIR . PATH_SEPARATOR . ini_get('include_path'));//这就是定义PEAR的路径
?> - 至此,PEAR安装结束
或许你已经很激动的期待如何应用PEAR了,不过别急啊,我要休息嘛,你可以自己先摸索摸索,等待下一步教程。
——————————–华丽的分界线———————————–
欢迎兄弟们纠错,语言奖励,呵呵!
谈谈程序的效率
随着考虑的越来越周全,cos-html-cache对数据库的查询越来越多,虽然这个不影响阅读者的效率,但是管理人员在后台批量更新缓存的时候问题就出来了,特别是对于bluehost和hostmonste这种对CPU执行时间有限制的虚拟主机,问题就更加明显了,如果网络速度慢或者批量更新的数目太大,就会造成CPU超标,所以如果你还在使用cos-html-cache,请更新的时候一次少更新点,50篇一般不会出问题的! (read on …)
