php web引擎缓存加速优化实践

一、 安装php引擎缓存加速器

1. php缓存加速器介绍

操作码缓存介绍

请求一个PHP程序时,PHP引擎会解析该程序,并将其编译为特定操作码,这是要执行的代码的一种二进制表示形式。随后,此操作码由PHP引擎执行并丢弃.操作码缓存将保存这个编译后的操作码,并在下一次调用该页面时重用它。这会节省很多重复编译的时间。

为了提高PHP引擎的执行效率,PHP缓存加速器设计的目的是缓存PHP解析过的操作码,这样同样的请求访问过来,PHP引擎就不需要解析转换了,可以直接调用PHP的作码,这样就提高了web服务的响应速度,从而提升了用户的访问体验。

*LAMP*环境中使用的是libphp5.so响应并处理php程序的请求、响应执行的流程大概如下:

Ø apache接收客户php程序请求

Ø apache将php程序请求程序传递给libphp5.so

Ø libphp5.so定位磁盘上的php文件,并加载到内存中。

Ø libphp5.so编译源代码成为opcode树。

Ø libphp5.so执行opcode树

*LNMP*环境中,php引擎不在使用libphp5.so模块了,而是独立启动了FCGI进程,监听响应并处理php程序的请求、响应执行的流程大概如下:

Ø Nginx接收客户php程序请求

Ø Nginx根据扩展名判断将php程序请求传递给解析PHP的FCGI

Ø PHP FPM进程读取站点磁盘上的php文件,并加载到内存中

Ø PHP FPM编译PHP源代码成为opcode树

Ø PHP FPM的引擎执行opcode树进程

PHP缓存加速器解决的就是上述第4步问题,将opcode内容进行缓存,目的是防止PHP每次请求都里复编译解析PHP程序代码,因为在高访问量的网站上,大量的重复编译会消耗很多资源和事件,所以这里面的瓶颈就是PHP的里复编译既影响了响应速度,又加重了服务器的负载,为了解决此问题,PHP加速器就这样诞生了。

*php缓存加速器种类*

eaccelerator、xcache、Zend、apc

建议选择eaccelerator、xcache,二选一,xcache>eaccelerator

*原因:xcache更快、开发更活跃。*

2. *php缓存加速器安装环境准备*

lamp/lnmp基础web环境准备

在安装php扩展及缓存加速之前,需要安装好lamp/lnmp的基本环境,例如:看见出现phpinfo的界面为确认php的正常安装,同时最好可以编写一个调用数据库的程序,例如:test_mysql.php,确认MySQL数据库也是正常的.在前面的课程里,我们己经详细讲解了lamp/lnmp的安装及配置及产品应用

*查看lanmp各编译参数*

/application/nginx/sbin/nginx -V                  #nginx
cat /application/apache/build/config.nice         #Apache
/application/php/bin/php -i| grep configure       #php
grep CONFIGURE_LINE /application/mysql/bin/mysqlbug   #mysql5.5之前
VISUAL=vim; export VISUAL;/application/mysql/bin/mysqlbug  #mysql5.5之后

*安装perl相关库*

yum install perl-CPAN -y

*解决perl编译问题**

echo $LC_ALL
echo 'export LC_ALL=C' >> /etc/profile
source /etc/profile
echo $LC_ALL

*此节不操作可能会遇到如下问题*

[root@apache ~]# /usr/local/webserver/php/bin/phpize 
Configuring for:
PHP Api Version:         20041225
Zend Module Api No:      20060613
Zend Extension Api No:   220060519
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = (unset),
        LC_ALL = (unset),
        LANG = "zh_CN.GB2312;zh_CN.UTF-8;en_US;en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = (unset),
        LC_ALL = (unset),
        LANG = "zh_CN.GB2312;zh_CN.UTF-8;en_US;en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

3. *安装php eaccelerator缓存加速模块*

*eaccelerator缓存加速插件说明*

*A PHP opcode cache / optimizer / accelerator*

eaccelerator是一个自由的开放源代码的php加速、优化和动态内容缓存的扩展模块,它可以提升php程序的缓存性能,降低PHP程序在解析时对服务器的性能开销。eaccelerator还有对PHP优化的作用,加快其执行效率。使PHP程序代码执效率能提高1-10倍。

eAccelerator的前身其实是truk-mmcache,因为开发truk-mmcache的人被Zend给招安了,所以开发已Accelerator的人继承了truk-mmcache的一些特性,设计出eAccelerator加速器。

无论如何在系统上安装eAccelerator,都有一些配里选项需要注意。配里文件通常是/etc/php.d/eacceleotor.ini。eaccelotor.shm_size定义共享高速缓存的大小,编译后的脚本就存储在这里。该值的单位是兆字节(MB)。根据您的应用程序确定恰当的大小。

eAccelerator提供了一个脚本来显示缓存的状态,其中包含内存占用,64MB是个不错的选择(eaccelerator.shm_size="64").如果您选择的值未被接受,那么必须修改内核的最大共享内存的大小.向/etc/sysctl.conf添加kernel.shmmax=67108864,运行sysctl -p来使设置生效。kemel.shmmax值的单位是字节。

如果共享内存的分配超出极限,eAccelerator必须将旧脚本从内存中清除.默认情况下,这是被禁用的;eaccelerator.shm_ttl="60"指定:当eAccelerator用完共享内存时,60秒内未被访问的所有脚本都将被清除。

另一种流行的eaccelerator替代工具是Alternative PHP cache(APC)。zend的厂商也提供了一种商业操作码缓存。

官网地址:http://eaccelerator.net/

Check out the documentation at http://github.com/eaccelerator/eaccelerator/wiki

The mailing list is available at http://groups.google.com/group/eaccelerator

*eaccelerator缓存加速插件安装*

phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块

cd /server/tools/
rz上传nginx-php-ext-soft.zip工具包
unzip nginx-php-ext-soft.zip
cd nginx-php-ext-soft
tar jxf eaccelerator-0.9.6.tar.bz2
cd eaccelerator-0.9.6
/application/php/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=/application/php/bin/php-config
make
make install
cd ..
ll /application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/ 

4. *安装xcache缓存加速模块*

*xcache插件说明*

xcache是一个又快又稳定的PHP opcode缓存器。经过良好的测试并在大流量/高负载的生产机器上稳定运行.经过(在linux上)测试并支持所有现行PHP分支的最新发布版本,如PHP_4_3 PHP_4_4 PHP_5_0 PHP_5_1 PHP_5_2 HEAD(6.x),并支持线程安全/Windows,与同类opcode缓存器相比更胜一筹,比如能够快速跟进PHP版本.详情请参http://xcache.lighttpd.net。

*Xcahce的2个特点:*

将PHP代码进行编译(表现类似于.NET和JAVA的编译,内部机制不同),这样可以不用重复读取PHP文件,加速整个程序的运行效率;

可以缓存数据到内存中,直接可以用,例如你的一些不会经常改动的数据,只用一次从数据库读取出来后保存到Xcache中,就不用再去读取数据库了(理想环境下)。

*xcache插件安装*

tar jxf xcache-1.3.2.tar.bz2
cd xcache-1.3.2
/application/php/bin/phpize
./configure --enable-xcache --with-php-config=/application/php/bin/php-config
make
make install
ll /application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
cd ..

5. *安装zend缓存及加速扩展模块*

n *zend缓存及加速插件说明*

Zend Optimizer使用优化代码的方法来提高*PHPv5.1-v5.2*应用程序的执行速度。实现的原理是对那些在被最终执行之前由运行编译器(run-Time compiler)产生的代码进行优化。一般情况下,执行使用Zend Optimizer的PHP程序比不使用的要快40%到100%:这意味着网站的访问者可以更快的浏览网页,从而完成更多的事务,创造更好的客户满意度。

更快的响应同时也意味着可以书省硬件投资,并增强网站所提供的服务。zend OPtimizer能给PHP用户带来很多益处,特别是那些运营网站的人。快速运行PHP程序可以显著降低服务器的CPU负载,并可以减少一半的反应时间,也就是从访问者点击链接到服务器开始读取页面之间的时间。

由于对*PHPv5.2*之后的版本无效安装方法这里不再叙述

6. *安装memcache数据库缓存扩展模块*

n *memcache数据库缓存软件说明*

Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度

Menlcache分为服务端软件(名字如:memcached-1.4.3.tar.gz)和客户端插件(名字如:memcache-2.2.5.tgz)两部分,本文就是客户端插件在php服务中的安装

*memcache数据库缓存软件安装*

tar zxvf memcache-2.2.5.tgz
cd memcache-2.2.5
/application/php/bin/phpize
./configure --with-php-config=/application/php/bin/php-config
make
make install
ll /application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
cd ..

7. *安装PDO_MYSQL扩展模块(非必须)*

*PDO_MYSQL扩展插件说明*

PDO扩展为PHP访问数据库定义了一个轻最级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询并获取数据。下载地址:http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz(技巧谷歌搜索关键字

n *PDO_MYSQL扩展插件安装*

tar zxf PDO_MYSQL-1.0.2.tgz
cd PDO_MYSQL-1.0.2
/application/php/bin/phpize
./configure  --with-php-config=/application/php/bin/php-config --with-pdo-mysql=/application/mysql
make
make install
ll /application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
cd ..
注意:如果本地没有安装mysql,可以修改--with-pdo-mysql=mysqlnd,也可以在编译安装php时添加此参数及--with-mysql=mysqlnd         #有待测试

\注意:如果本地没有安装mysql,可以修改******--with-pdo-mysql=****mysqlnd,也可以在编译安装php时添加此参数及****--with-mysql=****mysqlnd #有待测试****

8. *安装图像处理程序及imagick扩展模块*

n *ImageMagick图像软件说明*

ImageMagick是一套功能强大、稳定而且免费的工具集和开发包,可以用来读、写和处理超过89种基本格式的图片文件,包括流行的TIFF、JPEG、GIF、PNG、PDF以及PhotoCD等格式。利用ImageMagick,你可以根据web应用程序的需要动态生成图片,还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成.同时ImageMagick提供了一个高质量的2D工具包,部分支持SVG。现在,ImageMagick的主要精力集中在性能、减少bug以及提供稳定的API和ABI上。

1.将图片从一个格式转换到另一个格式,包括直接转换成图标。

2.改变尺寸、旋转、锐化(sharpen)、减色、图片特效

3.缩略图片的合成图(a montage of image thurnbnails)

4.适于web的背景透明的图片

5.将一组图片作成gif动画,直接convert

6.将几张图片作成一张组合图片,montage

7.在一个图片上写字或画图形,带文字阴影和边框渲染

8.给图片加边框或框架

9.取得一些图片的特性信息

10,几乎包括了gimp可以作到的常规插件功能。甚至包括各种曲线参数的渲染功能.只是那命令的写法,够复杂。

*ImageMagick图像软件安装*

tar zxvf ImageMagick.tar.gz
cd ImageMagick-6.5.1-2
./configure
make
make install
cd ..
如果出现如下情况
Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at Makefile.PL line 24.
BEGIN failed--compilation aborted at Makefile.PL line 24.
make[1]: *** [PerlMagick/Makefile] Error 2
make[1]: Leaving directory `/home/oldboy/tools/ImageMagick-6.5.1-2'
make: *** [all] Error 2
解决办法:yum install perl-CPAN -y

9. *安装imagick php扩展插件*

*插件说明*

特别提示:imagick插件工作需要ImageMagick软件的支持,所以,必须要先安装ImageMagick,否则会报错。

一个可以供PHP调用ImageMagick功能的PHP扩展。使用这个扩展可以使PHP具备和ImageMagick相同的功能。

装了ImageMagick-6.5.1-2图像程序后,再装php的扩展imagick插件,才能使用ImageMagick-6.5.1-2提供的api来进行图片的创建与修改、压缩等操作,都集成在imagick这个扩展中

*安装imagick php扩展插件*

tar zxvf imagick-2.3.0.tgz
cd imagick-2.3.0
/application/php/bin/phpize
./configure --with-php-config=/application/php/bin/php-config
make
make install
ll /application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
cd ..

10. *配置php加速缓存扩展模块*

cd /application/php/lib/
cp php.ini php.ini.ori
vim php.ini修改; extension_dir = "./"为
extension_dir = "/application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/"
在配置文件结尾添加如下
extension = memcache.so
extension = pdo_mysql.so
extension = imagick.so
配置完成后对于lamp重启mysql,对于lnmp重启php-fpm
/application/apache/bin/apachectl graceful     #重启apache
pkill php-fpm                                  #关闭php-fpm,或者
ps -ef|grep php-fpm|awk '{print $2}'|xargs kill
/application/php/sbin/php-fpm                  #启动php-fpm

11. \配置eA******ccelerator****插件生效****

mkdir /tmp/eaccelerator
#此目录可以用tmpfs内存文件系统来存储,SSD固态硬盘。
chown -R apache.apache /tmp/eaccelerator          #lamp环境
chown -R nginx.nginx /tmp/eaccelerator            #lnmp环境
cat >> /application/php/lib/php.ini<<EOF
[eaccelerator]
extension=eaccelerator.so
eaccelerator.shm_size="64"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="3600"
eaccelerator.shm_prune_period="3600"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
EOF

\注意:如果配置了zend,那么******[eaccelerator]****段配置要放在zend的内容配置前****

/application/php/bin/php -v            #查看是否生效
ls /tmp/eaccelerator/                  #查看是否有文件
重启apache或者php-fpm然后访问phpinfo网页发现会有缓存文件
find /tmp/eaccelerator/ -type f

12. *配置xcache插件加速*

*提示:xcache和eaccelerator功能相近,安装一个即可。本文考虑文章完整,作为知识点来讲解。*

echo >>php.ini
echo ';xcache config by oldboy 20120418----------------------' >>php.ini
vi /server/tools/nginx-php-ext-soft/xcache-1.3.2/xcache.ini   #仅修改下面几行
3 ;zend_extension = /usr/local/lib/php/extensions/non-debug-non-zts-xxx/xcache.so
6 ;zend_extension_ts = c:/php/extensions/php_xcache.dll
8 extension = xcache.so
25 xcache.size  =               128M
31 xcache.ttl   =                 86400

*注意:生产环境需要根据硬件条件具体修改*

cat /server/tools/nginx-php-ext-soft/xcache-1.3.2/xcache.ini >>/application/php/lib/php.ini

\检查:发现和******eAccelerator****冲突,所以生产场景只用一个****

[root@nginx extra]# /application/php/bin/php -v
PHP Warning:  Cannot load module 'XCache' because conflicting module 'eAccelerator' is already loaded in Unknown on line 0
PHP 5.3.27 (cli) (built: May 11 2016 02:36:17) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies
    with eAccelerator v0.9.6, Copyright (c) 2004-2010 eAccelerator, by eAccelerator

*测试:访问phpinfo文件查看插件信息*

13. *生产环境php扩展插件的安装建议*

*PHP的安装插件表格列表*

PHP EXT module 说明 备注
eaccelerator-0.9.5.2 适合php5.3以前的版本,性能优化用 可选php扩展插件
eaccelerator-0.9.6 适合php5.3版本,性能优化用 可选php扩展插件
ImageMagick.tar.gz 常用图像处理程序,属功能应用 非php扩展插件
imagick-2.3.0.tgz 需要先装图像处理程序,属功能应用 可选php扩展插件
memcache-2.2.5.tgz memcache客户端(和服务端要区别) 可选php扩展插件
PDO_MYSQL-1.0.2.tgz php数据库访问插件,属功能应用 可选php扩展插件
zendOPtimizer 性能优化用 可选php扩展插件
xcache-1.3.2 性能优化用 可选php扩展插件

*生产环境插件的安装建议*

l)功能性插件,如果开发人员没需求,可以暂时不考虑安装,如:PDO_MYSQL、memcache,imagick。

2)优化性插件eaccelerator,xcache,zendOPtimizer,可以任意3选二安装,或安装任一种,具体情况看实际业务需求,及根据实际测试结果来安装。

*PHP加速插件的测试对比*

请求时间(秒) 单次请求时间(毫秒) 最大内存占用(MB) 最小内存占用(MB)
None 10.41 96.08 24 24
APC 30.45 32.84 21 21
eAccelerator 31.26 31.99 23 18
XCache 30.28 33.02 29 19

*PHP加速器比较结果总结*

1、通过测试得出eAccelerator在请求时间和内存占用综合方面是最好的。

2、通过测试得出使用加速器比无加速器在请求时间快了3倍左右。

3、通过各个官方观察,XCache是更新最快的,这也说明最有发展的。

以上是总结结果,你也许会问我到底用那个加速器好呢?我只能告诉你,首先,用一定比不用好,其次每个加速器还有一些可以调优的参数,所以要根据你的系统环境而定,然后,我个人觉得你可以详细研究下eAccelerator和XCache,这两款潜力还是很大的,

服务器技术交流群请加微信 YJZyjz