26

我目前正在为 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];
      }
    }
4

7 回答 7

52

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

$this->settings['screen']['width'] = exec('tput cols')
$this->settings['screen']['height'] = exec('tput lines')
于 2010-02-05T00:12:17.663 回答
6

使用 PHPncurses_getmaxyx函数。

ncurses_getmaxyx (STDSCR, $Height, $Width)

之前:

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

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

“正确”的方法可能是调用TIOCGSIZEioctl 来获取内核对窗口大小的想法,或者调用命令并stty -a解析结果rowscolumns

于 2010-02-04T21:45:44.477 回答
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);
于 2010-02-04T21:59:12.557 回答
2

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

单行,无错误处理:

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

单行,假设两个行/列都为 0,以防出现问题并抑制任何错误输出:

list($rows, $cols) = explode(' ', @exec('stty size 2>/dev/null') ?: '0 0');
于 2019-05-17T10:37:28.050 回答
1

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

于 2010-02-04T21:46:55.050 回答
0

作为记录,这是我的功能(PHP 7.2 及更高版本):

它适用于 Windows 和 Linux。如果出现错误,则返回 80。

在一些古怪或太小的值的情况下,它返回最小值(80)

ps:“mode con”确实返回了行数,但它基于缓冲区而不是屏幕大小。

ps2:奇怪的是,如果我将它作为网站运行,它会返回 120(Windows 主机)。

   function calculateColSize($min=80) {
       try {
            if (PHP_OS_FAMILY === 'Windows') {
                $a1 = shell_exec('mode con');
                /*
                 * Estado para dispositivo CON:
                 * ----------------------------
                 * Líneas:              9001
                 * Columnas:            85
                 * Ritmo del teclado:   31
                 * Retardo del teclado: 1
                 * Página de códigos:    65001
                 */
                $arr = explode("\n", $a1);
                $col = trim(explode(':', $arr[4])[1]);

            } else {
                $col = exec('tput cols');
                /*
                 * 184
                 */
            }
        } catch (Exception $ex) {
            $col = 80;
        }
    }
于 2022-02-11T14:25:50.100 回答
-2

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

echo $_ENV['ROWS'];

例如。

于 2010-02-04T21:48:55.000 回答