Как получить консоль Linux COLUMNS и $ ROWS из PHP cli? - PullRequest
21 голосов
/ 05 февраля 2010

В настоящее время я создаю новую аккуратную библиотеку CLI для PHP, и я хотел бы выяснить ширину / высоту консоли, в которой она работает.

Я пробовал много вещей, таких как копание в $ _ENV, exec ("echo $ COLUMNS") и т. Д., Но безрезультатно, хотя, если я введу echo $ COLUMNS или $ ROWS в командной строке bash, он аккуратно отобразит значение.

Что мне нужно сделать, чтобы получить доступ к этому значению из 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 ]

46 голосов
/ 05 февраля 2010

Другой вариант оболочки, который не требует анализа, - tput:

$this->settings['screen']['width'] = exec('tput cols')
$this->settings['screen']['height'] = exec('tput lines')
5 голосов
/ 05 февраля 2010

Используйте функцию PHP ncurses_getmaxyx.

ncurses_getmaxyx (STDSCR, $Height, $Width)

РАНЕЕ:

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

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

"Правильный" способ - это, вероятно, вызвать ioctl TIOCGSIZE, чтобы получить представление ядра о размере окна, или вызвать команду stty -a и проанализировать результаты для rows и columns

3 голосов
/ 05 февраля 2010

$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);
1 голос
/ 05 февраля 2010

Может быть, эта ссылка может быть ответом, для этого можно использовать коды Escape ANSI, используя echo, используя специальную последовательность кодов Escape, в частности «устройство запроса», которое Я нашел другую ссылку здесь , которая объясняет подробно. Возможно, использование этого позволит вам получить столбцы и строки экрана ...

0 голосов
/ 17 мая 2019

Я не знаю, зачем нужно grep для анализа stty выходных данных: у него есть отдельная опция для сообщения "количества строк и столбцов в соответствии с ядром".

Однострочник, без обработки ошибок:

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

Однострочный, в случае проблем предположить, что обе строки / столбцы равны 0, и исключить любую ошибку:

list($rows, $cols) = explode(' ', @exec('stty size 2>/dev/null') ?: '0 0');
0 голосов
/ 05 февраля 2010

Переменные окружения можно найти в суперглобальной переменной $ _ENV.

echo $_ENV['ROWS'];

например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...