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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:14:05