PHP调用exec类函数执行网卡上传速率命令报错求助
解决PHP执行网卡速率命令时的语法错误问题
这个问题我太熟了!报错的核心原因是:你用的<(...)是Bash专属的进程替换语法,但PHP的system()、exec()、shell_exec()这些函数默认调用的是sh(不是Bash),而sh并不支持这种语法,所以才会抛出Syntax error: "(" unexpected的错误。
下面给你两种靠谱的解决办法:
方法一:强制用Bash执行命令
直接把你的命令包裹在bash -c里,让Bash来解析整个命令(这样就能支持进程替换了)。注意转义要正确,PHP代码可以这么写:
<?php // 用双引号包裹外层,内部转义更清晰 $command = "bash -c 'awk \'{if(l1){print ($10-l2)/1024/1024} else{l1=$2; l2=$10;}}\' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)'"; $result = shell_exec($command); echo "eth0上传速率:" . $result . " MB/s"; ?>
方法二:改写命令,去掉Bash专属语法
如果不想依赖Bash,也可以把命令改成sh兼容的写法,用管道+连续命令来替代进程替换:
<?php $command = '(grep eth0 /proc/net/dev && sleep 1 && grep eth0 /proc/net/dev) | awk \'{if(l1){print ($10-l2)/1024/1024} else{l1=$2; l2=$10;}}\''; $result = shell_exec($command); echo "eth0上传速率:" . $result . " MB/s"; ?>
这个写法的逻辑是先获取一次网卡数据,等待1秒后再获取一次,把两次结果通过管道传给awk处理,完全不需要进程替换,sh也能正常执行。
两种方法都可以解决问题,你可以根据自己的环境选择。如果执行后还是有问题,可以用var_dump($result)看看具体的输出或错误信息。
内容的提问来源于stack exchange,提问作者New Dude
相关产品推荐
相关产品推荐

