Bash+PHP正则匹配异常:CONNECTED触发双输出问题排查
问题排查:CONNECTED状态同时输出两条信息的原因与解决办法
嘿,这问题其实挺典型的,我帮你捋一捋:
你这套Bash+PHP的日志监控逻辑思路没问题,但问题出在PHP脚本的switch语句里!
问题根源
你看这段核心代码:
switch ( $status ) { case "CONNECTED": //若传入的字符串包含CONNECTED print ( "we are connected\r\n" ) ; case "DISCONNECTED": //若传入的字符串包含DISCONNECTED print ( "we are disconnected\r\n" ) ; }
当$status是CONNECTED时,执行完print("we are connected...")之后,没有break语句终止当前case的执行,程序会继续往下“穿透”到DISCONNECTED的case块,把那条输出也执行了!
而DISCONNECTED状态正常是因为它是最后一个case,后面没有其他case了,执行完就自然结束,不会触发额外输出。
解决办法
给每个case块加上break;语句,让程序执行完当前case后就跳出switch结构:
#!/usr/bin/php <?php while ( false !== ( $connection_status = fgets ( STDIN ) ) ) { $get_status = preg_match ( "/\bCONNECTED\b|\bDISCONNECTED\b/", $connection_status, $status_match ) ; // 只有匹配成功时再处理,避免空遍历 if ($get_status) { foreach ( $status_match as $status ) { switch ( $status ) { case "CONNECTED": //若传入的字符串包含CONNECTED print ( "we are connected\r\n" ) ; break; // 终止当前case,不再往下执行 case "DISCONNECTED": //若传入的字符串包含DISCONNECTED print ( "we are disconnected\r\n" ) ; break; // 养成好习惯,后续扩展case时不容易出问题 } } } } ?>
额外小建议
我还顺手改了两个小细节:
- 去掉了
@$connection_status里的错误抑制符,万一fgets返回异常时,能看到错误信息方便排查 - 加了
if ($get_status)的判断,只有匹配到状态时才进入遍历,避免空数组的无效操作
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

