对于小型Web应用,Redis/Memcached这种内存数据库显然没有太大必要,因为它们不一定能带来资源开销的降低,性能上也未必能有太大提升。而PHP的一些拓展,比如OPCache,若是设置得当,优化效果还是比较显著的。

什么是Zend OPCache?

  PHP在得到Web服务的Request后会将代码进行预编译,生成字节码加载到内存中交由处理器执行。Zend OPCache提供了一种提升性能的方式,通过将 PHP 脚本预编译的字节码存储到共享内存中,省去了重复请求中每次加载和解析PHP脚本的资源开销。

如何配置OPCache?

  首先确保OPCache拓展已安装。以PHP 7.0为例,执行apt install php7.0-opcache即可。当然,更多的情况是编译安装,configure时带上--enable-opcache就成。

  编辑php.ini(找不到?执行find / -name "php.ini",fpm下的那个就是),定位到[opcache]下,开始动手修改。

  首先启用OPCache(注意去除注释符;

1
opcache.enable=1

  接下来整几个重要的参数。

  调整OPCache共享内存大小,推荐128MB及以上。

1
opcache.memory_consumption=256

  调整字符串驻留(String Interning)缓冲区,即分配给实际字符串的空间,推荐64MB及以上。

1
opcache.interned_strings_buffer=64

  调整内存中缓存文件数,这个值应当大于硬盘上所有PHP脚本文件数。

1
opcache.max_accelerated_files=30000

  允许在脚本中保留注释。推荐开启该选项以获得最佳兼容性。

1
opcache.save_comments=1

  启用“快速重启“机制,对fpm生效,可以更快速地释放内存。

1
opcache.fast_shutdown=1

  脚本更新检查。timestamps=0意味着从不检查,同时revalidate_freq会被忽略,如果硬盘上有PHP脚本被修改则必须手动清除缓存。建议设定为每120秒检查一次。

1
2
opcache.validate_timestamps=1
opcache.revalidate_freq=120

  控制优化级别,保持默认值即可。

1
opcache.optimization_level=0xffffffff

  配置完毕,保存并重启php-fpm,OPCache生效,可以用phpinfo();查看相关信息。至于效果,笔者先前用locust做过压测,稳定状态下QPS提升了3-5倍。