如何从PHPCLI获取linux控制台$COLUMNS和$ROWS?
我目前正在为PHP创建一个新的neat CLI库,我想计算一下它所运行的控制台的宽度/高度如何从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
我尝试了很多方法,比如挖掘$_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');