我正在尝试编写一个php脚本,该脚本可以扫描网络中的任何mDNS记录,并返回结果。
'dns-sd -B _roomcast-capi._tcp'
我正在OSx上工作-据我了解,如果不安装额外的软件,此命令将无法在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无法终止的原因吗?
答案 0 :(得分:0)
由于@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);
?>