本文以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进程是可以直接共享读写的。
|