#php #linux #loops #server #command
#php #linux #циклы #сервер #команда
Вопрос:
Фон:
Я нахожусь в положении, когда я помещаю данные в командную строку, и мне нужен цикл php (который станет своего рода сервером), чтобы читать STDIN и просто передавать то, что он считывает, в оболочку, в которой он запущен.
Следующий ужасный код работает, когда процесс выполняется в той же оболочке, что и отображаемое содержимое:
<?php
echo getmypid();
$string = "/proc/" . getmypid() . "/fd/0";
while (true) {
fwrite(STDOUT, fgets(fopen($string, 'r'), 4096) . " workedn");
}
?>
Я перепробовал много вариантов:
<?php
echo getmypid();
$string = "/proc/" . getmypid() . "/fd/0";
while (true) {
$fo = fread(STDIN, 1024);
fwrite(STDOUT, $fo);
}
?>
Проблема в том, что всякий раз, когда я записываю в этот цикл с отдельного терминала, выходные данные отображаются в другом терминале, но цикл не обрабатывается.
Когда я ввожу текст в том же терминале, текст повторяется обратно.
Мне нужен способ получить данные командной строки в этот цикл из любого источника.
Комментарии:
1. Как вы записываете в него с отдельного терминала?
2. Зачем вам нужно делать это на PHP? Стандартная
cat
команда считывает данные со своего стандартного ввода и записывает в стандартный вывод.3. Бармар! Рад видеть вас снова. Из отдельного окна:
echo foo > /proc/{pid}/fd/0
. Конечно же, вывод появляется.4. Этот цикл PHP в конечном итоге станет сервером, который прослушивает порт и записывает в сокеты a la websockets для push-уведомления. У меня отдельный процесс выдает его вывод в командную строку. Таким образом, я хотел бы, чтобы этот другой процесс подключался к моему циклу php.
5. Запись в этот FD не вводит входные данные в терминал. FD 0 подключен к терминалу этого окна, поэтому вы записываете выходные данные на терминал.