Linux实战教学笔记36:PHP服务缓存加速深度优化实践

时间:2022-09-09 17:15:26

一,PHP缓存加速器介绍与环境准备

1.1 PHP缓存加速器介绍

1.1.1 操作码介绍及缓存原理

当客户端请求一个PHP程序时,服务器的PHP引擎会解析该PHP程序,并将其编译为特定的操作码(Operate Code,简称opcode)文件,该文件是执行PHP代码后的一种二进制表示形式。默认情况下,这个编译好的操作码文件由PHP引擎执行后丢弃。而操作码缓存(Opcode Cache)的原理就是将编译后的操作码保存下来,并放到共享内存里,以便在下一次调用该PHP页面时重用它,避免了相同代码的重复编译,节省了PHP引擎重复编译的时间,降低了服务器负载,同时减少了CPU和内存开销。

1.1.2 PHP缓存加速软件介绍

为了提高PHP引擎的高并发访问及执行速度,产生了一系列PHP缓存加速软件。这些软件设计的目的就是缓存前文提到的PHP引擎解析过的1操作码文件,以便在指定时间内有相同的PHP程序请求访问时,不再需要重复解析编译,而是直接调用缓存中的PHP操作码文件,这样就提高了动态Web服务的处理速度,从而提升了用户访问企业网站的整体体验。

1.2 LAMP环境PHP缓存加速器的原理

下面简单介绍Apache环境的PHP缓存加速器原理

在LAMP环境中,Apache服务是使用libphp5.so响应处理PHP程序请求的,整个流程大概如下:

1)Apache接收客户的PHP程序请求,并根据规则过滤之。

2)Apache将PHP程序请求传递给PHP处理模块libphp5.so

3)PHP引擎定位磁盘上的PHP文件,并将其加载到内存中解析。

4)PHP处理模块libphp5.so将PHP源代码编译成为opcode。

5)PHP处理模块libphp5.so执行opcode,然后把opcode缓存起来。

6)Apache接收客户端新的PHP程序请求,PHP引擎直接读取缓存执行opcode文件,并将结果返回。在这一次任务中,就无第4步的编译解析了,从而提升了PHP编译解析效率。

PHP缓存加速器解决的是上述第5步的问题,默认情况下PHP会将opcode内容执行后丢弃,这里却通过PHP缓存加速软件,将opcode内容缓存了下来,目的是当有重复请求时,不需要再重复编译解析PHP程序代码,因为在高并发高访问量的网站上,大量的重复编译会消耗很多的系统资源和时间,而这也就会成为瓶颈,既影响了处理速度,又加重了服务器的负载,为了解决此问题,PHP缓存加速器就这样诞生了。

下图是LAMP环境下PHP请求及操作码缓存过程的原理示意图:

Linux实战教学笔记36:PHP服务缓存加速深度优化实践

1.3 LNMP环境PHP缓存加速器的原理详解

在LNMP环境中,PHP引擎不再使用libphp5.so模块了,而是启动了独立的FCGI即php-fpm进程,由它监听来自Nginx的PHP程序请求,并交给PHP引擎解析处理,整个执行流程大概如下:

1)Nginx接收客户端的PHP程序访问请求

2)Nginx根据扩展名等过滤规则将PHP程序请求传递给解析PHP的FCGI(php-fpm)进程

3)PHP FPM进程调用PHP解析器读取站点磁盘上的PHP文件,并加载到内存中。

4)PHP解析器将PHP程序编译成为opcode文件,然后把opcode缓存起来。

5)PHP FPM引擎执行opcode树后,返回数据给Nginx,进而返回客户端。

6)Nginx接收客户新的PHP程序请求,PHP FPM引擎就会直接读取缓存中的opcode并执行,将结果返回。该过程中无需第4步操作,从而提升了PHP编译解析效率。

下图为LNMP环境下PHP请求及操作码缓存过程的原理示意图

Linux实战教学笔记36:PHP服务缓存加速深度优化实践

1.4 PHP缓存加速器软件种类及选择建议

  • PHP缓存加速器软件常见的种类有XCache,eAccelerator,APC(Alternative PHP Cache),ZendOpcache等,那么,在企业环境我们要如何选择PHP缓存加速器软件呢?
  • 事实上,任选其一即可,没必要都安装上1,都安装也可能会发生冲突。总的建议就是根据企业的业务需求及选择前的压力测试结果,或者根据个人的经验偏好选择。不过,我建议同学们首选XCache,其次是eAccelerator,如果想尝新,可以选择ZendOpcache。
  • [x] :首选XCache的原因如下:
    • 经过测试,XCache效率更高,速度更快
    • XCache软件开发社区更活跃。
    • 支持更高版本的PHP,例如PHP5.5,PHP5.6
  • [x] :次选eAccelerator的原因如下:
    • 安装及配置参数更简单,加速效果也不错。
    • 文档资料较多,但官方对软件的更新很慢,社区不活跃
    • 仅适合PHP版本5.4以下的程序
  • [x] :选择ZendOpcache的原因如下:
    • 是PHP官方研发的新一代缓存加速软件,以后的发展潜力可能会很好,PHP5.5以前的版本可以通过ZendOpcache软件以插件扩展的方式安装,从PHP5.5版本开始已经整合到PHP软件里了,编译时只需要指定一个参数即可,例如:--enable-opcache。
    • ZendOpcache可能是未来的缓存加速首选,现在的稳定性还有待检验,小规模环境下PHP5以前的版本可以通过插件式安装使用,PHP5以上的版本可以直接指定参数编译使用。若可以忍受ZendOpcache的各种未知问题的话,也可以尝试使用。

1.5 PHP缓存加速器安装环境准备

1.5.1 LNMP基础Web环境准备

在安装PHP的扩展及缓存加速软件之前,需要先安装好LNMP的完整环境,例如:能配置出现phpinfo信息的界面,表示PHP服务正常安装,同时最好可以编写一个调用数据库的简单PHP程序,例如test_mysql.php,进而确认MySQL数据库是否正常。在之前的课程中已经详细讲解了LNMP环境的安装,配置及部署方法,此处不再多提。

当前LNMP环境软件的各个版本信息如下表:

软件 版本
Linux CentOS6.5 64bit
Nginx 1.6.2
MySQL 5.5.32
PHP 5.3.28

如果上述软件的版本对不上,在安装PHP的扩展软件时可能会遇到一些小问题。因此,建议在学习中使用的版本尽量和教案保持一致,否则可能会出现额外的问题,影响学习进度,等按照书上的操作完成了部署后,再去变换版本操作。这样的学习方法是最好的。

1.5.2 检查LNMP的软件版本

1)查看Linux内核及版本相关信息,命令如下:

[root@LNMP ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@LNMP ~]# uname -r
2.6.32-431.el6.x86_64
[root@LNMP ~]# uname -m
x86_64

2)查看Nginx Web版本相关信息,命令如下:

[root@LNMP ~]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.6.2

3)查看PHP服务版本相关信息,命令如下:

[root@LNMP ~]# /usr/local/php/bin/php -v
PHP 5.3.28 (cli) (built: Aug 21 2017 19:03:26)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies

4)查看MySQL服务版本相关信息,命令如下:

[root@LNMP ~]# mysqladmin -uroot -p123123 version
mysqladmin Ver 8.42 Distrib 5.5.32, for linux2.6 on x86_64
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Server version 5.5.32
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /tmp/mysql.sock
Uptime: 5 min 21 sec Threads: 1 Questions: 168 Slow queries: 0 Opens: 113 Flush tables: 1 Open tables: 4 Queries per second avg: 0.523

1.6 有关LNMP环境扩展插件的部署说明

1.6.1 LNMP缓存加速特别提示

不管是Apache还是Nginx,最后都是通过PHP提供动态程序解析的,因此,不管是Apache的libphp5.so模块方式,还是Nginx的FCGI的PHP服务方式,最终在PHP引擎上的优化是一致的,即都是基于PHP服务(php.ini)的,因此,如无特殊说明,本节以后的环境安装和优化均适用于LNMP和LAMP。

1.6.2 解决部分加速软件的Perl编译问题

在下面各类软件的安装编译过程中,如果不解决Perl的一些环境问题可能会带来意想不到的安装错误或警告。为了避免出现这些问题导致前功尽弃,下面把一些拦路虎提前告诉大家,并解决之。

(1)配置环境变量LC_All

#配置环境变量LC_ALL的过程如下:
[root@LNMP ~]# echo 'export LC_ALL=C' >> /etc/profile
#设置环境变量,解决后面Perl程序插件的编译问题。符号“>>”表示向文件最佳内容
[root@LNMP ~]# tail -1 /etc/profile
#查看是否正确追加了export LC_ALL=C环境配置
export LC_ALL=C
[root@LNMP ~]# source /etc/profile
#使增加的环境变量配置生效
[root@LNMP ~]# echo $LC_ALL
C #查看生效结果,如果不设置该变量,在安装某些加速软件时,可能会遇到如下警告(安装eAccelerator时遇到警告)

(2)安装Perl相关软件依赖

需要提前安装Perl相关软件依赖软件包,执行yum -y install perl-CPAN或yum -y install perl-devel,任意一个即可,大约依赖17个包,提前解决后面安装软件时可能遇到的报错问题。

如果不安装上述软件包,在后面安装ImageMagick时可能会报错。后文安装ImageMagick时有相应的报错说明。

二,安装PHP缓存加速器扩展

2.1 安装PHP eAccelerator缓存加速模块

2.1.1 eAccelerator缓存加速插件说明

  • eAccelerator是一个免费的,开放源代码的PHP加速,优化及缓存的扩展插件软件,它可以缓存PHP程序编译后的中间代码文件(opcode),session数据等,降低PHP程序在编译解析时对服务器的性能开销。eAccelerator还可以加快PHP程序的执行速度,降低服务器负载压力,使PHP程序代码执行效率提高1~10倍。
  • eAccelerator会把编译好的PHP程序存放在共享内存里,然后每次从内存里调用执行,可以设定把一些不适合放在内存里缓存的编译结果存储到磁盘上,默认情况下,磁盘和内存缓存都会被eAccelerator使用。
  • eAcclelerator诞生于2004年,前身是Turck MMCache,因为开发者进入了Zend公司工作,所以开发eAccelerator的人继承了Turck MMCache的一些特性,从而设计出了eAccelerator加速器。
  • eAccelerator算是一个“老牌”的缓存加速软件,曾经在结合PHP引擎解析时被广泛使用,成熟稳定,目前代码更新不活跃,因此,使用的企业逐渐减少,但eAccelerator仍是一款值得信赖的缓存加速软件。XCache的官方也称赞eAccelerator是不错的opcode缓存器。
  • eAccelerator0.9.6.1版下载地址:https://github.com/eaccelerator/eaccelerator/downloads

2.1.2 eAccelerator插件安装过程

[root@LNMP ~]# ls -l eaccelerator-0.9.6.1.tar.bz2
-rw-r--r-- 1 root root 106049 Aug 22 17:05 eaccelerator-0.9.6.1.tar.bz2
[root@LNMP ~]# tar xf eaccelerator-0.9.6.1.tar.bz2 -C /usr/src/
[root@LNMP ~]# cd /usr/src/eaccelerator-0.9.6.1/
[root@LNMP eaccelerator-0.9.6.1]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626
[root@LNMP eaccelerator-0.9.6.1]# ./configure --enable-eaccelerator=shared --with-php-config=/usr/local/php/bin/php-config
[root@LNMP eaccelerator-0.9.6.1]# make
..以上省略若干..
Build complete.
Don't forget to run 'make test'.
[root@LNMP eaccelerator-0.9.6.1]# make install
Installing shared extensions: /usr/local/php5.3.28/lib/php/extensions/no-debug-non-zts-20090626/
[root@LNMP eaccelerator-0.9.6.1]# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
eaccelerator.so #最后生成了eaccelerator.so模块就表示eaccelerator成功安装

2.2 安装PHP XCache缓存加速模块

2.2.1 XCache缓存加速插件说明