如何从PHP cli获取linux控制台$ COLUMNS和$ ROWS?

时间:2010-02-04 21:39:09

标签: php linux bash command-line command-line-interface

我正在为PHP创建一个新的整洁的CLI库,我想弄清楚它正在运行的控制台的宽度/高度。

我尝试了很多东西,比如挖掘$ _ENV,exec(“echo $ COLUMNS”)等,但没有结果,而如果我在bash命令行中输入echo $ COLUMNS或$ ROWS,它会整齐地显示该值。

从PHP访问此值需要做什么?

我正在使用这样的.sh脚本:

#!/usr/bin/php -q
<?php

require_once('lib.commandline.php');


class HelloWorld extends CommandLineApp {

  public function main($args) {

       echo('O, Hai.');

    }

}

更新 最终解决方案:

public function getScreenSize() { 
      preg_match_all("/rows.([0-9]+);.columns.([0-9]+);/", strtolower(exec('stty -a |grep columns')), $output);
      if(sizeof($output) == 3) {
        $this->settings['screen']['width'] = $output[1][0];
        $this->settings['screen']['height'] = $output[2][0];
      }
    }

6 个答案:

答案 0 :(得分:45)

另一个不需要解析的shell选项是tput

$this->settings['screen']['width'] = exec('tput cols')
$this->settings['screen']['height'] = exec('tput lines')

答案 1 :(得分:5)

使用PHP ncurses_getmaxyx函数。

ncurses_getmaxyx (STDSCR, $Height, $Width)

<强> PREVIOUSLY:

http://php.net/manual/en/function.getenv.php

$cols = getenv('COLUMNS');
$rows = getenv('ROWS');

“正确”方式可能是调用TIOCGSIZE ioctl以获取内核对窗口大小的想法,或者调用命令stty -a并解析rows和{columns的结果{1}}

答案 2 :(得分:3)

$COLUMNS$LINES可能未导出到您的计划中。您可以在运行应用程序之前运行export LINES COLUMNS,也可以直接获取此信息:

$fp=popen("resize", "r");
$b=stream_get_contents($fp);
preg_match("/COLUMNS=([0-9]+)/", $b, $matches);$columns = $matches[1];
preg_match("/LINES=([0-9]+)/", $b, $matches);$rows = $matches[1];
pclose($fp);

答案 3 :(得分:1)

也许这个link可能就是答案,您可以使用ANSI转义代码来执行此操作,方法是使用echo使用特定的转义码序列,特别是“查询设备”,我找到了另一个详细解释的链接here。也许使用它可能使您获得屏幕的列和行...

答案 4 :(得分:0)

我不知道,为什么一个人永远需要grep来解析stty的输出:它确实有一个单独的选项来报告“根据内核的行数和列数”。

单线,无错误处理:

list($rows, $cols) = explode(' ', exec('stty size'));

单线,在出现问题的情况下假设两行/列均为0,并抑制任何错误输出:

list($rows, $cols) = explode(' ', @exec('stty size 2>/dev/null') ?: '0 0');

答案 5 :(得分:-2)

环境变量可以在$ _ENV超级全局变量中找到。

echo $_ENV['ROWS'];
例如