You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:25:24