如何将PHP-FPM状态JSON转换为Bash可用数组?
将PHP-FPM JSON状态转换为Bash可用数组的解决方案
嘿,这个需求我之前帮同事处理过,用jq配合Bash的关联数组就能轻松搞定,步骤很清晰,我给你拆解一下:
1. 先确保jq已安装
jq是处理JSON的必备工具,先检查有没有安装,没有的话用包管理器安装:
# Debian/Ubuntu系 sudo apt update && sudo apt install -y jq # RHEL/CentOS系 sudo yum install -y jq
2. 获取PHP-FPM状态的JSON数据
用curl静默获取状态页面的JSON内容:
# 保存JSON到变量 PHP_FPM_JSON=$(curl -s http://localhost/status?json)
-s参数是让curl进入静默模式,避免输出无关的连接信息。
3. 转换为Bash关联数组
通过jq把JSON键值对转换成key=value的格式,再用Bash的while循环读取并赋值给关联数组:
# 声明关联数组 declare -A PHP_FPM_STATUS # 用jq解析JSON,生成key=value格式,再读入数组 while IFS="=" read -r key value; do PHP_FPM_STATUS["$key"]="$value" done < <(echo "$PHP_FPM_JSON" | jq -r 'to_entries[] | "\(.key)=\(.value)"')
这里jq的to_entries会把JSON对象转换成包含key和value的数组,然后我们用字符串拼接输出key=value的行,再通过进程替换(< <(...))传给while循环。
4. 使用数组进行检查和遍历
现在你就可以像操作普通Bash数组一样使用这个关联数组了:
# 遍历所有状态项,打印键和值 echo "=== PHP-FPM状态详情 ===" for key in "${!PHP_FPM_STATUS[@]}"; do echo "* $key: ${PHP_FPM_STATUS[$key]}" done # 示例:检查活跃进程数是否超过阈值 THRESHOLD=100 ACTIVE_PROCESSES=${PHP_FPM_STATUS["active processes"]} if [[ "$ACTIVE_PROCESSES" -gt "$THRESHOLD" ]]; then echo "⚠️ 警告:活跃进程数($ACTIVE_PROCESSES)已超过阈值($THRESHOLD)!" fi # 示例:检查是否达到过最大子进程数 if [[ "${PHP_FPM_STATUS["max children reached"]}" -eq 1 ]]; then echo "⚠️ 警告:PHP-FPM曾达到最大子进程数,可能需要调整配置!" fi
注意:因为JSON里的键包含空格(比如active processes),所以引用数组元素时必须用双引号把键括起来。
额外小技巧
如果你的JSON值里包含特殊字符(比如空格、引号),可以用jq的@sh过滤器来自动转义,确保Bash能正确解析:
# 带转义的版本 while IFS="=" read -r key value; do PHP_FPM_STATUS["$key"]="$value" done < <(echo "$PHP_FPM_JSON" | jq -r 'to_entries[] | "\(.key)=\(.value|@sh)"')
不过你的PHP-FPM状态值都是数字或简单字符串,这个技巧可能暂时用不上,但留着备用总是好的。
内容的提问来源于stack exchange,提问作者James Wilson
相关产品推荐
相关产品推荐

