如何在 php shell_exec 中使用 'dns-sd' 命令?

How do I use the 'dns-sd' command in a php shell_exec?

我正在尝试编写一个 php 脚本,它可以扫描网络以查找任何 mDNS 记录,并 return 结果。

'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 不是我最擅长的领域。

当我在终端中运行命令时,你可以看到这里,我几乎可以立即得到响应。

https://prnt.sc/n6fe9e

我注意到,当我在 mac 的终端中 运行 此命令时,我必须使用 Ctrl+C 终止响应 - 这可能是 shell_exec 的原因没有终止?

感谢@JensV 为我指出了这个答案,我设法让它工作了 -

<?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);
?>