如何在PHP内部获取php-fpm状态信息?请勿使用curl本地请求
在PHP内部直接获取php-fpm状态信息
嘿,要绕开curl请求本地页面,直接在PHP里拿php-fpm的状态?没问题,核心思路是直接读取php-fpm存储状态的共享内存段——毕竟php-fpm的状态数据本来就存在这,不用走HTTP那层弯路。下面给你详细说怎么操作:
第一步:找到php-fpm的共享内存键
首先得定位到php-fpm用来存状态的共享内存的键值。你可以在服务器上跑这个命令查:
ipcs -m
输出里找和php-fpm相关的条目,通常那个key列的值就是你要的。要是找不到,也可以去看php-fpm的配置文件(比如www.conf),里面的pm.status_shm_key参数要么是已经设置好的键,要么php-fpm会自动生成一个。另外,有些版本的php-fpm启动时会在日志里打出这个键值,也可以去日志里翻一翻。
第二步:用PHP的POSIX扩展读取共享内存
PHP的POSIX扩展自带操作共享内存的函数,咱们用它直接把状态数据读出来就行。给你个示例代码,记得把里面的共享内存键换成你自己找到的:
<?php // 把这里换成你查到的共享内存键值,比如0x123456 $shmKey = 0x123456; // 打开共享内存段,'a'表示只读访问 $shmId = shmop_open($shmKey, 'a', 0, 0); if (!$shmId) { die("打不开目标共享内存段,检查键值和权限哦"); } // 获取共享内存的大小,方便一次性读全 $shmSize = shmop_size($shmId); // 读取所有数据 $statusRaw = shmop_read($shmId, 0, $shmSize); // 用完记得关闭共享内存段 shmop_close($shmId); // php-fpm存在共享内存里的状态是INI格式的文本,直接解析成数组就行 $statusInfo = parse_ini_string($statusRaw); // 看看拿到的状态信息 print_r($statusInfo); ?>
一些要注意的点
- 得确保你的PHP安装并启用了POSIX扩展,跑
php -m | grep posix就能检查有没有。 - 运行PHP的用户得有访问这个共享内存段的权限,一般来说如果PHP和php-fpm是同一个用户运行的,就没问题;如果权限不够,可能需要调整共享内存的权限或者PHP的运行用户。
- 不同版本的php-fpm可能在共享内存里的数据格式有小差异,但大部分情况下
parse_ini_string都能搞定,要是遇到解析不了的情况,可能得自己手动处理一下原始文本。
另外还有个备选方案:通过/proc文件系统读取php-fpm进程的状态,但这个需要访问/proc目录,还要手动解析进程的stat文件,操作起来比读共享内存麻烦多了,还是优先用上面的方法吧。
内容的提问来源于stack exchange,提问作者tback
相关产品推荐
相关产品推荐

