我正在使用popen和fgets异步读取tcpdump的输出。
以下代码应该在命令行中运行,而不是在apache中并在浏览器中查看它。
$handle = popen('tcpdump -nnX', 'r');
while (true) {
$output = fgets($handle);
print $output . "\n";
}
当我尝试通过websockets输出这些信息时问题就出现了。
Websockets也使用无限循环(用于管理其套接字、时钟和消息)。
它看起来像:
while (true) {
@socket_select($read,$write,$except,1);
foreach ($read as $socket) {
if ($socket == $this->master) {
$client = socket_accept($socket);
...
我使用 $websocket->sendToAll($message); 通过 websocket 发送数据。
我不能把 while 循环放在一起,因为只会运行我先放置的循环,
while (true) { A() }; while (true) { B() };
B() 永远不会被调用。我也不能合并 while 循环,因为 websocket 会减慢 popen 的读取速度,反之亦然。
while (true) { A(); B(); }
如果B花费了很长时间才能完成,A将变得缓慢。
在这种情况下,我该怎么办?我可以尝试线程、分支脚本间的通信或其他任何方法。