Как определить разрешение / размеры экрана в tty? [Дубликат]

Ваш код разбит на две полностью отдельные части, серверную сторону и клиентскую сторону .

                    |
               ---------->
              HTTP request
                    |
+--------------+    |    +--------------+
|              |    |    |              |
|    browser   |    |    |  web  server |
| (JavaScript) |    |    |  (PHP etc.)  |
|              |    |    |              |
+--------------+    |    +--------------+
                    |
  client side       |      server side
                    |
               <----------
          HTML, CSS, JavaScript
                    |

Обе стороны общаются через HTTP-запросы и ответы. PHP выполняется на сервере и выводит код HTML и, возможно, JavaScript, который отправляется как ответ клиенту, где интерпретируется HTML, и выполняется JavaScript. Когда PHP завершит вывод ответа, сценарий закончится, и на сервере ничего не произойдет, пока не появится новый HTTP-запрос.

Пример кода выполняется следующим образом:


Шаг 1, PHP выполняет весь код между тегами . В результате получилось следующее:


Вызов file_put_contents не привел ни к чему, он просто написал «+ foo +» в файл. Вызов привел к выводу «42», который теперь находится в том месте, где этот код использовался.

Этот итоговый код HTML / JavaScript теперь отправляется клиенту, где он получает оценку , Вызов alert работает, а переменная foo нигде не используется.

Весь PHP-код выполняется на сервере до того, как клиент даже начнет выполнение какого-либо JavaScript. В ответе JavaScript, с которым может взаимодействовать JavaScript, нет кода PHP.

Чтобы вызвать некоторый код PHP, клиент должен будет отправить новый HTTP-запрос на сервер. Это может произойти с использованием одного из трех возможных способов:

  1. Ссылка, которая заставляет браузер загружать новую страницу.
  2. Подача формы, которая передает данные на сервер и загружает новую страницу.
  3. Запрос AJAX , который является техникой Javascript, чтобы сделать обычный HTTP-запрос на сервер (например, 1. и 2. будет), но без оставляя текущую страницу.

Вот более подробный изложение этого метода

Вы также можете использовать JavaScript, чтобы браузер открыл новую страницу с помощью window.location или отправить форму, подражая возможностям 1 и 2.

209
задан too much php 5 November 2008 в 00:33
поделиться

8 ответов

  • tput cols сообщает вам количество столбцов.
  • tput lines сообщает вам количество строк.
414
ответ дан Flow 24 August 2018 в 05:57
поделиться

Как я уже упоминал в лисическом ответе, его код не будет работать на неанглийском языке Windows, потому что тогда вывод mode может не содержать подстроки «столбцы» или «строки»:

& nbsp; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; mode command output [/g0]

Вы можете найти правильную подстроку не просматривая текст:

 preg_match('/---+(\n[^|]+?){2}(?<cols>\d+)/', `mode`, $matches);
 $cols = $matches['cols'];

Обратите внимание, что я даже не беспокоюсь о строках, потому что это ненадежно (и я на самом деле не забочусь о них).

Изменить: согласно к комментариям о Windows 8 (о, вы ...), я думаю, что это может быть более надежным:

 preg_match('/CON.*:(\n[^|]+?){3}(?<cols>\d+)/', `mode`, $matches);
 $cols = $matches['cols'];

Протестируйте это, хотя я не тестировал его.

3
ответ дан Camilo Martin 24 August 2018 в 05:57
поделиться
  • 1
    Ваш метод не работает в Win8. Я получаю несколько строк ---. i.imgur.com/4x02dqT.png – mpen 13 August 2014 в 02:01
  • 2
    @Mark Ну, отлично, это просто КРАСИВО. Спасибо Windows. & lt; 3 (в более важной заметке: я посмотрю, как это исправить ... когда Windows 9 выходит: P). – Camilo Martin 13 August 2014 в 02:11
  • 3
    Так я это делаю: $mode = `mode`; list($rows, $cols) = array_slice(preg_split('/\n/', substr($mode, strpos($mode, 'CON:'))), 2, 2);. И тогда я просто заменю все, кроме цифр. – Aleksandr Makov 16 September 2014 в 15:48
  • 4
    @AleksandrMakov Интересно, что произойдет, если есть языки с порядком вроде CON device status:? Возможно, что-то похожее на CON.*: будет работать лучше. – Camilo Martin 16 September 2014 в 20:37
  • 5
    @Mark Я действительно спрашивал себя, что именно. Почему, черт возьми, я это сделал? В сомнении, я только предположил, что есть какая-то причина, и пошел с ним, lol. – Camilo Martin 19 September 2014 в 03:15

В bash переменные среды $LINES и $COLUMNS должны быть в состоянии сделать трюк. Он будет автоматически установлен при любом изменении размера терминала. (т. е. сигнал SIGWINCH )

73
ответ дан David Dean 24 August 2018 в 05:57
поделиться
  • 1
    Однако эти переменные среды доступны только для bash, а не для любых программ, которые запускаются внутри bash (например, perl, python, ruby). – Br.Bill 1 March 2012 в 01:20
  • 2
    yes = | head -n $ (($ LINES * $ COLUMNS)) | tr -d '\n' – donatJ 22 March 2013 в 22:12
  • 3
    Это не работает ни в чем, кроме интерактивного сеанса bash (если вы запускаете скрипт, он больше не является интерактивным). Единственное место, которое вы можете использовать в скрипте, это команда prompt_command в bash. – Doncho Gunchev 28 February 2014 в 09:59
  • 4
    Фактически, он работает в неинтерактивных скриптах, если вы установите параметр checkwinsize. Например, этот неинтерактивный скрипт будет печатать размеры терминала, на котором он запущен: shopt -s checkwinsize; (:); echo $LINES $COLUMNS (опция checkwinsize только инициализирует переменные после ожидания завершения подоболочки, поэтому нам нужен (:) заявление) – user3340662 10 August 2017 в 11:52

Вдохновленный ответом @ pixelbeat, вот горизонтальная полоса, появившаяся на tput, небольшое злоупотребление printf дополнением / заполнением и tr

printf "%0$(tput cols)d" 0|tr '0' '='
1
ответ дан huoneusto 24 August 2018 в 05:57
поделиться

В POSIX, в конечном счете, вы хотите вызвать вызов TIOCGWINSZ (Get WINdow SiZe) ioctl(). Для большинства языков для этого должна быть какая-то обертка. Например, в Perl вы можете использовать Term :: Size :

use Term::Size qw( chars );

my ( $columns, $rows ) = chars \*STDOUT;
9
ответ дан LeoNerd 24 August 2018 в 05:57
поделиться

Чтобы сделать это в среде CLI Windows, лучший способ найти это - использовать команду mode и проанализировать вывод.

function getTerminalSizeOnWindows() {
  $output = array();
  $size = array('width'=>0,'height'=>0);
  exec('mode',$output);
  foreach($output as $line) {
    $matches = array();
    $w = preg_match('/^\s*columns\:?\s*(\d+)\s*$/i',$line,$matches);
    if($w) {
      $size['width'] = intval($matches[1]);
    } else {
      $h = preg_match('/^\s*lines\:?\s*(\d+)\s*$/i',$line,$matches);
      if($h) {
        $size['height'] = intval($matches[1]);
      }
    }
    if($size['width'] AND $size['height']) {
      break;
    }
  }
  return $size;
}

Надеюсь, это полезно!

ПРИМЕЧАНИЕ. Возвращаемая высота - это количество строк в буфере, а не количество строк, которые видны внутри окна. Какие-нибудь лучшие варианты там?

9
ответ дан lyceus 24 August 2018 в 05:57
поделиться
  • 1
    Неудивительно, почему люди склонны избегать консоли Windows ... – Darkhogg 10 December 2013 в 10:33
  • 2
    Обратите внимание на проблему с этим: вывод этой команды зависит от локали. Другими словами, это не будет работать как в другом локали Windows. Это то, что я получаю в Windows 7: i.imgur.com/Wrr7sWY.png – Camilo Martin 17 January 2014 в 17:27
  • 3
    Добавлен ответ с решением. +1 хотя! – Camilo Martin 17 January 2014 в 17:53
yes = | head -n$(($(tput lines) * $COLUMNS)) | tr -d '\n'
14
ответ дан pixelbeat 24 August 2018 в 05:57
поделиться
  • 1
    Не прямой ответ на вопрос, а отличный демонстрационный сценарий. – Chris Page 28 September 2011 в 08:46
  • 2
    Какой прекрасный пример! – Kurt Zhong 7 January 2014 в 11:38
  • 3
    как, черт возьми, я пропустил команду tr все эти годы? (Facepalm) – Marco 2 May 2015 в 08:06
  • 4
    Что это за язык? Это выглядит неопределенно, как скрипт оболочки с синтаксическими ошибками. (В оболочке у вас не может быть пробелов вокруг присваивания, равно знаку, а первый канал кажется неуместным.) – tripleee 14 May 2018 в 04:32
  • 5
    yes '=' выводит бесконечное количество строк '=', и следующие команды организуют достаточно для заполнения терминала – pixelbeat 17 May 2018 в 21:57

И есть stty , из coreutils

$ stty size
60 120 # <= sample output

Он напечатает количество строк и столбцов, а также высоту и ширину, соответственно.

Затем вы можете использовать cut или awk для извлечения нужной части.

44
ответ дан ryenus 24 August 2018 в 05:57
поделиться
  • 1
    Этот стиль не может работать с PIPE, предлагая использовать стиль tput. – liuyang1 14 July 2015 в 12:34
Другие вопросы по тегам:

Похожие вопросы: