一,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请求及操作码缓存过程的原理示意图:
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请求及操作码缓存过程的原理示意图
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缓存加速插件说明
- XCache是一个开源的,又快又稳定的PHP opcode缓存器/优化器,其项目leader曾经是Lighttpd(和Nginx类似的高速Web服务软件)的开发成员之一。XCache把PHP程序编译后的数据(opcode)缓存到共享内存里,避免相同的1程序重复编译。用户请求相同的PHP程序时,可以直接使用缓存中已编译好的数据,从而提高PHP的访问速度,通常可以提升2~5倍,并大幅降低服务器负载开销。
- 很多公司使用XCache,它已经能在大流量/高负载的生产环境中稳定运行,与同类型的opcode缓存器相比在各个方面都更胜一筹,例如:社区活跃,快速开发,能够快速跟进PHP的版本更新等。
- 当前稳定版本为3.1.x(全面支持PHP5.15.5)和3.2.x(2014年底发布,全面支持PHP5.15.6)
XCache软件详情请参考:
http://xcache.lighttpd.net或httpLinux实战教学笔记36:PHP服务缓存加速深度优化实践的更多相关文章
- Linux实战教学笔记
Linux实战教学笔记01:计算机硬件组成与基本原理 Linux实战教学笔记02:计算机系统硬件核心知识 Linux实战教学笔记03:操作系统发展历程及系统版本选择 Linux实战教学笔记04:Lin ...
- Linux实战教学笔记22:企业级NFS网络文件共享服务
目录 第二十二节 企业级NFS网络文件共享服务 第一章 NFS网络文件共享服务 1.1 NFS介绍 1.2 NFS系统原理介绍 1.3 NFS服务端部署环境准备 1.4 NFS server端的设置 ...
- Linux实战教学笔记05:远程SSH连接服务与基本排错(新手扫盲篇)
第五节 远程SSH连接服务与基本排错 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 远程连接LInux系统管理 1.1 为什么要远程连接Linux系统 在实际的工作场景中,虚拟机界面或物理 ...
- Linux实战教学笔记06:Linux系统基础优化
第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...
- Linux实战教学笔记02:计算机系统硬件核心知识
标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 互联网企业常见服务器介绍 1.1 互联网公司服务器品牌 - DELL(大多数公司,常用) - HP - IBM(百度在用) 浪潮 联想 航天联 ...
- Linux实战教学笔记01:计算机硬件组成与基本原理
标签(空格分隔): Linux实战教学笔记 第1章 如何学习Linux 要想学好任何一门学问,不仅要眼睛看,耳朵听,还要动手记,勤思考,多交流甚至尝试着去教会别人. 第2章 服务器 2.1 运维的基本 ...
- Linux实战教学笔记12:linux三剑客之sed命令精讲
第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...
- Linux实战教学笔记17:精简shell基础
第十七节 精简shell基础 标签(空格分隔): Linux实战教学笔记 1,前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, ...
- Linux实战教学笔记18:linux三剑客之awk精讲
Linux三剑客之awk精讲(基础与进阶) 标签(空格分隔): Linux实战教学笔记-陈思齐 快捷跳转目录: * 第1章:awk基础入门 * 1.1:awk简介 * 1.2:学完awk你可以掌握: ...
随机推荐
- c语言学习之基础知识点介绍(九):预处理指令和多文件开发
一:预处理指令 /* 预处理指令: 作用:在程序编译之前做一些操作. 预处理命令写法的共同特点:都是以#号开头. 文件包含指令:#include 是一个文件包含命令. 作用:把某个文件内的内容读取出来 ...
- DB2中时间格式化
values to_char(current timestamp - 7 hours,'hh24')||'点' values varchar(hour(current time + 5 hour))| ...
- Linux中oracle安装时候报ora-00119解决办法
ORA-00119: invalid specification for system parameter LOCAL_LISTENER ORA-00130: invalid listener add ...
- WdatePicker日历控件使用方法(转)
转自:http://www.cnblogs.com/weixing/archive/2011/08/15/2139431.html WdatePicker日历控件使用方法 1. 跨无限级框架显示 ...
- 华丽的网上突出代码组件CodeMirror
农民之间的代码懒惰性质:愚公绝不能过夜.一劳永逸永远不知疲倦!这是一个代码示例 动态配置,在不同的场景抽象为常见的配置逻辑加,这使得有可能"为一个全球性的代码.代码做搬运工",更糟 ...
- Java源程序结构
完整的java源程序应该包括下列部分: 1.package语句 l java编译器为每个类生成一个字节码文件,且文件名与类名相同,这就会带来一个问题:同名的类会发生冲突. l 所以package的两个 ...
- FORM调用FORM(标准调客户化&;客户化调标准)并执行查询的实现研究
一.先来个比较简单的,标准FORM调用客户话FORM并执行查询 1.修改CUSTOM.PLL,使用 fnd_function.execute实现打开和传递参数 参考例子如下 PROCEDURE eve ...
- 使用c++如何实现在gRPC中传输文件
使用c++实现gRPC远程调用框架中传输文件,proto文件如下: syntax = "proto3"; package transferfile; service Transfe ...
- Oracle之带参存储过程(存储过程中for循环调用存储过程)
--带参存储过程create or replace procedure testdate(v in number) is i number; begin i:=v; insert into test_ ...
- 项目启动时 Exception in thread ";HouseKeeper"; java.lang.NullPointerException
首先查看是否是端口冲突引起,在日志信息该错误位置往上找,如果再无错误信息,而只有该错误,则原因可能如下: 原因: This is because Proxool is not being shutdo ...