php的缓存加速优化

第1章 优化的目的

优化的目的,就是让服务器能够承受更多的并发和更多的用户。

Nginx并发数1~4万左右,撑死5W。

PHP并发数一般来讲就几百, (3~500或者6~700)的量

数据库并发一般来讲也就几百,但是对于淘宝来说也号称到1500多。那都是特定的SQL语句了,慢查询都得处理掉,超过多少毫秒的不能进数据库,这样并发才高。

第2章 解决PHP的并发短板

2.1操作码的保存(目的)

php的解析是在服务端(动态语言嘛),动态语言在接收到客户端的动态请求后,它会将其进行编译,编译后的文件,就是操作码文件。正常情况下这些操作码在处理和返还给客户端后,它会自动的删除。如果我们能够把操作码保存起来的话,那么下一次用户在发送这些动态请求的话,我们的PHP就可以把之前保存起来的操作码,直接抛给用户了。这样就可以加速PHP的解析效率了。要保留这个操作码就需要下面的软件来实现。

首选xcache

eaccelerator由于现在社区不活跃,更新不频繁,做为次选对象。

xcache效率更好,更快。

xcache的社区活跃,最新版是2014年底发布的。

支持更高版本的PHP,PHP5.5、PHP5.6。

2.2 安装优化软件的前提

安装和配置eaccelerator(用不了)只适用于PHP5.3之前的。

解决环境变量的问题

echo 'export LC_ALL=C' >>/etc/profile
. /etc/profile

这样可以解决后面perl程序插件的编译问题。如果不设置,后期安装某些加速软件时,可能会遇到警告提示问题。

2.3 eaccelerator软件的安装(了解)

比如eaccelerator。该软件php5.3之后的版本都装不了的。

2.3.1 安装perl-devel软件包

[root@web01 tools]# cd /tools
[root@web01 tools]# yum install perl-devel -y

2.3.2 安装eaccelerator

[root@web01 tools]# tar xf eaccelerator-0.9.6.1.tar.bz2
[root@web01 tools]# cd eaccelerator-0.9.6.1
[root@web01 eaccelerator-0.9.6.1]# /application/php/bin/phpize
[root@web01 eaccelerator-0.9.6.1]# ./configure --enable-eaccelerator=shared --with-php-config=/application/php/bin/php-config
[root@web01 eaccelerator-0.9.6.1]# make && make install

2.4 xcache缓存加速插件

2.4.1 xcache插件的安装

[root@web01 eaccelerator-0.9.6.1]# cd /tools
[root@web01 tools]# wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.bz2
[root@web01 tools]# tar xf xcache-3.2.0.tar.bz2
[root@web01 tools]# cd xcache-3.2.0
[root@web01 xcache-3.2.0]# /application/php/bin/phpize #此步骤不做,就不会出现./configure的执行命令
[root@web01 xcache-3.2.0]# ./configure --enable-xcache --with-php-config=/application/php/bin/php-config
[root@web01 xcache-3.2.0]# make && make install
[root@web01 xcache-3.2.0]# ll /application/php5.5.32/lib/php/extensions/no-debug-non-zts-20121212 
total 1888
-rwxr-xr-x 1 root root 257952 Jul 30 13:49 memcache.so
-rwxr-xr-x 1 root root 976576 Aug  3 09:03 redis.so
-rwxr-xr-x 1 root root 692460 Aug 15 10:38 xcache.so
[root@web01 xcache-3.2.0]# cd ..

出现上面绿框的文件就说明xcache装好了。

2.5 PHP的memcache插件(数据库的缓存)

数据库的缓存有memcache和redis,这两个软件对于PHP来说都要安装客户端扩展插件。php在安装上这两个插件后,就相当于把PHP自身的短板问题有效的增加了些长度,从而缓解了php后端MySQL数据库的压力。(补偿短板示意图)

2.5.1 安装memcache插件

[root@web01 tools]# cd memcache-2.2.7
[root@web01 memcache-2.2.7]# /application/php/bin/phpize
Configuring for:
PHP Api Version:         20121113
Zend Module Api No:      20121212
Zend Extension Api No:   220121212
[root@web01 memcache-2.2.7]# ./configure --enable-memcache --with-php-config=/application/php/bin/php-config
[root@web01 memcache-2.2.7]# make && make install
[root@web01 memcache-2.2.7]# cd ..

2.5.2 安装redis插件

[root@web01 tools]# tar xf phpredis-2.2.4.tar.gz 
[root@web01 tools]# cd phpredis-2.2.4
[root@web01 phpredis-2.2.4]# /application/php/bin/phpize
Configuring for:
PHP Api Version:         20121113
Zend Module Api No:      20121212
Zend Extension Api No:   220121212
[root@web01 phpredis-2.2.4]# ./configure --enable-redis --with-php-config=/application/php/bin/php-config
[root@web01 phpredis-2.2.4]# make && make install
[root@web01 phpredis-2.2.4]# cd ..

2.5.3 安装PDO_MYSQL扩展模组

PDO扩展为PHP访问数据库定义了一个轻量级一致性的接口,它提供了一个数据访问抽象层。这样无论使用的是什么数据库,都可以通过一致的函数执行查询并获取数据。简单的理解就是我们在平时在访问数据库的时候首先是先访问这个PDO,然后在通过PDO访问数据库。它其实也就是PHP和MySQL的一个接口。这个可以在编译安装PHP的时候,直接指定参数即可--with-pdo-mysql=mysqlnd,如果没有就编译安装一下即可。

[root@web01 ImageMagick-6.3.2]# cd /tools
[root@web01 tools]# tar xf PDO_MYSQL-1.0.2.tgz
[root@web01 tools]# cd PDO_MYSQL-1.0.2
[root@web01 PDO_MYSQL-1.0.2]# /application/php/bin/phpize
[root@web01 PDO_MYSQL-1.0.2]# ./configure --with-php-config=/application/php/bin/php-config --with-pdo-mysql=/application/mysql
[root@web01 PDO_MYSQL-1.0.2]# make && make install
[root@web01 PDO_MYSQL-1.0.2]# cd ..

从PHP5.5开始,这个小插件就已经默认自带的了。不需要安装了。

PHP5.5现成的安装法:

[root@web01 tools]# cd /tools/php-5.5.32/ext/pdo_mysql/
[root@web01 pdo_mysql]# /application/php/bin/phpize 
Configuring for:
PHP Api Version:         20121113
Zend Module Api No:      20121212
Zend Extension Api No:   220121212
[root@web01 ext]# ./configure --with-php-config=/application/php/bin/php-config --with-pdo-mysql=/application/mysql
[root@web01 ext]# make && make install && cd ..

检查当前已经安装好的PHP优化软件的方法

[root@web01 php-5.5.32]# ll /application/php/lib/php/extensions/no-debug-non-zts-20121212/
total 1824
-rwxr-xr-x 1 root root 257952 Aug 15 13:34 memcache.so
-rwxr-xr-x 1 root root   5445 Aug 15 15:51 pdo_mysql.so
-rwxr-xr-x 1 root root 905211 Aug 15 13:40 redis.so
-rwxr-xr-x 1 root root 692460 Aug 15 10:38 xcache.so

2.5.4 安装PHP图像处理软件ImageMagick(可选)

这个不是单独的PHP扩展。它和PHP没任何关系。

下载地址:http://www.imagemagick.com.cn/download.html

根据企业里的需求,老板喜欢图形的,就可以装一个。解压完之后直接编译安装下即可。

[root@web01 php-5.5.32]# cd /tools
[root@web01 tools]# tar xf ImageMagick-6.3.2-9.tar.gz
[root@web01 tools]# cd ImageMagick-6.3.2
[root@web01 ImageMagick-6.3.2]# ./configure
[root@web01 ImageMagick-6.3.2]# make && make install
[root@web01 ImageMagick-6.3.2]# cd ..

这个软件在安装过程中可能会报一个错误。

Magick++/lib/Image.cpp: In function 'void Magick::InitializeMagick(const char*)':
Magick++/lib/Image.cpp:3925: error: 'atexit' was not declared in this scope
make: *** [Magick++/lib/Image.lo] Error 1

后来笔者查了相关资料,发现原来是gcc版本的问题。新系统的gcc版本比较新,对于旧的写法有些不兼容。旧的版本gcc某些不需要明确的声明include的地方,在新的gcc中不再支持,必须明确的声明。

解决方法

[root@web01 Magick++]# vim /tools/ImageMagick-6.3.2/Magick++/lib/Image.cpp
在头部include声明的代码中增加一行: 
#include <stdlib.h> 

重新make就可以了。只有安装了这个软件,我们才可以安装imagick php扩展插件,否则就会报错。Imagick php扩展插件是一个可以提供PHP调用ImageMagick功能的扩展模块。使用这个扩展可以让PHP具备ImageMagick相同的功能。

[root@web01 tools]# tar xf imagick-3.1.2.tgz 
[root@web01 tools]# cd imagick-3.1.2
[root@web01 imagick-3.1.2]# 
[root@web01 imagick-3.1.2]# /application/php/bin/phpize 
[root@web01 imagick-3.1.2]#  ./configure --with-php-config=/application/php/bin/php-config
[root@web01 imagick-3.1.2]# make && make install

注意:如果PHP版本是5.5以上的,这个软件请用3.0以上的安装,否则会报错。

安装完上面一大堆软件后,就是在php.ini里面让它生效这些优化插件了。编辑php.ini文件,在最下方添加刚才所有安装软件的.so文件到最下面。或者直接使用下面的命令改成插件模块的路径做替换。

sed -i 's#; extension_dir = "./"#extension_dir = /application/php5.5.32/lib/php/extensions/no-debug-non-zts-20121212/#g' php.ini

[root@web01 tools]# vim /application/php/lib/php.ini
extension_dir = "/application/php5.5.32/lib/php/extensions/no-debug-non-zts-20121212/"
extension = memcache.so
extension = redis.so
extension = pdo_mysql.so
extension = imagick.so

修改php优化插件的路径,和添加php优化插件文件。最后重启php服务。

pkill php-fpm                    
lsof -i:9000
/application/php/sbin/php-fpm

这里为了方便直接用pkill来关闭php服务了,工作中尽量少用pkill和kill -9的方式关闭。直接kill 进程ID的方式关闭比较稳妥。如果出现下面的警告内容,说明已经安装了,可以在php.ini里面注释掉警告的插件。

[16-Aug-2018 08:59:57] NOTICE: PHP message: PHP Warning:  PHP Startup: Invalid library (maybe not a PHP library) 'pdo_mysql.so' in Unknown on line 0

这个警告其实是你已经在php初始化的时候添加上了参数--with-pdo-mysql=mysqlnd才会导致出现的,如果已经添加上了,就可以不需要再php.ini文件里添加这条extension = pdo_mysql.so记录了,直接可以用;注释掉。查找php安装的配置组件可以用下面得到命令搜索。

[root@web01 tools]# /application/php/bin/php -i|grep configure

也可以在Nginx的html目录下创建一个phpinfo.php的页面来检查这些插件是否安装成功。如下图所示,前提要确保Nginx是好的。

最快捷的方法可以使用下面的命令检查。

[root@web01 tools]# /application/php/bin/php -m|egrep "memcache|pdo_mysql|imagick|xcache|redis"
PHP Warning:  PHP Startup: Invalid library (maybe not a PHP library) 'pdo_mysql.so' in Unknown on line 0
imagick
memcache
pdo_mysql
redis

第3章 xcache的优化

xcache软件的解压目录/tools/xcache-3.2.0/下存在一个名字为xcache.ini的配置文件,这个文件就是xcache的配置文件了。

3.1 xcache.ini的配置

修改php.ini配置xcache

xcache的优化在它的配置文件xcache.ini中进行,它的位置位于xcache软件解压出的路径下存在。先在配置xcache参数前加个配置分界符,命令如下

[root@web01 tools]# cd /application/php/lib
[root@web01 lib]# echo >>php.ini
[root@web01 lib]# echo ';xcache config by ninja 20140622--------------------------' >>php.ini
[root@web01 lib]# tail -2 php.ini

然后将xcache.ini中的配置,全部合并到php.ini的结尾处。

[root@web01 lib]# cat /tools/xcache-3.2.0/xcache.ini >>php.ini
[root@web01 lib]# tail -85 php.ini|egrep -v "^;|^$"
修改下面的默认参数
xcache.size  =               256M
xcache.count =                 1
xcache.var_ttl   =             86400
xcache.gc_interval =           3600
xcache.var_size  =            64M    

合并之后,重启php服务生效查看是否生效/application/php/bin/php -v

[root@web01 lib]# /application/php/sbin/php-fpm 
[root@web01 lib]# /application/php/bin/php -v   
PHP 5.5.32 (cli) (built: May 27 2018 13:17:31) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with XCache v3.2.0, Copyright (c) 2005-2014, by mOo
    with XCache Cacher v3.2.0, Copyright (c) 2005-2014, by mOo

3.2 通过web界面查看xcache的缓存加速信息

web界面需要一个密码,并且这个密码要使用MD5加密之后才能使用。

[root@web01 lib]# echo -n "123456"|md5sum
e10adc3949ba59abbe56e057f20f883e  -

将这串密码放到php.ini文件中xcache的admin模块下

xcache.admin.user = "niwei"
xcache.admin.pass = "e10adc3949ba59abbe56e057f20f883e"

把xcache下的站点目录复制到nginx的html目录下

[root@web01 lib]# cp -a /tools/xcache-3.2.0/htdocs /application/nginx/html/blog/xadmin

重启php服务和nginx服务并且授权这个目录成www账户

chown -R www.www /application/nginx/html/blog/xadmin

此时如果浏览器中输入http://blog.niwei.com/xadmin/index.php就可以看见xcache的管理页面了。

账号密码就是我们刚才在php.ini里配置的带MD5加密的账户密码登录。

如果出现时区的提示警告,那么就在php.ini文件中的xcache.ini中进行修改

[root@web01 lib]# vim /application/php/lib/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone =
date.timezone = Asia/shanghai

修改保存后,重启php服务。

如果是官方自带的zendopcache插件,开启方法如下。就在php.ini文件下,添加如下内容即可

[opcache]
zend_extension=/application/php5.5.32/lib/php/extensions/no-debug-non-zts-20121212/opcache.so
;extension=opcache.so
opcache.memory_consumption=128
opcache.interned_string_buffer=8
opcache.max_accelerated_files=1000
opcache..revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

php加速优化插件装一个即可,不易装很多个,会有冲突。所以zendopcache插件不做研究了。

3.3 php加速插件的测试结果对比参考

 

请求时间(秒)

单次请求时间(毫秒)

最大占用内存(MB)

最小占用内存(MB)

None

10.41

96.08

24

24

APC

30.45

32.84

21

21

eAcclerator

31.26

31.99

23

18

Xcache

30.28

33.02

29

19

猜你喜欢

转载自www.cnblogs.com/ninjawei/p/9486525.html
今日推荐