如何将PHP脚本转义给外部编辑器,然后返回?

时间:2020-03-06 14:38:56  来源:igfitidea点击:

具体来说,我有一个PHP命令行脚本,在某些时候需要用户输入。我希望能够执行外部编辑器(例如vi),并等待编辑器完成执行,然后再继续执行脚本。

我的基本想法是使用一个临时文件进行编辑,然后再检索该文件的内容。类似于以下内容:

$filename = '/tmp/script_' . time() . '.tmp';

get_user_input ($filename);

$input = file_get_contents ($filename);
unlink ($filename);

我怀疑这从PHP命令行脚本中是不可能的,但是我希望可以使用某种Shell脚本技巧来达到相同的效果。

我们也非常欢迎提出关于如何使用其他脚本语言实现此目标的建议。

解决方案

system('vi');

http://www.php.net/system

我刚刚尝试过,它在Windows中运行良好,因此我们可以在Linux上使用vi或者任何我们想要的应用程序进行复制。

关键是exec()在记事本(在本例中)运行时会挂起php进程。

<?php

exec('notepad c:\test'); 
echo file_get_contents('c:\test');

?>

$ php -r test.php

编辑:正如尝试显示和bstark指出的那样,我的记事本测试会打开一个新窗口,因此一切正常,但是在控制台模式下运行的任何编辑器都会失败,因为它没有要连接的终端。

话虽这么说,但是我在带有exec('nano test');的Linux机器上进行了尝试; 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("vim > `tty`");