在上篇文章中说了eAccelerator的安装,这篇文章主要说说eAccelerator的设置。顺便说说自己的经验。希望能给有跟我一样经历的人少走弯路。
同上篇文章一样,转载请注明作者出处,并保留链接。
作者:dgwxx 源自:《eAccelerator的设置与优化》
由于eAccelerator的网站已经托管到了GitHub上,文档的地址也发生了改变。一些早先的文章中的链接已经失效。新的文档地址如下:
或在Google中搜索“eAccelerator settings”。尽管目前网上有不少关于eAccelerator设置的文章,但无论怎么说还是官方文档最为权威和详细。本文也大量译自英文文档,算是二手资料了,所以能看懂英文的还是去看官方的比较好。
ini配置说明
与官方文档不同,这里我按照自己的理解对php.ini的各配置项进行归类说明。
eAccelerator控制参数
zend_extension / zend_extension_ts / extension = “/path/to/eaccelerator.so”
严格来说这三个不属于eAccelerator设定,而是php的设定。分别通过zend extension、thread safe的zend extension和php extension三种方式来加载eAccelerator。前二者必须指定eaccelerator.so的绝对路径。至于zend extension和php extension这两种加载方式有什么区别目前尚未看到相关文档提及,不知是否与zend optimizer有关。不过既然zend不再提供单独的zend optimizer + for php5.4(而是作为Zend Server的组件之一提供),所以也无所谓了。
eaccelerator.enable = “1”
控制是否开启eAccelerator。1为开启,0为关闭。
eaccelerator.optimizer = “1”
控制是否开启eAccelerator内部的优化器。1为开启,0为关闭。据说能够优化php代码,提高效率。eAccelerator执行优化的步骤是:读入php -> (优化 + 解析编译)-> 缓存。因此优化器不会每次都随php执行。
eaccelerator.check_mtime = “1”
是否检查php文件更改时间。1为检查,0为不检查。若开启,每执行一个php脚本eAccelerator都会比较该文件的最后更改时间与上次缓存时间,如果文件有更改则重新编译并缓存。如果不检查,除非文件缓存过期或手动清除缓存,都将直接走缓存,不会检查文件。检查文件更改会带来一些额外的开销,如果网站代码长期运行从不更改,可以考虑不去检查。但请注意(大)部分php程序会使用php文件存储缓存内容,尚不清楚关闭检查是否会影响php文件缓存的有效性。
eaccelerator.debug = “0”
是否将缓存命中状况等数据输出到log中。log存储路径在下面的log_file选项中设定。
eaccelerator.log_file = “/path/to/eaccelerator_log”
debug log输出路径。
eaccelerator.filter = “”
设置缓存哪些php脚本。支持通配符。以半角感叹号“!”开头的文件则永远不会被缓存。多条规则间用空格或tab隔开。例子:
“*.php”:缓存所有php文件(与””等价)。
“*.phtml”:缓存所有phtml文件。
“/home/www/index.php”:缓存”/home/www/index.php”。
“!/home*”:”/home”下的所有文件一律不缓存。
eaccelerator.allowed_admin_path=”/path/to/web_admin/”
设定基于web的管理平台(源代码包中的control.php)的路径。出于安全考虑只有该路径下的php脚本可以调用eAccelerator提供的管理、统计API。请务必在web server中限制该路径的访问权限,以免出现安全问题。
磁盘缓存相关参数
eaccelerator.cache_dir=”/path/to/cache”
设定缓存存储路径。需要写入权限。具体说明见安装篇。
内存缓存相关参数
eaccelerator.shm_size = “0”
设定共享内存的大小。单位M。如果启动web server(或fastcgi server)时提示:
Could not allocate 50331648 bytes, the maximum size the kernel allows is 33554432 bytes.
(数字依具体情况不同)说明你设定了大于系统共享内存上限的值。请降低共享内存设定,或提高系统共享内存上限设定。提高系统允许的上限需要编辑/etc/sysctl.conf,在其中加入:
kernel.shmmax = 67108864
后重新启动即可。
eaccelerator.shm_max = “0”
(存疑)设置用户能够通过eaccelerator_put()函数保存到共享内存中的最大数据大小,数值可以为bytes、K或M(如可以为10240,100K,1M),0为不限。新版eAccelerator应该已经不提供key / value缓存功能了,不知为什么这个参数依旧存在。
eaccelerator.shm_ttl = “0”
缓存时效n。当共享内存已满时,eAccelerator会尝试删除n秒以上没有访问的缓存。为0时eAccelerator将不会删除任何缓存。
eaccelerator.shm_prune_period = “0”
缓存时效m。当共享内存已满时, eAccelerator会尝试删除m秒以前访问过的缓存。为0时eAccelerator将不会删除任何缓存。
eaccelerator.shm_only = “0”
设置是否仅使用内存缓存。设置为0时将同时使用内存和硬盘缓存。设置为1时将禁用硬盘缓存,只使用内存缓存。
老版本参数
eaccelerator.name_space = “”
数据存储命名空间。当一台服务器上同时存在多个vhost时,用户向共享内存中存储的数据有可能发生重名冲突。例如域名dgwxx.com的用户通过eaccelerator_put向内存中保存了一个key为”name”、value为”dgwxx”的数据。此时nmm-hd.org的用户恰巧也试图向内存中保存key为”name”的数据,则会发生重名覆盖。因此默认情况下eAccelerator会以apache中设置的各虚拟主机的host名来区别不同vhost下的数据。
如果想阻止eAccelerator的该功能,在不同vhost间共享数据的话,则可在此设定一个统一的命名空间。
eaccelerator.compress = “1”
设置是否压缩数据。0为不压缩,1为压缩。
eaccelerator.compress_level = “9”
设置数据压缩级别。值为1~9间的整数。1压缩最快,压缩率最低;9压缩最慢,压缩率最高。
eaccelerator.keys / eaccelerator.session / eaccelerator.content = “shm_and_disk”
分别设置key、session、内容的存储方式。存储方式可为:
shm_and_disk:共享内存和磁盘缓存都用。
shm:优先使用共享内存,但当共享内存满,或试图存储的数据大于eaccelerator.shm_max的设定的时候,会将数据写入磁盘。
shm_only:只使用内存。
disk_only:只使用硬盘。
none:关闭该项功能,不进行存储。
磁盘缓存和内存缓存的选择
到此,eAccelerator的设置介绍完了。如何选择内存和硬盘缓存对于缓存效率来说非常关键。内存的速度固然快,但内存资源对于服务器来说永远都是不够用的。eAccelerator的缓存需要耗费大量空间,因此硬盘缓存也是一个不错的选择。不过对于一些磁盘负载巨大的服务器,或者超售严重的VPS来说(特别是后者),磁盘IO带来的损耗有时反而会让缓存变得比不缓存还慢。比如我现在用的VPS的磁盘就经常卡成一坨屎。因此对于有512M内存的VPS用户,分出48M左右的内存、关闭磁盘缓存应该不会给系统造成太大的负担。此外,根据服务器的应用和负载情况,在服务器运行一段时间之后通过control.php观察内存缓存使用情况,适当增减内存,让使用率正好保持在90%~100%左右是比较理想的状态。在NMM的服务器上,1个phpbb+1个wordpress+1个mediawiki给64M内存刚好差不多能装满。
最后贴一下NMM的配置:
[eaccelerator] extension=”eaccelerator.so” eaccelerator.cache_dir=”/usr/local/eaccelerator_cache” eaccelerator.allowed_admin_path = “/home/www” eaccelerator.shm_size=”48″ eaccelerator.enable=”1″ eaccelerator.optimizer=”1″ eaccelerator.check_mtime=”1″ eaccelerator.debug=”0″ eaccelerator.filter=”” eaccelerator.shm_max=”0″ eaccelerator.shm_ttl=”3600″ eaccelerator.shm_prune_period=”3600″ eaccelerator.shm_only=”1″
希望大家找到合适自己的配置。