将之前的$worker->process_handle = popen('vmstat 1', 'r');换成$worker->process_handle = popen('top -b -d 1 | grep -E "^(%Cpu)"', 'r');就无法发送数据了,请问有什么区别吗?
正则写错了吧,你要提取什么信息? 看上去好像是要: top -b -d 1 | grep -E "^(Cpu)" 如果是这样的话,这样写更简洁: top -b -d 1 | egrep -i "^(cpu)"
我那样写也没问题,现在的问题是如果直接在linux终端输入这个命令,就是每秒打印一次。但是在php里运行,很长时间不返回数据,返回数据的时候一次性返回很多行需要的数据。
不用top了,换成sar了,top不像vmstat一样,中断方式去执行的,所以不会每在终端打印一次数据就给worker发送一次数据
@wo642436249: strace跟踪了下,确实如你描述那样,查阅相关资料,分析应该是 | 管道的问题,管道有个内核缓冲区PIPE_BUF【默认最大4096字节】,fread阻塞直至popen打满管道缓冲区,所以结果表现为一次性返回很多行数据,理解不一定正确,仅供参考。
很棒,这样的话我只能不用top命令了
正则写错了吧,你要提取什么信息?
看上去好像是要: top -b -d 1 | grep -E "^(Cpu)"
如果是这样的话,这样写更简洁: top -b -d 1 | egrep -i "^(cpu)"
我那样写也没问题,现在的问题是如果直接在linux终端输入这个命令,就是每秒打印一次。但是在php里运行,很长时间不返回数据,返回数据的时候一次性返回很多行需要的数据。
不用top了,换成sar了,top不像vmstat一样,中断方式去执行的,所以不会每在终端打印一次数据就给worker发送一次数据
@wo642436249: strace跟踪了下,确实如你描述那样,查阅相关资料,分析应该是 | 管道的问题,管道有个内核缓冲区PIPE_BUF【默认最大4096字节】,fread阻塞直至popen打满管道缓冲区,所以结果表现为一次性返回很多行数据,理解不一定正确,仅供参考。
很棒,这样的话我只能不用top命令了