Подтвердить что ты не робот

Как получить консоль Linux $COLUMNS и $ROWS из PHP cli?

В настоящее время я создаю новую опрятную библиотеку 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];
      }
    }
4b9b3361

Ответ 1

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

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

Ответ 2

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

ncurses_getmaxyx (STDSCR, $Height, $Width)

РАНЕЕ:

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

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

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

Ответ 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);

Ответ 4

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

Ответ 5

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

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

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

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

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

Ответ 6

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

echo $_ENV['ROWS'];

например.