【发布时间】:2015-12-08 20:52:33
【问题描述】:
我正在使用 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 使用 $websocket->sendToAll($message); 发送数据。
我不能一个接一个地放置 while 循环,因为它只会运行我首先放置的循环,
while (true) { A() }; while (true) { B() };B() 永远不会被调用我无法合并 while 循环,因为 websocket 会减慢 popen 的读取速度,反之亦然。
while (true) { A(); B(); }如果 B 需要很长时间才能完成,A 会运行缓慢。
在这种情况下我该怎么办?我对线程、分叉脚本之间的通信或其他任何东西持开放态度。
【问题讨论】:
-
不酷,让我的浏览器崩溃,让资源管理器发疯,发出警告>。
-
@IndigoIdentity 添加。我的问题只关注cli,这里不涉及浏览器。 (除了用websockets查看,这里省略了代码)
-
好吧,这部分是我自己的错,因为我之前通过套接字 ping IP 并输出到浏览器中,所以我已经根深蒂固了这种想法。现在想想,PHP 中的异步套接字连接会很棒。好问题!