將之前的$worker->process_handle = popen('vmstat 1', 'r');換成$worker->process_handle = popen('top -b -d 1 | grep -E "^(%Cpu)"', 'r');就無法發(fā)送數(shù)據了,請問有什么區(qū)別嗎?
正則寫錯了吧,你要提取什么信息?
看上去好像是要: top -b -d 1 | grep -E "^(Cpu)"
如果是這樣的話,這樣寫更簡潔:?top -b -d 1 | egrep -i "^(cpu)"
我那樣寫也沒問題,現(xiàn)在的問題是如果直接在linux終端輸入這個命令,就是每秒打印一次。但是在php里運行,很長時間不返回數(shù)據,返回數(shù)據的時候一次性返回很多行需要的數(shù)據。
不用top了,換成sar了,top不像vmstat一樣,中斷方式去執(zhí)行的,所以不會每在終端打印一次數(shù)據就給worker發(fā)送一次數(shù)據
@wo642436249: strace跟蹤了下,確實如你描述那樣,查閱相關資料,分析應該是 | 管道的問題,管道有個內核緩沖區(qū)PIPE_BUF【默認最大4096字節(jié)】,fread阻塞直至popen打滿管道緩沖區(qū),所以結果表現(xiàn)為一次性返回很多行數(shù)據,理解不一定正確,僅供參考。