我想less
从 PHP 的命令行执行和类似的程序。
我已经尝试过通常的嫌疑人(exec、shell_exec、passthru 等),虽然他们中的许多人可以将文件转储到屏幕上,但在我可以使用它之前进程就被终止了。如果我cat
愿意,我会使用它。
如何以这种方式执行程序?
我想less
从 PHP 的命令行执行和类似的程序。
我已经尝试过通常的嫌疑人(exec、shell_exec、passthru 等),虽然他们中的许多人可以将文件转储到屏幕上,但在我可以使用它之前进程就被终止了。如果我cat
愿意,我会使用它。
如何以这种方式执行程序?
您可以使用proc_open
通过管道向进程提供输入并从进程中获取输出。但是,它似乎并没有允许通过管道进行用户交互,因为它基本上降级为cat
命令。这是我的第一个(失败的)方法:
<?php
$dspec = array(
0 = array('pipe', 'r'), // pipe to child process's stdin
1 = array('pipe', 'w'), // pipe from child process's stdout
2 = array('file', 'error_log', 'a'), // stderr dumped to file
);
// run the external command
$proc = proc_open('less name_of_file_here', $dspec, $pipes, null, null);
if (is_resource($proc)) {
while (($cmd = readline('')) != 'q') {
// if the external command expects input, it will get it from us here
fwrite($pipes[0], $cmd);
fflush($pipes[0]);
// we can get the response from the external command here
echo fread($pipes[1], 1024);
}
fclose($pipes[0]);
fclose($pipes[1]);
echo proc_close($proc);
我猜对于某些命令,这种方法实际上可能有效 - php 联机帮助页中有一些示例proc_open
可能有助于查看 - 但是对于less
,你得到整个文件并且没有交互的可能性,可能是由于 Viper_Sb 提到的原因回答。
less
...但如果这就是你所需要的,它似乎很容易模拟。例如,您可以将命令的输出读入一个行数组并以小块的形式提供:
<?php
$pid = popen('cat name_of_file_here', 'r');
$buf = array();
while ($s = fgets($pid, 1024))
$buf[] = $s;
pclose($pid);
for ($i = 0; $i < count($buf)/25 && readline('more') != 'q'; $i++) {
for ($j = 0; $j < 25; $j++) {
echo array_shift($buf);
}
}
我不相信这是可能的。PHP 不是 VM/shell 环境,它必须访问其他程序的命令都将控制权返回给它,并且通常在 PHP 运行时没有交互。
最后一件事,尝试使用反引号运算符,如果这不起作用,那么我很确定如果不自己编写一些会休眠并允许用户输入等的东西,你就无法做到这一点......默认情况下没有
`nano file.txt`
添加 exec('stty cbreak'); 到 PHP 脚本也解决了这个问题。
我将以下内容放在由 php.ini 中的 auto_prepend_file 设置定义的文件中
所以,我会做类似编辑 php.ini 到以下内容:
auto_prepend_file = /path/to/prepend.php
然后在 /path/to/prepend.php 中,我将添加以下行:
if (php_sapi_name() == 'cli') exec('stty cbreak');
我不确定原因。我已经阅读了 PHP 的错误报告。我不确定版本。我注意到以下设置的问题:
$ php -v
PHP 5.3.3 (cli) (built: Jul 12 2013 20:35:47)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
但是,以下内容并未显示该问题:
# php -v
PHP 5.3.26 (cli) (built: Oct 21 2013 16:50:03)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies
with the ionCube PHP Loader v4.4.1, Copyright (c) 2002-2013, by ionCube Ltd.
值得注意的是,没有问题的版本使用的是 cPanel,而另一个版本使用的是通过 yum 安装的默认 CentOS 6。