PHP7升级-Opcache

想了解更多我的文章,请关注我的博客http://liuxiaochun.cn

配置推荐

opcache.enable=1
opcache.validate_timestamps=1
opcache.revalidate_freq=1
opcache.file_cache=/tmp
opcache.huge_code_pages=1
opcache.save_comments=0
opcache.max_accelerated_files=30000

huge_code_pages

在系统中开启HugePages, 然后开启Opcache的huge_code_pages,提升PHP7的性能。

$sudo sysctl vm.nr_hugepages=512

分配512个预留的大页内存:

$ cat /proc/meminfo  | grep Huge
AnonHugePages:    106496 kB
HugePages_Total:     512
HugePages_Free:      504
HugePages_Rsvd:       27
HugePages_Surp:        0
Hugepagesize:       2048 kB

然后在php.ini中加入:

opcache.huge_code_pages=1

PHP会把自身的text段, 以及内存分配中的huge都采用大内存页来保存, 减少TLB miss, 从而提高性能.

file_cache

opcache.file_cache=/tmp

配置二级缓存目录并启用二级缓存。 启用二级缓存可以在 SHM 内存满了、服务器重启或者重置 SHM 的时候提高性能。 默认值为空字符串 "",表示禁用基于文件的缓存。

save_comments

opcache.save_comments=0

可以根据项目情况设置。如果禁用,脚本文件中的注释内容将不会被包含到操作码缓存文件, 这样可以有效减小优化后的文件体积。 禁用此配置指令可能会导致一些依赖注释或注解的 应用或框架无法正常工作, 比如: Doctrine, Zend Framework 2 以及 PHPUnit。

max_accelerated_files

OPcache 哈希表中可存储的脚本文件数量上限。 真实的取值是在质数集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一个大于等于设置值的质数。 设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。建议设置至少要大于项目文件总数。

慎用enable_cli=true

如果项目框架里有PHP_SAPI === 'cli'类似的判断,请不要开启enable_cli=true。因为开启这个并且设置了file_cache,php-fpm和cli会共用file_cache,如果php-fpm先执行了,再用cli方式执行脚本,那么PHP_SAPI的返回并不是'cli'。而且官方文档里明确写着:仅针对 CLI 版本的 PHP 启用操作码缓存, 通常被用来测试和调试。总之,请慎用。

链接目录的坑

.
├── webroot -> releases/v1
└── releases
    ├── v1
    │   ├── foo.php
    │   └── config -> conf/v1
    └── v2
        ├── foo.php
        └── config   -> conf/v2

webroot是nginx路由的根目录,本身是个链接目录,然后config作为配置又链接到conf目录。
这种链接结构的目录强烈不推荐,因为这个会造成opcache不会刷新,主要是因为 opcache 是通过 realpath cache 获取文件信息,即便软链接已经指向了新位置,但是如果 realpath cache 里还保存着旧数据的话,opcache 依然无法知道新代码的存在。查阅相关资料并验证了如下解决方案:

  • 重启PHP-FPM
  • 修改NGINX配置,这样会有一定的IO消耗
##修改前
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $document_root;
##修改后
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
  • 等待realpath cache自动刷新,php.ini默认刷新时间是两分钟
realpath_cache_ttl = 120
  • opcache.revalidate_path=1 社区里讨论修改opcache.ini参数,经过验证不起作用
  • 最完美的解决方案就是不用链接,比如说config链接,完全可以在发布的时候直接将conf的代码拷贝到对应的位置。至于webroot根目录,完全可以弃用,直接配置nginx conf root=releases/v1即可。

安全漏洞

  • opcache.file_cache_only=0
  • opcache.validate_timestamp=1
  • 谨慎地审查我们的代码,并检查网站中是否存在文件上传漏洞
    这三点尽量注意,就可以避免一定的安全问题

Reference

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,273评论 19 139
  • 这两天把项目部署到线上,还不太懂Linux的操作,所以在Windows下折腾了一番环境。琐碎的配置太多,在这里记录...
    Veekend阅读 5,781评论 0 8
  • 转载自cr180大神DiscuzX2.5完整目录结构【source程序文件库】 /source/admincp后台...
    cndaqiang阅读 4,494评论 1 2
  • 天凉风冷 带娃出行 雕塑公园 滑梯沙子 三点多启程 看艳阳高照 返程六点余 有月光如水 人未出门 连声叫饿 两串鹌...
    朱团辉阅读 1,702评论 0 6
  • 散人打坐秋水堂,貌似虔敬上高香。 暗室幽幽烛火旺,打坐参禅檀烟长。 装模作样佛门下,满腹鬼点花花肠。 墨镜一戴蔫学...
    不惑而歌阅读 3,550评论 41 44

友情链接更多精彩内容