
本文介绍在不修改 PHP 脚本逻辑、不引入额外依赖的前提下,通过 Kubernetes exec 类型 liveness probe 监控无服务暴露的批处理 CLI 进程是否存活并持续工作。
本文介绍在不修改 php 脚本逻辑、不引入额外依赖的前提下,通过 kubernetes `exec` 类型 liveness probe 监控无服务暴露的批处理 cli 进程是否存活并持续工作。
对于运行在 Kubernetes 中的长期 PHP CLI 批处理任务(如数据清洗、报表生成、ETL 等),由于其不启动 HTTP 或其他网络服务,传统基于 HTTP 的 livenessProbe 不适用;而单纯检查进程是否存在(如 ps aux | grep php)也存在误判风险——进程可能僵死、卡住或陷入无限循环,但仍在系统中“存活”。
推荐方案是采用 exec 类型的 liveness probe,配合轻量级状态标记机制:PHP 主脚本在正常执行过程中周期性更新一个本地文件(如 /tmp/health.stamp)的时间戳,而探针通过检查该文件的存在性与新鲜度来判断业务是否健康。
✅ 示例实现步骤:
-
在 PHP CLI 脚本中添加心跳写入逻辑(无需外部库):
// 在主循环关键位置(例如每处理完一批数据后)插入: file_put_contents('/tmp/health.stamp', date('c')); -
编写探针命令(Shell 层面校验文件时效性):
推荐使用stat+date判断文件是否在合理窗口内被更新(例如:30 秒内):# 检查 /tmp/health.stamp 是否存在且距今不超过 30 秒 [ -f /tmp/health.stamp ] && [ $(($(date +%s) - $(stat -c '%Y' /tmp/health.stamp))) -le 30 ]
-
Kubernetes Pod 配置示例(关键片段):
livenessProbe: exec: command: - sh - -c - '[ -f /tmp/health.stamp ] && [ $(($(date +%s) - $(stat -c "%Y" /tmp/health.stamp))) -le 30 ]' initialDelaySeconds: 30 # 给脚本充分启动时间 periodSeconds: 15 # 每15秒探测一次 failureThreshold: 3 # 连续3次失败才重启 timeoutSeconds: 5
⚠️ 注意事项:
- 确保容器内安装了
stat命令(多数基础镜像如php:alpine需apk add --no-cache coreutils;php:debian默认包含);若不可用,可用ls -la /tmp/health.stamp 2>/dev/null | head -n1辅助判断,但精度略低。 - 避免将心跳文件写入内存受限路径(如某些 tmpfs 卷),建议使用默认可写路径
/tmp。 -
initialDelaySeconds必须大于 PHP 脚本完成初始化所需时间,防止探针过早触发误杀。 - 不建议仅检查文件存在性(如
test -f /tmp/health.stamp),否则无法识别脚本挂起后未更新时间戳的情况。
总结:该方案零侵入 PHP 业务逻辑,仅需两行 PHP 写入 + 一行 Shell 校验,即可实现对长时 CLI 任务的精准存活性感知,兼顾简洁性、可靠性和可观测性,是生产环境中推荐的轻量级实践模式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











