4

我想less从 PHP 的命令行执行和类似的程序。

我已经尝试过通常的嫌疑人(exec、shell_exec、passthru 等),虽然他们中的许多人可以将文件转储到屏幕上,但在我可以使用它之前进程就被终止了。如果我cat愿意,我会使用它。

如何以这种方式执行程序?

4

3 回答 3

3

您可以使用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);
  }
}
于 2010-08-13T20:34:00.107 回答
0

我不相信这是可能的。PHP 不是 VM/shell 环境,它必须访问其他程序的命令都将控制权返回给它,并且通常在 PHP 运行时没有交互。

最后一件事,尝试使用反引号运算符,如果这不起作用,那么我很确定如果不自己编写一些会休眠并允许用户输入等的东西,你就无法做到这一点......默认情况下没有

`nano file.txt`
于 2010-08-13T19:08:44.543 回答
0

添加 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。

于 2013-12-03T01:55:59.290 回答