简介 xcache

PHP 是一种非常流行的开发 Web 应用程序的程序设计语言,每次 HTTP请求调用时,PHP 代码都会被解析和翻译为操作码(PHP 引擎直接执行的原语指令 —— 类似于汇编语言)再执行。在要求很低或可忽略的情况下,服务器看上去能立即执行这个复杂的解释过程。但是一旦处理的页面增加,就会对服务器造成很大的负担。在某些情况下,“编译” PHP 代码的时间会远远超过执行该代码所需的时间。因此,当需求增加时,您常常会自食其果,因为处理这些不断解释和动态生成的页面需要消耗更多的系统资源。

节约 CPU 周期减少运行 PHP 应用程序所需的重复工作,没有必要每次都把同样的 PHP 代码翻译一遍。PHP 代码被翻译成操作码后,可以把它保存起来并重复使用,直到原始代码被修改。确实,缓存 —— 用于保存和重用 PHP 操作码 —— 是几种 PHP 加速器内部的机制,包括开源 Alternative PHP Cache (APC)、支持 PHP 的 Turck MMCache、XCache、eAccelerator和商业 Zend Platform。后三类加速器能够缓存和优化字节码,这为系统提供了更多的速度提升。

目前用于web的缓存系统很多,包括squid、varnish、Nginx自带的proxy_cache、FastCGI中的fastcgi_cache、APC、Xcache等。

像squid、varnish、Nginx自带的proxy_cache这类系统,属于重量级产品,配置维护比较麻烦,不适合小型网站,而且一般用这类系统缓存静内容,比如图片、css、javascript等;FastCGI中的fastcgi_cache,它主要用于缓存动态内容,所以在访问使用fastcgi_cache的网站时速度极快,但是笔者使用时发现其维护比较麻烦,特别是每次网站有数据要更新后,如果不等到缓冲期过期后得需要手动清除缓存才能看到网站更新的内容;至于APC个人感觉性能就一般了,拿它和Xcache比较时发现访使用Xcache网站的速度明显高于使用APC网站的速度(笔者没有具体测试),所以最终选择了使用Xcache。

我们都知道PHP是一种动态语言,它在执行时是以解释的方式执行,所以PHP代码每次执行时都会被解析和转换成操作码(opcode)。而Xcache是一个开源的操作码缓存器/优化器,它通过把解析/转换PHP后的操作码缓存到文件(直到原始代码被修改)从而避免重复的解析过程,提高了代码的执行速度,通常能够提高页面生成速率2-5倍,降低了服务器负载,提高了用户访问网站的速度。

米扑博客将探究如何安装、部署和配置 XCache。XCache 相对较新,但是很多站点使用它的效果都很好。此外,XCache 易于构建、安装和配置,因为它是做为 PHP 扩展实现的。不需对 Apache 和 PHP 进行重编译。

 

下载 xcache

官网: http://xcache.lighttpd.net

最新: XCache 3.2.0.tar.gz 发布. 增加 PHP_5_6 支持(2014-09-18

 

安装 xcache

# wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz
# tar zxvf xcache-3.2.0.tar.gz
# cd xcache-3.2.0
# /usr/local/php/bin/phpize
# ./configure --enable-xcache --enable-xcache-coverager --enable-xcache-optimizer --with-php-config=/usr/local/php/bin/php-config
# make && make install

参数解释:

--enable-xcache 表示启用Xcache支持;

--enable-xcache-coverager 表示包含用于测量加速器功效的附加特性;

--enable-xcache-optimizer 表示启用操作码优化

--with-php-config=/usr/local/php/bin/php-config 表示指定php安装的路径配置

安装完毕后系统会提示xcache.so模块生成路径,本次生成路径为/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/,然后把xcache.so移动到/usr/local/php/include/php/ext目录下。

 

配置 xcache

1. 查看配置文件 xcaceh.ini

配置php.ini文件时,可以参考xcache的配置模板xcache.ini,此文件位于Xcache安装程序中

vim xcache-3.2.0/xcache.ini

 

2. 正式配置 php.ini 

vim /usr/local/php/lib/php.ini

添加内容如下:

[xcache-common]
extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/xcache.so

[xcache.admin]
xcache.admin.enable_auth = On
xcache.admin.user = "mimvp_xcache"
xcache.admin.pass = "93161a376715ed7618796ecbd88d6fd1" 
; pass : md5(mimvp.com)

[xcache]
xcache.shm_scheme = "mmap"
xcache.size = 60M
xcache.count = 1
xcache.slots = 8K
xcache.ttl = 0
xcache.gc_interval = 0
xcache.var_size = 4M
xcache.var_count = 1
xcache.var_slots = 8K
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300
xcache.test = Off
xcache.readonly_protection = On
xcache.mmap_path = "/tmp/xcache"
xcache.coredump_directory = ""
xcache.cacher = On
xcache.stat = On
xcache.optimizer = Off

[xcache.coverager]
xcache.coverager = Off
xcache.coveragedump_directory = "/tmp/xcache_dir"

 

3. 创建缓存文件和目录

# touch /tmp/xcache
# chmod 777 /tmp/xcache

# mkdir /tmp/xcache_dir
# chmod -R 777 /tmp/xcache_dir

 

4. 生成管理员密码(MD5密文)

# echo -n "mimvp.com" | md5sum
93161a376715ed7618796ecbd88d6fd1  -

然后将上述生成的MD5密文粘贴到php.ini文件中xcache.admin.pass = ""选项(必须为32位的md5,不能是明文mimvp.com)

例如:xcache.admin.pass= "93161a376715ed7618796ecbd88d6fd1"

 

5. 配置管理员网站

# cp -r xcache-3.2.0/htdocs/  /usr/local/nginx/html/xcache          //  3.x.x 版本管理员目录为 htdocs

# cp -r xcache-1.3.0/admin/  /usr/local/nginx/html/xcache          //  1.x.x 版本管理员目录为 admin

然后重新启动PHP,

/etc/init.d/php-fpm restart

然后访问  http://localhost/xcache

用户名为 mimvp_xcache 

密码为 mimvp.com

php-xcache-huan-cun-de-pei-zhi-yu-shi-yong-01

 

另外,还可以通过phpinfo来验证PHP是否支持Xcache

php-xcache-huan-cun-de-pei-zhi-yu-shi-yong-02

 

使用 xcache

运用xcache缓存变量,例如缓存字符变量mimvp,数组变量mimvp_array,示例如下:

<?php

xcache_set('mimvp', serialize('http://mimvp.com'));
echo "mimvp : " . (unserialize(xcache_get('mimvp')));

$mimvp_array = array("blog"=>"blog.mimvp.com", "proxy"=>"proxy.mimvp.com", "money"=>"money.mimvp.com");
xcache_set('mimvp_array', $mimvp_array);
var_dump(xcache_get('mimvp_array'));

if (xcache_isset('mimvp')){
	echo 'key存在';
	var_dump(xcache_get('mimvp_array'));
	xcache_unset('mimvp_array');
} else {
	echo 'key不存在';
}

var_dump(xcache_get('mimvp_array'));	

?>

运行结果

mimvp : http://mimvp.com

/Users/homer/Documents/workspace/proxy_client/phpinfo.php:11:
array (size=3)
  'blog' => string 'blog.mimvp.com' (length=14)
  'proxy' => string 'proxy.mimvp.com' (length=15)
  'money' => string 'money.mimvp.com' (length=15)

key存在

/Users/homer/Documents/workspace/proxy_client/phpinfo.php:15:
array (size=3)
  'blog' => string 'blog.mimvp.com' (length=14)
  'proxy' => string 'proxy.mimvp.com' (length=15)
  'money' => string 'money.mimvp.com' (length=15)
/Users/homer/Documents/workspace/proxy_client/phpinfo.php:21:null

 

 

参考推荐

PHP eAccelerator 安装与使用

PHP 加锁实现并发

PHP 多线程的应用实例

PHP 多线程抓取网页

PHP Pthread多线程操作