Ответ 1
Другим вариантом оболочки, который не требует синтаксического анализа, является tput
:
$this->settings['screen']['width'] = exec('tput cols')
$this->settings['screen']['height'] = exec('tput lines')
В настоящее время я создаю новую опрятную библиотеку 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];
}
}
Другим вариантом оболочки, который не требует синтаксического анализа, является tput
:
$this->settings['screen']['width'] = exec('tput cols')
$this->settings['screen']['height'] = exec('tput lines')
Используйте функцию 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
$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);
Возможно, эта ссылка может быть ответом, вы можете использовать коды ANSI Escape для этого, используя echo
, используя конкретную последовательность кода Escape, в частности "Query Device" , в которой я нашел еще одну ссылку здесь, которая подробно объясняет. Возможно, использование этого может позволить вам получить столбцы и строки экрана...
Я не знаю, почему когда-либо нужен grep
для разбора вывода stty
: у него есть отдельная опция для сообщения "количества строк и столбцов в соответствии с ядром".
Одна строка, без обработки ошибок:
list($rows, $cols) = explode(' ', exec('stty size'));
Одна строка, примите обе строки/столбцы равными 0 в случае проблем и исключите любую ошибку:
list($rows, $cols) = explode(' ', @exec('stty size 2>/dev/null') ?: '0 0');
Переменные окружения можно найти в супер глобальной переменной $_ENV.
echo $_ENV['ROWS'];
например.