我正在尝试编写一个php脚本,它可以扫描网络中的任何mDNS记录,并返回结果。
'dns-sd -B _roomcast-capi._tcp'我正在OSx上工作-据我所知,如果没有安装额外的SW,这个命令就不能在windows上工作。
问题是这个unix命令不适用于shell_exec或任何类似的东西。PHP只是挂起,我只能等待一个不存在的响应。
我尝试通过shell_exec()、exec()、system()、proc_open()和passthru()运行这个命令--不知道它们的不同之处,但它们都有相同的结果。我也尝试过重定向STDERR输出,这似乎没有什么区别。
我的一次尝试..。
$p = shell_exec("dns-sd -B _roomcast-capi._tcp 2>&1");
echo($p);又一次尝试..。
$descspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file", "error-output.txt", "a")
);
$process = proc_open('dns-sd -B _roomcast-capi._tcp', $descspec, $pipes);
foreach($pipes as $pipe) {
var_dump($pipe);
// echo "$process<br />";
}我可以在这里列出我的其他尝试,但如果我诚实的话,它们可能都是错误的。PHP不是我最擅长的领域。
您可以在这里看到,当我在终端中运行命令时,我几乎可以立即得到响应。
我注意到,当我在mac上的终端上运行这个命令时,我必须用Ctrl+C终止响应--这是否是shell_exec不终止的原因呢?
发布于 2019-04-02 16:00:05
我成功地完成了这个任务,感谢@JensV为我提供了这个答案-- https://stackoverflow.com/a/7149229/4357255
<?php
$proc = proc_open('dns-sd -B _roomcast-capi._tcp', array(array('pipe', 'r'), array('pipe', 'w'), array('pipe', 'w')), $pipes);
echo fread($pipes[1], 999999);
$proc_status=proc_get_status($proc);
$pid=trim(exec('ps h -o pid --ppid '.$proc_status['pid']));
exec('kill -s 9 '.$proc_status['pid']);
exec('gdb -p '.$pid.' --batch -x /usr/share/gdb_null_descr');
array_map('fclose',$pipes);
proc_close($proc);
?>https://stackoverflow.com/questions/55476510
复制相似问题