第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 |