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

如何从PHPCLI获取linux控制台$COLUMNS和$ROWS?,php,linux,bash,command-line,command-line-interface,Php,Linux,Bash,Command Line,Command Line Interface,我目前正在为PHP创建一个新的neat CLI库,我想计算一下它所运行的控制台的宽度/高度 我尝试了很多方法,比如挖掘$_ENV、exec(“echo$COLUMNS”)等,但没有结果,而如果我在bash命令行中键入echo$COLUMNS或$ROWS,它会整齐地显示值 我需要做什么才能从PHP访问该值 我使用的.sh脚本如下: #!/usr/bin/php -q <?php require_once('lib.commandline.php'); class HelloWorld

我目前正在为PHP创建一个新的neat 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.');

    }

}
使用PHP函数

ncurses_getmaxyx (STDSCR, $Height, $Width)
之前:


“正确”的方法可能是调用
TIOCGSIZE
ioctl来获得内核对窗口大小的想法,或者调用命令
stty-a
并解析
行和
列的结果

也许这就是答案,您可以使用ANSI转义代码来实现这一点,通过使用
echo
使用特定的转义码序列,特别是“查询设备”,我找到了另一个详细解释的链接。也许使用它可以获得屏幕的列和行…

环境变量可以在$\u ENV super全局变量中找到

echo $_ENV['ROWS'];

例如,

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

$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);

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

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

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

一行,无错误处理:

list($rows, $cols) = explode(' ', exec('stty size'));
一行,假设出现问题时两行/列均为0,并抑制任何错误输出:

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

我只想说,Mac OS X上的Terminal.app中没有设置列和行。我也遇到过这些不一致的问题(例如,它们在irb中工作,但在执行ruby脚本和c时不工作)。如果在程序运行时调整终端的大小,环境变量也不会更新。Getenv确实不工作,$_ENV也没有,但感谢对stty-a的提示,我将解析:)我喜欢我当前解决方案的可移植性:)不是所有的框都有PHP的ncurses,所以我希望它尽可能简单,即使你是这个问题的获胜者,而且你的首要建议是当前的“实验”函数(它们的所有大写字母,而不是我的)请您花点时间在这里综合各种方法,并给出实际的正确答案。特别是因为您提到ioctl方法是首选方法(没有说明为什么它是最好的),但实际上并没有说明如何做到这一点。自我提醒:与其抱怨,不如等六个月,写出一个真正好的答案。记住要感谢乔写了一个答案,而不仅仅是顺从…太好了。当我在挖掘如何从
stty
获取信息时,我完全忘记了
tput
。超级!非常有用且温和地提醒您这个解决方案是多么优雅。如果您安装Git for Windows,这个解决方案甚至可以在Windows上运行。另一种方法是解析
模式con/status
。注意:tput返回的值在调整窗口大小后不会更新,但stty将“我尝试了很多事情,比如挖掘$\u ENV,exec(“echo$COLUMNS”)等,但没有结果”,海报上提到。所以。。我知道已经快10年了,但你还拥有CLI库吗?Github?:-)
list($rows, $cols) = explode(' ', exec('stty size'));
list($rows, $cols) = explode(' ', @exec('stty size 2>/dev/null') ?: '0 0');