Как мне экранировать PHP-скрипт во внешний редактор и вернуться после этого?

StackOverflow https://stackoverflow.com/questions/126005

Вопрос

В частности, у меня есть скрипт командной строки 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top