Как использовать команду «dns-sd» в php shell_exec?

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

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

https://prnt.sc/n6fe9e

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

Ваш комментарий о том, что вы не прекратили, как раз по этой причине. Вы также никогда не упоминали, что на самом деле происходит, когда вы запускаете свой php-скрипт (я полагаю, он зависает?)

JensV 02.04.2019 16:25

Да, извините, скрипт просто зависает, и я не отвечаю. Знаете ли вы, как я могу заставить его прекратить?

Jake6192 02.04.2019 16:27

Вы ожидаете, что команда завершится сама по себе?

JensV 02.04.2019 16:31

Возможно, это может помочь: stackoverflow.com/a/6144213/2232127

JensV 02.04.2019 16:35

Да, я бы хотел - мне нужно получить от него результаты. Является ли это методом, который я могу вызвать «x секунд» после выполнения, чтобы завершить и вернуть результат. Или, может быть, я могу сделать что-то еще?

Jake6192 02.04.2019 16:35

Со связанным ответом в сочетании с proc_close вы сможете выполнить это

JensV 02.04.2019 16:36

Нет, я пробовал это - скрипт все еще висит на вызове proc_open

Jake6192 02.04.2019 16:39

Вы уверены, что мой локальный тест вообще не блокируется при вызове proc_open?

JensV 02.04.2019 16:43

Да, я уверен. Вы тестируете с помощью команды dns-sd? У меня есть ощущение, что он может вести себя немного иначе, чем более типичные.

Jake6192 02.04.2019 16:46

Возможно, stackoverflow.com/a/7149229/2232127 поможет вам понять это немного лучше.

JensV 02.04.2019 17:02

Отлично, удалось заставить все работать с этим. Благодарим за помощь @JensV

Jake6192 02.04.2019 17:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
11
202
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме