代码之家  ›  专栏  ›  技术社区  ›  Grayside

使用滚动从命令行PHP执行“less”

  •  3
  • Grayside  · 技术社区  · 14 年前

    我想执行 less 以及类似的PHP命令行程序。

    我试过常见的疑犯(exec、shell\u exec、passthru等),虽然他们中的许多人可以将文件转储到屏幕上,但在我可以使用它之前,进程就被终止了。如果我想的话 cat

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

    3 回复  |  直到 4 年前
        1
  •  2
  •   atsui    14 年前

    你可以用 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);
    

    过程打开 仔细看看也许会有帮助,但是 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);
      }
    }
    
        2
  •  0
  •   Viper_Sb    14 年前

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

    `nano file.txt`
    
        3
  •  0
  •   Matthew Kolb    11 年前

    添加exec('stty cbreak');对PHP脚本的修改也解决了这个问题。

    所以,我会做一些类似编辑的事情php.ini 以下内容:

    auto_prepend_file = /path/to/prepend.php
    

    然后在,/path/to中/prepend.php,我将添加以下行:

    if (php_sapi_name() == 'cli') exec('stty cbreak');
    

    我不太清楚原因。我读过PHP的bug报告。不过,我不确定版本。我注意到以下设置存在问题:

    $ 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安装的。