PHP服务缓存加速优化实战
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP服务缓存加速优化实战相关的知识,希望对你有一定的参考价值。
一 php缓存加速介绍与环境介绍
1 PHP缓存加速介绍
1 操作码
操作码是PHP编译后的一个中间文件,是一个字节码。
nginx 并发最大万 ,PHP并发次之几百 ,mysql最小 几百,想要网站的并发增大,首先需要优化的是PHP和mysql。
PHP的解析时在服务端的在解析PHP语言时会生成一个特定的操作码,默认情况下PHP将程序执行后就会删除此操作码,而操作码缓存的原理是将编译后的操作码保存下来,并放入到共享内存中,以便在下次调用该PHP页面时重用他,避免了相同代码的重复编译,节省了PHP引擎重复编译的时间,降低了服务器负载,同时减少了CPU和内存开销
2 PHP操作码缓存原理图
互联网企业最大的瓶颈是PHP和mysql的瓶颈
流程说明:
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并执行,将结果返回。
3 PHP加速器的种类
1 xcache
2 eaccelerator
3 APC
4 zendopcache
选择方式:通过自己将平台打好进行压力测试,选择自己最合适的
建议:
1 首选xcache,原因是效率好,快,社区活跃支持更高的版本
2 次选eaccelerator,原因,安装配置简单,加速效果更高,文档资料多,但官方不活跃,仅适合于PHP版本5.4以下的程序
3 再选则zendopcache,原因是PHP官方颜值,发展潜力好,PHP5.5之前可以通过zendopcache软件以插件扩展的方式安装,从PHP5.5版本开始已经整合到PHP软件中,编译时只需要指定相关参数即可
4 APC 了解内容
二 实验环境搭建
软件包:
链接:https://pan.baidu.com/s/1LZvqZcjC5tgbL29dRv1N-Q
密码:ec45
1 安装并配置PHP
2 安装并配置nginx
3 配置nginx支持PHP
4 测试
三 缓存加速器的安装
1 eaccelerator 安装与加载
1 eaccelerator 缓存加速软件说明
免费的、开源的PHP加速、优化及缓存的扩展插件软件,可以缓存PHP程序编译后的中间代码opcode、session数据等,降低PHP程序在编译解析时对服务器的性能开销,其还可以加快PHP程序执行的速度,降低服务器负载压力,是PHP程序代码执行效率更高。
2 基本原理
eaccelerator 会把编译好的PHP程序存放在共享内存中。然后每次从内存中调用执行。
2 xcache 安装与加载
1 xcache 缓存加速软件说明
开源、稳定的PHP opcode缓存优化器。
2 原理
xcache把PHP程序编译后的数据opcode缓存到共享内存中,表面相同的程序重复执行。用户请求数据时,可以直接使用缓存中的数据,提高PHP的访问速度,通常可以提高2-5倍。
3 znedopcache 安装
1 zendopcache 插件说明
是PHP官方为适应市场需要而开发的一款软件,在PHP5.5 之前,需要手工进行编译,但在5.5之后,只需要在编译PHP的时候加上 --enable-opcache就行了。
4 PHP memcached 扩展插件的安装
1 memcached 缓存流程图
2 memcached 工作步骤如下:
1 程序首先检查客户端请求的数据在memcached 服务的缓存中是否存在,如果存在,直接把请求的数据返回,不再请求后端数据库
2 如果请求的数据在memcached缓存中不存在,则程序会去memcached后端的数据库服务器服务
3 把从数据库中取到的数据返回给客户端
4 同时把新取到的数据缓存一份到memcached服务器缓存中,下次同样的请求就直接从memcached服务缓存返回数据,从而减轻数据库的访问压力
5 安装插件PDO_MYSQL扩展模块
PDO 为PHP访问数据库定义了一个轻量级一致性的接口,他提供了一个数据访问抽象层,这样,无论使用什么样的数据库,都可以通过一致性的函数执行查询并获取数据。
若未安装,则
6 安装图形化扩展模块
1 安装依赖模块
2 安装解压包
3 安装imagemagick
是一款强大而且稳定的免费的工具集和开发包,可以用来读、写和处理超过89中基本格式的图片文件。
4 安装imagick
imagick 插件需要imagemagick软件的支持,所以必须先安装上述软件。
imagick插件是一个可以提供PHP调用imagemagick功能的扩展模块,使用这个扩展模块可以使PHP具备和imagemagick相同的功能。
5 查看
7 基础总结
此中模块中的作用是一致的,每次只能安装一个
此中模块的功能是一致的。用于实现同样的功能
此模块是用于链接数据库
配置上述模块生效的方式,如果有/etc/php.d 则添加
其默认读取文件
如果没有/etc/php.d 则 通过在php.ini中添加
此处如果不配置。则下面的模块指定的是模块的绝对路径,如果配置,则指定的是模块的相对路径,其中其路径是在make install 模块时生成的路径
如果添加,则需要重启才能完成,此处我已经配置完成,因此可以直接查看
四 缓存加速器优化实战
1 配置eaccelerator 生效
1 基本配置与加载
2 参数相关配置
方法一 ,在没有/etc/php.d 的情况下配置:
方法二: 在有.etc/php.d中的配置
参数解释:
eaccelerator.shm_size="64"
eAccelerator 可以使用的共享内存的数量 (以兆为单位) . "0" 是指操作系统的默认值. 默认值是 "0".可根据服务器的实际情况来调整,16,32,64,128都是可以的。
eaccelerator.cache_dir="/tmp/eaccelerator"
这个目录是给磁盘缓存使用. eAccelerator 在这里储存预先编译好的代码, 进程数据, 内容以及用户的自定义内容. 同样的数据也能被储存在共享内存中 (这样可以提高访问速度). 默认的设置是 "/tmp/eaccelerator".
eaccelerator.enable="1"
开启或关闭 eAccelerator。"1" 为开启,"0" 为关闭。默认值为 "1"。
eaccelerator.optimizer="1"
启或关闭内部优化器,可以提升代码执行速度。"1" 为开启,"0" 为关闭。默认值为 "1"。
eaccelerator.check_mtime="1"
打开或者关闭 PHP 的文件修改检查. "1" 是指打开, "0" 是指关闭. 如果您在修改以后重新编译 PHP 的文件,那么您应当设置为 "1". 默认值是 "1".
eaccelerator.debug="0"
开启或关闭调试日志记录。"1" 为开启,"0" 为关闭。默认值为 "0"。会将缓存命中得记录写入日志。
eaccelerator.filter=""
判断哪些 PHP 文件必须缓存。您可以指定缓存和不缓存的文件类型(如 ".php .phtml"等)
如果参数以 "!" 开头,则匹配这些参数的文件被忽略缓存。默认值为 "",即,所有 PHP 文件都将被缓存。
eaccelerator.shm_max="0"
当使用 " eaccelerator_put() " 函数时禁止其向共享内存中存储过大的文件。该参数指定允许存储的最大值,单位:字节 (10240, 10K, 1M)。"0" 为不限制。默认值为 "0"。
eaccelerator.shm_ttl="0"
当 eAccelerator 获取新脚本的共享内存大小失败时,它将从共享内存中删除所有在最后 "shm_ttl" 秒内没有存取的脚本缓存。默认值为 "0",即:不从共享内春中删除任何缓存文件。
eaccelerator.shm_prune_period="0"
当 eAccelerator 获取新脚本的共享内存大小失败时,他将试图从共享内存中删除早于"shm_prune_period" 秒的缓存脚本。默认值为 "0",即:不从共享内春中删除任何缓存文件。
eaccelerator.shm_only="0"
允许或禁止将已编译脚本缓存在磁盘上。该选项对 session 数据和内容缓存无效。默认值为 "0",即:使用磁盘和共享内存进行缓存。
eaccelerator.compress="1"
允许或禁止压缩内容缓存。默认值为 "1",即:允许压缩。
eaccelerator.compress_level="9"
指定内容缓存的压缩等级。默认值为 "9",为最高等级。
3 创建写入目录并重启服务
4 tmpfs优化:
tmpfs 是一种基于内存的文件系统,通常使用tmpfs 作为数据临时存储,彼此盘存储快得多,此方法适用于各种缓存场景。
添加tmpfs
2 配置 XCache 插件加速
1 基本配置与加载
2 参数详解
[xcache-common]
extension = xcache.so
[xcache.admin]
;登录管理界面的用户名和密码,留空则禁用管理界面
xcache.admin.enable_auth = On
管理用户名
xcache.admin.user = "xcache-admin"
MD5加密后的密码,# echo -n pass | md5sum
xcache.admin.pass = ""
[xcache]
决定 XCache 如何从系统分配共享内存
xcache.shm_scheme = "mmap"
所用共享缓存的大小。如果为0,缓存将无法使用
xcache.size = 60M
指定将 cache 切分成多少块, 建议设置为 cpu 数 (cat /proc/cpuinfo |grep -c processor)
xcache.count = 1
只是作为 hash 槽个数的参考值, 您可以放心地缓存超过这个个数的项目.
xcache.slots = 8K
Opcode文件的生存时间。如果将此值设置为0,则将无限期缓存 (int)
xcache.ttl = 0
触发垃圾回收的时间间隔。默认设置为0 (秒)
xcache.gc_interval = 0
同上, 只是针对变量缓存设置
xcache.var_size = 4M
xcache.var_count = 1
xcache.var_slots = 8K
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300
启用或禁用测试功能
xcache.test = off
如果启用了 ReadonlyProtection, 将会略微降低性能, 但是会提高一定的安全系数.
这个选项对于xcache.mmap_path = /dev/zero 无效.
xcache.readonly_protection = On
用于只读保护的文件路径
这将限制两个 php 进程组共享同一个 /tmp/xcache 目录, 指定为 /dev/zero 时无效
xcache.mmap_path = "/tmp/xcache"
在遇到故障时,放置核心转储的目录。必须是PHP可写入的目录。保留为空代表禁用.
xcache.coredump_directory = ""
仅用于 Windows
xcache.coredump_type = 0
xcache.disable_on_crash = off
xcache.experimental = off
使用/不使用 opcode 缓存. xcache.size = 0 时无效.
xcache.cacher = On
使用 stat() 发现检查脚本更新.
xcache.stat = ON
启用或禁用优化。默认状态为禁用
xcache.optimizer = off
[xcache.coverager]
启用代码覆盖信息采集器
启用后 xcache.coveragedump_directory 设置以及 xcache_coverager_start/stop/get/clean() 系列函数才可以使用. (启用后会对降低影响).
xcache.coverager = off
每个页面请求自动调用 xcache_coverager_start()
xcache.coverager_autostart = off
放置数据采集信息的目录位置。默认使用目录 /tmp/pcovis
xcache.coveragedump_directory = ""
3 配置web界面查看xcache缓存信息
1 配置登录用户名和密码
2 复制相关网页到nginx默认发布目录
4 登录并查看
3 配置 zendopencache优化
1 基本配置与加载
2 opcache 重要参数说明
1 Zend Optimizer + 的开关, 关闭时代码不再优化.
opcache.enable=1
opcache.enable_cli=1
2 Zend Optimizer + 共享内存的大小, 总共能够存储多少预编译的 PHP 代码(单位:MB)推荐 128
opcache.memory_consumption=64
3 Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB)推荐 8
opcache.interned_strings_buffer=4
4 最大缓存的文件数目 200 到 100000 之间,推荐 4000
opcache.max_accelerated_files=2000
5 内存“浪费”达到此值对应的百分比,就会发起一个重启调度.
opcache.max_wasted_percentage=5
6 开启这条指令, Zend Optimizer + 会自动将当前工作目录的名字追加到脚本键上,
以此消除同名文件间的键值命名冲突.关闭这条指令会提升性能,
但是会对已存在的应用造成破坏.
opcache.use_cwd=0
7 开启文件时间戳验证
opcache.validate_timestamps=1
8 2s检查一次文件更新 注意:0是一直检查不是关闭,推荐 60
opcache.revalidate_freq=2
9 允许或禁止在 include_path 中进行文件搜索的优化,opcache.revalidate_path=0
10 是否保存文件/函数的注释 如果apigen、Doctrine、 ZF2、 PHPUnit需要文件注释,推荐 0
opcache.save_comments=1
11 是否加载文件/函数的注释,opcache.load_comments=1
打开快速关闭, 打开这个在PHP Request Shutdown的时候会收内存的速度会提高 推荐 1
opcache.fast_shutdown=1
12 允许覆盖文件存在(file_exists等)的优化特性。opcache.enable_file_override=0
13 定义启动多少个优化过程
opcache.optimization_level=0xffffffff
14 启用此Hack可以暂时性的解决”can’t redeclare class”错误.
opcache.inherited_hack=1
15 启用此Hack可以暂时性的解决”can’t redeclare class”错误.
opcache.dups_fix=0
16 设置不缓存的黑名单
不缓存指定目录下cache_开头的PHP文件. /png/www/example.com/publichtml/cache/cache\
opcache.blacklist_filename=
17 通过文件大小屏除大文件的缓存.默认情况下所有的文件都会被缓存.
opcache.max_file_size=0
18 每 N 次请求检查一次缓存校验.默认值0表示检查被禁用了.
由于计算校验值有损性能,这个指令应当紧紧在开发调试的时候开启.
opcache.consistency_checks=0
19 从缓存不被访问后,等待多久后(单位为秒)调度重启
opcache.force_restart_timeout=180
20 错误日志文件名.留空表示使用标准错误输出(stderr).
opcache.error_log=
21 将错误信息写入到服务器(Apache等)日志
opcache.log_verbosity_level=1
22 内存共享的首选后台.留空则是让系统选择.
opcache.preferred_memory_model=
23 防止共享内存在脚本执行期间被意外写入, 仅用于内部调试.
opcache.protect_memory=0
五 总结:
生产环境PHP扩展插件安装建议
PHP EXT module | 说明 | 备注 |
---|---|---|
eaccelerator | 适合PHP5.3及以前的版本,PHP缓存加速 | PHP可选扩展插件 |
ImageMagick.tar.gz | 常用图像处理程序,属功能应用 | 非PHP的扩展插件 |
imagick-2.3.0.tgz | 需要先安装图形处理程序,属功能应用 | 可选PHP插件 |
memcache-2.7.7.tgz | memcached客户端数据库缓存优化 | 可选PHP插件 |
PDO_MYSQL-1.0.2.tgz | PHP数据库访问插件,属于功能应用 | 可选PHP扩展 |
xcache-3.0.0.tar.bz2 | 支持PHP5.1-5.6,PHP缓存加速 | 可选PHP插件 |
zendopcache-7.0.5.tgz | 支持PHP5.3-5.4,PHP缓存加速 | 可选PHP插件 |
以上是关于PHP服务缓存加速优化实战的主要内容,如果未能解决你的问题,请参考以下文章