Я пытаюсь написать 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 не завершается?
Да, извините, скрипт просто зависает, и я не отвечаю. Знаете ли вы, как я могу заставить его прекратить?
Вы ожидаете, что команда завершится сама по себе?
Возможно, это может помочь: stackoverflow.com/a/6144213/2232127
Да, я бы хотел - мне нужно получить от него результаты. Является ли это методом, который я могу вызвать «x секунд» после выполнения, чтобы завершить и вернуть результат. Или, может быть, я могу сделать что-то еще?
Со связанным ответом в сочетании с proc_close вы сможете выполнить это
Нет, я пробовал это - скрипт все еще висит на вызове proc_open
Вы уверены, что мой локальный тест вообще не блокируется при вызове proc_open?
Да, я уверен. Вы тестируете с помощью команды dns-sd? У меня есть ощущение, что он может вести себя немного иначе, чем более типичные.
Возможно, stackoverflow.com/a/7149229/2232127 поможет вам понять это немного лучше.
Отлично, удалось заставить все работать с этим. Благодарим за помощь @JensV






Мне удалось заставить это работать, спасибо @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);
?>
Ваш комментарий о том, что вы не прекратили, как раз по этой причине. Вы также никогда не упоминали, что на самом деле происходит, когда вы запускаете свой php-скрипт (я полагаю, он зависает?)