将输入注入连接到标准输入的过程(交互式控制台)

时间:2013-03-28 09:44:23

标签: php command-line-interface stdin

我们有一个执行PHP交互式shell的工具,如下所示:

$descriptorSpec = array(
    0 => STDIN,
    1 => STDOUT,
    2 => STDERR
);

$prependFile = __DIR__ . '/../../../../../res/dev/console_auto_prepend.php';
$exec = 'php -a -d auto_prepend_file=' . escapeshellarg($prependFile);

$pipes = array();
proc_open($exec, $descriptorSpec, $pipes);

不幸的是,使用auto_prepend_file的技巧会导致PHP 5.3上的自动加载问题。我们发现,当我们在交互式shell中包含文件时,每个工作都很有效:

$ php -a
Interactive shell

php > include "myproject/res/dev/console_auto_prepend.php";
Autoloader initialized.

我们想要做的是:

  • 通过proc_open
  • 执行php interactive shell
  • 将包含行发送到交互式shell
  • 将controll移交给用户输入

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

未经考验的想法:

  • 创建了一个新的输入管道
  • 使用该输入管道打开PHP进程(php -a),stdout和stderr可以连接到系统管道
  • 注入include命令(写入输入管道)
  • 在从STDIN读取的循环中写入我们的新输入管道(连接到php -a

答案 1 :(得分:0)

该项目最终使用了自定义PHP shell(psysh