PHP服务缓存加速优化实战
(1) 操作码介绍及缓存原理:
当客户端请求一个PHP程序的时候,服务器的 PHP 引擎会解析该 PHP 程序,并将其编译为特定的操作码(Operate Code)文件。
该文件是执行PHP代码后的一种二进制表示形式。
默认情况下,这个编译好的操作码文件由 PHP 引擎执行后进行丢弃。
操作码文件缓存机制就是将编译还的文件保存下来,并放到共享内存中,以便于下一次调用该PHP页面的时候重用它,避免了相同的代码重复度,节省了 PHP 引擎重复编译的时间。
降低了服务器负载,同时减少了服务器的 CPU 和内存的开销。
LAMP 环境 PHP 缓存加速器的原理:
在 LNMP 中,Apache 服务是使用 libphp5.so 响应处理 PHP 程序请求的。
1. Apache 服务接受客户的 PHP 程序请求,并根据规则进行过滤。
2. Apache 将 PHP 程序请求传递给 PHP 处理模块 libphp5.so。
3. PHP引擎定位磁盘上的 PHP 文件,并将其加载到内存中解析。
4. PHP 处理模块 libphp5.so 将 PHP 源码编译成 opcode。
5. Apache 接收客户端新的 PHP 请求,PHP 编译解析并将结果返回。
LNMP 环境 PHP 缓存加速器的原理:
在 LNMP 中不再使用 libphp5.so 模块了,而是启动独立的 FCGI 进程,就是 php-fpm,由它来监听来自 Nginx 的 PHP 程序请求,交给 PHP 引擎进行处理。
1. Nginx 接收客户端的 PHP 程序访问请求。
2. Nginx 根据扩展名等过滤规则进行将 PHP 程序传递给解析 PHP 程序的 FCGI 进程。
3. PHP FPM 进程调用 PHP 解析器读取磁盘上的 PHP 文件,并加载到内存中。
4. PHP 解析器将 PHP 程序编译成为 opcode 文件,然后把 opcode 缓存起来。
5. PHP FPM 引擎执行 opcode 树后,返回数据给 Nginx,进而返回客户端。
6. Nginx 接收新的客户端请求,PHP FPM 引擎就会直接读取缓存起来的 opcode 并执行。
7. 将结果返回。
PHP 加速软件的选择:
PHP 缓存加速器软件常见的有 XCache、eAccelerator、APC(Alternative PHP Cache)、ZendOpcache 等。
首选 Xcache,其次是 eAccelerator。
原因:
1. 经过测试,XCache 效率更高,速度更快。
2. XCache 软件开发社区更加活跃。
3. 支持更高的 PHP 版本
4. eAccelerator 安装及配置相对简单,加速效果明显。
5. eAccelerator 文档资料比较多,但是官方对软件的更新速度比较慢,社区不活跃。
6. eAccelerator 仅仅适合 PHP 5.4 以下的版本。
7. ZendOpcache 是 PHP 官方研发的新一代缓存加速软件,以后可能会有更好的发展前景。
8. 从 PHP5.5 开始 ZendOpcache 开始整合到 PHP 软件中,以前都是以插件的方式进行安装的。
9. 在 PHP5.5 以后的版本中使用--enable-opcache。
10. ZendOpcache 可能是未来缓存的首先选择。
在使用缓存的时候需要准备 LNMP 环境。
(1) 安装 XCache 缓存加速模块:
cd ./xcache-3.2.0
/app/php/bin/phpize
./configure --enable-xcache --with-php-config=/app/php/bin/php-config
make
make test
make install
ll /app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/
total 680
-rwxr-xr-x. 1 root root 695580 Sep 17 14:06 xcache.so
(2) 安装 eAccellerator 缓存加速模块:
tar -zxvf ./eaccelerator-eaccelerator-42067ac.tar.gz
cd ./eaccelerator-eaccelerator-42067ac
/app/php/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=/app/php/bin/php-config
make && make install
ll /app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/
total 1108
-rwxr-xr-x. 1 root root 438090 Sep 17 14:14 eaccelerator.so
(3) 安装 ZendOpcache 缓存加速模块:
tar -zxvf ./zendopcache-7.0.5.tgz
cd ./zendopcache-7.0.5
/app/php/bin/phpize
./configure --enable-opcache --with-php-config=/app/php/bin/php-config
make && make install
ll /app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/
total 1636
-rwxr-xr-x. 1 root root 539488 Sep 17 14:18 opcache.so
(4) 安装 PHP Memcached 扩展插件:
Memcached是一个开源的支持高性能、高并发及分布式的内存缓存服务软件。
分为客户端和服务器端:
客户端:Memcache
服务器端:Memcached
在传统场景下,多数 Web 应用都将数据保存到 RDBMS 中,www 服务器从中读取数据并在浏览器中显示。
但是随着数据量的变大,访问的集中,就会出现 RDBMS 的负担加重,数据库响应速度变慢,网站延迟等问题。
Memcached 是高性能的分布式内存缓存服务。
使用 Memcached 的主要目的就是通过自身内存中缓存数据库的查询结果,减少数据库访问次数,以提高动态 Web 应用速度,提高网站架构的并发能力和扩展性。
Memcached 服务通过在事先规划好的系统空间中面临缓存数据库中各类数据,以达到减少前端业务对数据库的直接高并发访问,从而提升大规模网站集群中动态服务的并发访问能力。
生产场景中,Memcached 服务一般被用来保存网站中经常被读取的对象或数据。
Memcached的工作流程:
1. 程序首先检查客户端请求的数据在 Memcached 服务的缓存中是否存在,如果存在,会直接将请求的数据返回,不再请求后端的数据库。
2. 如果请求的数据在 Memcached 的缓存中不存在,程序会去 Memcached 后端的数据库服务。
3. 把数据从数据库中返回到客户端中。
4. 同时把新的数据保存在 Memcached 服务缓存中,下次直接请求 Memcached 中的数据。
为 PHP 安装 Memcache 客户端:
tar -zxvf ./memcache-2.2.5.tgz
cd ./memcache-2.2.5
/app/php/bin/phpize
./configure --enable-memcache --with-php-config=/app/php/bin/php-config
ll /app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/
-rwxr-xr-x. 1 root root 259088 Sep 17 16:00 memcache.so
安装报错解决:
make:***[memcache.lo]Error 1
解决:
cp memcache.loT memcache.lo
(5) 安装 PDO_MYSQL 扩展模块:
PDO 扩展为 PHP 访问数据库定义了一个轻量级的一致性接口,它提供一个数据访问抽象层。
这样五龙轮使用什么数据库都可以使用统一的函数进行数据查询并获取数据。
PDO_MYSQL 可以使用插件安装或编译PHP的时候加入参数,使用--with-pdo-mysql=mysqlnd 直接加入 PDO_MYSQL 的 PHP 支持。
使用--with-mysql-mysqlnd 即可在没有 MySQL 的环境下使 PHP 支持 MySQL 数据库。
tar -zxvf ./PDO_MYSQL-1.0.2.tgz
cd ./PDO_MYSQL-1.0.2
/app/php/bin/phpize
./configure --with-php-config=/app/php/bin/php-config --with-pdo-mysql=/app/mysql
make && make install
安装报错解决:
make: *** [pdo_mysql.lo] Error 1
解决:
cp pdo_mysql.loT pdo_mysql.lo
make: *** [mysql_driver.lo] Error 1
解决:
cp mysql_driver.loT mysql_driver.lo
make: *** [mysql_statement.lo] Error 1
解决:
cp mysql_statement.loT mysql_statement.lo
ll /app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/
-rwxr-xr-x. 1 root root 5429 Sep 17 16:35 pdo_mysql.so
(6) 安装 imagick 模块:
ImageMagick 是一套功能强大,稳定而且免费的工具集和开发包,可以用来读写和处理超过 8 9 种。
利用根据 Web 应用程序的需要动态生成图片,还可以对一个或一组图片进行改变大小等操作。
同时 ImageMagick 提供一个高质量的 2D 工具包。
部分支持 SVG。
它甚至包括各种曲线的渲染功能。
tar -zxvf ./ImageMagick-i686-pc-mingw32.tar.gz
cd ./ImageMagick-6.8.5/
./configure && make && make install
(7) 安装 imagick PHP 扩展模块:
要先安装 ImageMagick 模块才可以安装 imagick PHP模 块。
imagick 插件是提供 PHP 调用 ImageMagick 功能的扩展模块。
安装 ImageMagick 图像程序后,再安装 PHP 的扩展 imagick 插件,才可以用 ImageMagick 提供的API进行图片创建、压缩与修改。
ln -s /usr/local/include/ImageMagick-7/ /usr/local/include/ImageMagick
tar -zxvf ./imagick-2.3.0.tgz
cd ./imagick-2.3.0
/app/php/bin/phpize
./configure --with-php-config=/app/php/bin/php-config
配置 PHP Memcache/PDO_MYSQL/imagick 模块:
编辑 php.ini 文件:
extension=/app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/
检查配置文件:
grep "extension_dir=" /app/php/lib/php.ini
extension=/app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/
extention = pdo_mysql.so
extettion = memcache.so
extention = imagick.so
(8) 配置 eAccelerator 插件生效并优化参数:
mkdir /tmp/eaccelerator
chown nginx.nginx /tmp/eaccelerator/
ll -d /tmp/eaccelerator/
drwxr-xr-x. 2 nginx nginx 4.0K Sep 17 20:26 /tmp/eaccelerator/
这个目录可以使用 tmpfs 或 SSD 来存储。
配置PHP参数:php.ini
[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_tt1="3360"
eaccelerator.shm_prune_period="3360"
eaccelerator.hsm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
检查 PHP 配置文件:
[root@comp0 ~]# tail -15 /app/php/lib/php.ini
[eaccelerator] #加载模块文件配置
extension = eaccelerator.so #加载模块
eaccelerator.shm_size="64" #存储缓存数据的共享内存大小,如果是0,则最大值看内核/proc/sys/kernel/shmmax
eaccelerator.cache_dir="/tmp/eaccelerator" #磁盘缓存存储路径,缓存内容precompiled code、session data、contect、user entires。默认路径是/tmp/eaccelerator
eaccelerator.enable="1" #eAccelerator缓存生效开关,默认为1,表示开启。
eaccelerator.optimizer="1" #加速PHP代码执行速度,默认为1,表示激活。用于缓存前的代码加速。
eaccelerator.check_mtime="1" #检查缓存修改时间,决定代码是否需要重新编译,默认值为1,表示激活。
eaccelerator.debug="0" #缓存加速调试,打开后可以看到缓存中的信息。
eaccelerator.filter="" #设定对象是否缓存规则,空表示不设定。
eaccelerator.shm_max="0" #可以被放置的缓存最大值,不限制为0.
eaccelerator.shm_tt1="3360" #缓存文件的生存期
eaccelerator.shm_prune_period="3360" #当共享内存时间不够的时候,从共享内存中移除旧的数据的时间周期。
eaccelerator.hsm_only="0" #是否允许缓存数据到磁盘,允许为0,但是对于session data and contect caching无影响。
eaccelerator.compress="1" #是否开启压缩,开启为1。
eaccelerator.compress_level="9" #压缩级别,最高为9。
#可选值
eaccelerator.keys="shm_and_disk" #控制keys的缓存位置
eaccelerator.sessions="shm_and_disk" #控制sessions的缓存位置
eaccelerator.content="shm_and_disk" #控制内容缓存位置
查看 eAccelerator 的加速情况:
/app/php/sbin/php-fpm -v
PHP 5.4.24 (fpm-fcgi) (built: Sep 17 2017 12:21:41)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
with eAccelerator v1.0-dev, Copyright (c) 2004-2012 eAccelerator, by eAccelerator
测试/tmp/eaccelerator/目录下存在缓存数据。
配置XCache插件加速:
编辑php.ini:
;[xcache]
[xcache-common]
extension = xcache.so
[xcache.admin]
xcache.admin.enable_auth = On
xcache.admin.user = "mOo"
xcache.admin.pass = "md5 encrypted password"
[xcache]
xcache.shm_scheme = "mmap"
xcache.size = 256M
xcache.count = 2
xcache.slots = 8K
xcache.ttl = 86400
xcache.gc_interval = 3600
xcache.var_size = 64M
xcache.var_count = 1
xcache.var_slots = 8K
xcache.var_ttl = 0
xcache.var_gc_interval = 300
xcache.var_namespace_mode = 0
xcache.var_namespace = ""
xcache.readonly_protection = Off
xcache.mmap_path = "/dev/zero"
xcache.coredump_directory = ""
xcache.coredump_type = 0
xcache.disable_on_crash = Off
xcache.experimental = Off
xcache.cacher = On
xcache.stat = On
xcache.optimizer = Off
[xcache.converager]
xcache.coverager = Off
xcache.coverager_autostart = On
xcache.coveragedump_directory = ""
检查 PHP 的 XCache 加速缓存情况:
/app/php/bin/php -v
PHP 5.4.24 (cli) (built: Sep 17 2017 12:21:30)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 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
配置文件详解:
;[xcache] XCache配置文件解析开始
[xcache-common]
extension = xcache.so 包含加速模块,路径相对于extension_dir的配置,自3.0开始不再支持使用zend_extension加载xcache的方式。
[xcache.admin] 管理员配置开始
xcache.admin.enable_auth = On 激活管理员认证
xcache.admin.user = "mOo" 指定xcache的管理员用户名
xcache.admin.pass = "md5 encrypted password" 指定xcache的管理员密码
[xcache] XCache配置开始
xcache.shm_scheme = "mmap" 设置XCache如何从系统分配共享内存
xcache.size = 256M 禁止缓存为0,启用缓存为非零数字,需要注意系统所允许的mmap最大值
xcache.count = 2 指定将XCache切分多少块,官方推荐设置为服务器CPU的数量
xcache.slots = 8K hash槽个数的参考值,缓冲超过此数值时,也没有任何问题。
xcache.ttl = 86400 设定cache对象的生存周期TTL,永不过期是0
xcache.gc_interval = 3600 回收器扫描过期回收内存空间的间隔,不扫描为0,其他数值的单位是秒,默认是0
xcache.var_size = 64M 用于变量缓存,而不是opcache缓存
xcache.var_count = 1 用于变量缓存,而不是opcache缓存
xcache.var_slots = 8K 用于变量缓存,而不是opcache缓存
xcache.var_ttl = 0 用于变量缓存,而不是opcache缓存
xcache.var_gc_interval = 300 用于变量缓存,而不是opcache缓存
xcache.var_namespace_mode = 0 如果启用了还参数,将会稍微降低性能,但是会提高一定的系统安全性。对xcache.mmap_path = "/dev/zero"无效
xcache.var_namespace = ""
xcache.readonly_protection = Off
xcache.mmap_path = "/dev/zero" 对于*nix,xcache.mmap_path 是一个文件路径而非目录。如果要启用该参数,请使用/tmp/xcache这样的参数。
如果开启了xcache.readonly_protection参数,不同进程组的PHP将不会共享一个/tmp/xcache路径。
xcache.coredump_directory = "" 当XCache崩溃后,是否把数据保存到指定路径
xcache.coredump_type = 0
xcache.disable_on_crash = Off 当XCache发生崩溃后,自动关闭XCache的路径
xcache.experimental = Off
xcache.cacher = On
xcache.stat = On
xcache.optimizer = Off
[xcache.converager]
xcache.coverager = Off
xcache.coverager_autostart = On
xcache.coveragedump_directory = ""
查看CPU参数:
more /proc/cpuinfo
processor: 0
vendor_id: GenuineIntel
cpu family: 6
model: 69
model name: Intel(R) Core(TM) i3-4030U CPU @ 1.90GHz
stepping: 1
microcode: 29
cpu MHz: 1900.000
cache size: 3072 KB
physical id: 0
siblings: 1
core id: 0
cpu cores: 1
apicid: 0
initial apicid: 0
fpu: yes
fpu_exception: yes
cpuid level: 13
wp: yes
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc up
arch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadli
ne_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm arat epb xsaveopt pln pts dtherm tpr_shadow vnmi ept vpid fsgsbase bmi1 avx2 smep bmi2 invpcid
bogomips: 3800.00
clflush size: 64
cache_alignment: 64
address sizes: 42 bits physical, 48 bits virtual
power management:
配置web管理界面:
mkdir /app/nginx/html/blog/xcache
cp -a /tools/xcache-3.2.0/htdocs/ /app/nginx/html/xcache/
chown -R nginx.nginx /app/nginx/html/xcache/
创建XCache web配置文件
vim /app/nginx/conf/extras/xcache.conf
server {
listen 8088;
server_name inner.myxcache.com;
#location / {
# root html;
# index index.html index.htm;
#}
location / {
root html/xcache;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include ../conf/fastcgi.conf;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
通过md5sum生成管理员密码:
echo "123456" | md5sum
e10adc3949ba59abbe56e057f20f883e -
修改php.ini文件:
xcache.admin.user = "xcacheadmin"
xcache.admin.pass = "e10adc3949ba59abbe56e057f20f883e"
重启 php-fpm。
重启 Nginx。
访问 http://inner.myxcache.com/ 可以进入管理页面。
配置Z endOpcache 插件加速:
vim /app/php/lib/php.ini
[opcache]
zend_extension=/app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/opcache.so
opcache.memory_consumption=32
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=1000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
重启php-fpm进程:
访问:http://192.168.1.111:8080/view_phpinfo.php
view_phpinfo.php文件代码:
<?php
phpinfo();
?>
参数讲解:
[opcache] ZendOpcache配置开始
zend_extension=/app/php-5.4.24/lib/php/extensions/no-debug-non-zts-20100525/opcache.so 加载模块文件
opcache.memory_consumption=32 ZendOpcache共享内存的大小,用于存放precompiled PHP code,默认是64,单位是Mbytes
opcache.interned_strings_buffer=8 默认是4,interned_strings内存的数量,单位值MB
opcache.max_accelerated_files=1000 默认是2000,ZendOpcache散列表的key的最大数量
opcache.revalidate_freq=60 默认是2,检查文件时间戳的频率,用于共享内存分配的变化
opcache.fast_shutdown=1 默认是0,如果激活,一个快速的关闭队列将被用来加速代码
opcache.enable_cli=1 默认是0,激活PHP CLI的ZendOpcache,用于测试和调试
在PHP5.5以上的版本中只需要编译PHP的时候指定--enable-opcache即可使用ZendOpcache。
生产环境PHP插件安装建议:
eAccelerator-0.9.5.2.tar.gz适合PHP5.3及以前的版本,缓存加速使用 可选的PHP扩展插件。
eAccelerator-0.9.6.tar.bz2适合PHP5.3版本,PHP缓存加速,可选的PHP扩展插件。
ImageMagick.tar.gz常用图像处理程序,属于功能应用,非PHP扩展插件。
imagick-2.3.0.tgz需要先安装图像处理程序,属于应用功能,可选的PHP扩展插件。
memcache-2.2.7.tgz是memcache客户端数据库缓存优化应用,可选的PHP扩展插件。
PDO_MYSQL-1.0.2.tar.gz是PHP数据库库访问插件,属于PHP功能插件,可选的PHP扩展插件。
xcache-3.2.0.tar.bz2支持PHP5.1~PHP5.6缓存加速,可选PHP扩展插件。
zendopcache-7.0.5.tar.gz支持PHP5.3~PHP5.4缓存加速,可选的PHP扩展插件。
生产环境插件安装建议:
对于功能性插件:
如果业务不需要使用,可以不考虑安装。
如果不清楚是否需要安装,最好安装上。
对于性能优化插件:
eAccelerator、XCache、ZendOpcache、APC可以安装其中任何一种。
具体情况看业务需求。最好进行压力测试。
PHP加速插件性能测试对比:
eAccelerator在请求时间和内存占用综合方面是最好的。
存在加速器比不存在加速器在请求时间方面快3倍。
什么是phpize?
安装PHP扩展的时候需要phpize,phpize是用来扩展PHP扩展模块的。
通过phpize可以建立PHP的外挂模块。
编译PHP后,在bin目录下会有phpize这个脚本文件,再要添加模块的目录下执行这个脚本后出现一个configuer文件。
./configuer后面可以很--with-php-config的文件路径。
在PHP指定编译时指定了--with-mysql=mysqlnd和--with-pdo-mysql=mysqlnd的参数,在生产环境中可能会有socket连接问题。
解决方法时在php.ini中加入:
pdo_mysql.default_socket=/app/php/tmp/mysql.sock