PHP服务缓存加速优化实战

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP服务缓存加速优化实战相关的知识,希望对你有一定的参考价值。

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是一套功能强大,稳定而且免费的工具集和开发包,可以用来读写和处理超过89种。

利用根据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配置文件:

[[email protected] ~]# 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/可以进入管理页面。


配置ZendOpcache插件加速:

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

本文出自 “泡面、车库、程序员” 博客,请务必保留此出处http://xvjunjie.blog.51cto.com/12360960/1967166

以上是关于PHP服务缓存加速优化实战的主要内容,如果未能解决你的问题,请参考以下文章

PHP服务缓存加速优化实战

LAMP和LNMP加速与缓存优化

四十LAMP与LNMP加速与缓存优化进阶实战上部

php服务缓存加速

PHP WEB 引擎缓存加速优化

优化wordpress给网站缓存数据加速-redis缓存器