Как мне использовать команду 'dns-sd' в php shell_exec? - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь написать сценарий 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 не моя самая сильная область.

Вы можете увидеть здесь, когда я запускаю команду в терминале, яможет получить ответ почти сразуely.

https://prnt.sc/n6fe9e

Я заметил, что когда я запускаю эту команду в терминале на моем Mac, мне приходится завершать ответ Ctrl + C - это может быть причиной для shell_execне заканчивается?

1 Ответ

0 голосов
/ 02 апреля 2019

Мне удалось заставить это работать, спасибо @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);
?>
...