跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

php嵌入式脚本怎么写_编写php守护进程监控硬件状态【操作】

PHP不能直接写嵌入式脚本,它只能在Linux嵌入式设备上通过/sys、/proc等接口或外部命令读取硬件状态,本质是用户态CLI程序,需手动处理路径差异、权限检查及资源泄漏问题。 PHP 能不能直接写嵌入式脚本? 不能——PHP 本身不是嵌入式语言,没有裸机运行能力,也不提供对 GPIO、寄存器或中断的直接访问。所谓“PHP 嵌入式脚本”,实际是指在 Linux 嵌入式设备(如树莓派、Orange Pi、ARM 开发板)上,用 PHP 编写用户态监控程序,通过系统接口读取硬件状态。 这类脚本本质是普通 PHP CLI 程序,依赖 Linux 内核暴露的
/sys
、
/proc
、
/dev
接口,或调用
vcgencmd
、
lm-sensors
等命令行工具。 怎么用 PHP 读取 CPU 温度和内存使用率? 关键路径和命令必须硬 编码 或配置化,不能靠 PHP 自身函数推断。不同平台路径差异大,比如树莓派用
/sys/class/thermal/thermal_zone0/temp
,而 x86 主板 可能要靠
sensors
命令解析输出。
/sys/class/thermal/thermal_zone0/temp
返回的是毫摄氏度整数(如
48500
→ 48.5°C),需除以 1000
/proc/meminfo
中
MemAvailable:
和
MemTotal:
行可算出可用内存占比 务必加
is_readable()
和
file_get_contents()
错误检查,否则权限不足时静默失败
#!/usr/bin/env php $meminfo = file('/proc/meminfo'); $total = $available = 0; foreach ($meminfo as $line) { if (preg_match('/^MemTotal:\s+(\d+)/i', $line, $m)) $total = $m[1]; if (preg_match('/^MemAvailable:\s+(\d+)/i', $line, $m)) $available = $m[1]; } if ($total && $available) { $used_pct = round(100 * ($total - $available) / $total, 1); echo "Memory: {$used_pct}%\n"; } ?>
怎么让 PHP 脚本变成守护进程持续运行? PHP 没有内置 daemonize 支持,
pcntl_fork()
+
posix_setsid()
可模拟,但极易出错:信号处理遗漏、子进程残留、标准流未重定向都会导致后台崩溃或日志丢失。 立即学习 “ PHP免费学习笔记(深入) ”; PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 更可靠的做法是交给系统服务管理器,比如 systemd —— 它负责重启、日志、资源限制、启动顺序,PHP 只管逻辑。 写一个简单的循环脚本,每 10 秒采集一次,输出到
error_log()
或
file_put_contents(..., FILE_APPEND)
不要用
sleep()
长期阻塞而不设超时,避免被 systemd 的
RuntimeMaxSec
杀掉 systemd service 文件中必须设
Type=oneshot
+
RemainAfterExit=yes
,或直接用
Type=simple
并确保主进程不退出
[Unit] Description=Hardware Monitor via PHP After=network.target

[Service] Type=simple User=pi WorkingDirectory=/opt/hwmon ExecStart=/usr/bin/php /opt/hwmon/monitor.php Restart=always RestartSec=5 StandardOutput=journal StandardError=journal

[Install] WantedBy=multi-user.target

为什么监控脚本总在几小时后停止? 常见原因不是 PHP 报错,而是资源泄漏或环境变化: 没关闭
fopen()
打开的文件句柄,
file_get_contents()
多次调用会耗尽 fd(尤其在循环中反复读
/sys/...
) 没设置
set_time_limit(0)
,CLI 默认 300 秒超时(虽然通常不会触发,但某些发行版会改默认值) 系统升级 后
/sys/class/thermal/
路径变更(例如从
thermal_zone0
变成
thermal_zone1
),脚本继续读空值却不报错 日志写满磁盘或
journalctl
被轮转,systemd 无法写日志时可能静默终止服务 真正稳定的硬件监控,PHP 只适合轻量胶水层;高频/低延迟/高可靠性场景应换 C/Python + libgpiod 或专用工具(如
collectd
)。PHP 守护进程容易被当成“能跑就行”,但温控误判可能导致设备过热关机——这点比语法错误更难调试。

相关文章