Как мне экранировать PHP-скрипт во внешний редактор и вернуться после этого?
-
02-07-2019 - |
Вопрос
В частности, у меня есть скрипт командной строки PHP, который в определенный момент требует ввода от пользователя.Я хотел бы иметь возможность запустить внешний редактор (например, vi) и дождаться завершения выполнения редактора, прежде чем возобновить работу скрипта.
Моя основная идея состояла в том, чтобы использовать временный файл для редактирования, а затем извлечь содержимое файла.Что-то вроде:
$filename = '/tmp/script_' . time() . '.tmp';
get_user_input ($filename);
$input = file_get_contents ($filename);
unlink ($filename);
Я подозреваю, что это невозможно из скрипта командной строки PHP, однако я надеюсь, что есть какой-то трюк с написанием сценариев оболочки, который можно использовать для достижения того же эффекта.
Предложения о том, как этого можно достичь на других языках сценариев, также более чем приветствуются.
Решение
Вы можете перенаправить выходные данные редактора на терминал:
system("vim > `tty`");
Другие советы
Я только что попробовал это, и оно отлично работает в Windows, так что вы, вероятно, можете выполнить репликацию с помощью vi или любого другого приложения, которое захотите, в Linux.
Ключ в том, что exec()
зависает php-процесс во время работы notepad (в данном случае).
<?php
exec('notepad c:\test');
echo file_get_contents('c:\test');
?>
$ php -r test.php
Редактировать:Как показывает ваша попытка и указал bstark, мой тест notepad запускает новое окно, так что все в порядке, но любой редактор, работающий в консольном режиме, терпит неудачу, потому что у него нет терминала для подключения.
Тем не менее, я попробовал установить Linux-бокс с exec('nano test'); echo file_get_contents('test');
и он не выходит из строя так сильно, как vi, он просто запускается, ничего не отображая.Я мог бы ввести что-нибудь, нажать "ctrl-X, y", чтобы закрыть и сохранить файл, а затем php-скрипт продолжил работу и отобразил то, что я написал.В любом случае..Я нашел правильное решение, так что приходит новый ответ.
Я не знаю, возможно ли вообще подключить vi к терминалу, на котором запущен php, но быстрое и простое решение - не использовать экранный редактор на том же терминале.
Вы можете либо использовать редактор строк, такой как ed (вероятно, вам это не нужно), либо открыть новое окно, например system ("xterm -e vi") (замените xterm названием вашего приложения терминала).
Отредактировано для добавления:В perl system ("vi") просто работает, потому что perl не выполняет такую причудливую конвейеризацию / буферизацию, как php.
Так что, похоже, ваша идея написать файл привела нас к тому, что мы стали пробовать безумные вещи, пока есть простое решение :)
<?php
$out = fopen('php://stdout', 'w+');
$in = fopen('php://stdin', 'r+');
fwrite($out, "foo?\n");
$var = fread($in, 1024);
echo strtoupper($var);
Вызов fread() приведет к зависанию php-процесса до тех пор, пока он не получит что-либо (я думаю, 1024 байта или конец строки), производя это :
$ php test.php
foo?
bar <= my input
BAR
system('vi');