php opcache工作原理简要描述

本文以php-fpm工作模式为例,mod_php除外。

当一个php文件被引用(require/include)执行时,如果有开启opcache,则首先查看opcache中是否有缓存该文件对应的opcode缓存,这样免除重新生成opcode的过程,也减少了一次磁盘IO。其实opcache缓存就是类似redis的k/v缓存,k是php脚本的绝对路径,value是该php脚本对应的opcode相关的缓存项信息。

其实php提供了一个方法,可以查看opcache当前命中率和共享内存使用情况等, opcache_get_status(), 可以在生成环境中创建一个php文件,通过web访问,观察命中率等情况, 从而对opcache做进一步优化。

opcache所使用的内存是共享内存,还是每个fpm进程都单独分配?在这之前,查阅很多资料,都没有详细介绍,最后不得不看源码。 

对于共享内存,实现方式有4种,但是应用程序中,最常用的为两种:

1、System V共享内存(通过linux ipcs命令可以查看)

2、Posix 共享内存。(如果是有mmap映射文件,一般在/dev/shm 文件夹中)

具体的这两种介绍可以查阅相关资料。

opcache所使用的共享内存到底是什么呢?通过翻源码,定位到核心位置:

php-7.x/sapi/fpm/fpm_shm.c文件中关键行:

22   mem = mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SAHRED, -1, 0);

可以看出使用的为Posix共享内存(有用mmap函数),没有映射文件(MAP_ANONYMOUS), 所以我之前查看/dev/shm 和ipcs命令都无法定位到Opcache用的共享内存到底在哪里,通过代码可以看到是一块匿名的没映射文件的一块内存,无法直接知道在哪里。但是多个fpm进程是可以直接共享读写的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值