rtl_433命令输出无法通过管道传入PHP脚本问题求助
问题解决:rtl_433管道输出无法被PHP脚本接收
问题现象
- 测试命令
echo TEST | php sensors.php正常运行,PHP脚本可接收并输出数据; - 执行
rtl_433 -f 344975000 -F json -M utc | php sensors.php时,PHP仅输出STARTING PHP SCRIPT,无法接收rtl_433的JSON数据; - 单独执行rtl_433命令可正常输出Honeywell-Security设备的JSON格式传感器数据。
原PHP代码:
<?php echo "STARTING PHP SCRIPT" . PHP_EOL; $data = stream_get_contents(STDIN); echo "DATA FROM PHP SCRIPT IS: " . $data . PHP_EOL; ?>
问题原因
stream_get_contents(STDIN) 会阻塞进程直到输入流完全关闭才会读取全部内容。而rtl_433是持续监听传感器的程序,会不断输出JSON数据且不会主动终止进程,导致输入流一直处于打开状态,PHP脚本会卡在读取步骤,无法执行后续输出。
而echo TEST是一次性输出数据后立即终止进程,输入流随之关闭,所以PHP能正常读取到数据。
解决方案
方案1:逐行读取实时数据(推荐)
修改PHP脚本为逐行读取标准输入,适配rtl_433的持续输出特性:
<?php echo "STARTING PHP SCRIPT" . PHP_EOL; // 循环读取每一行输入,直到流关闭 while (($line = fgets(STDIN)) !== false) { $trimmedLine = trim($line); echo "RECEIVED JSON: " . $trimmedLine . PHP_EOL; // 可选:解析JSON为数组处理 $sensorData = json_decode($trimmedLine, true); if ($sensorData) { echo "PARSED SENSOR DATA: " . print_r($sensorData, true) . PHP_EOL; } } ?>
执行原命令即可实时接收每一条传感器数据。
方案2:让rtl_433主动终止输出
如果需要一次性读取所有数据,可限制rtl_433的运行时间,比如用timeout命令让它运行10秒后终止:
timeout 10 rtl_433 -f 344975000 -F json -M utc | php sensors.php
或者使用rtl_433的-t参数(测试模式,默认运行60秒后退出):
rtl_433 -f 344975000 -F json -M utc -t | php sensors.php
此时rtl_433终止后输入流关闭,PHP脚本会读取到所有输出数据并执行后续打印。
内容的提问来源于stack exchange,提问作者Jrow
相关产品推荐
相关产品推荐

