Ваш код разбит на две полностью отдельные части, серверную сторону и клиентскую сторону .
|
---------->
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-запрос на сервер. Это может произойти с использованием одного из трех возможных способов:
Вот более подробный изложение этого метода
Вы также можете использовать JavaScript, чтобы браузер открыл новую страницу с помощью window.location
или отправить форму, подражая возможностям 1 и 2.
tput cols
сообщает вам количество столбцов. tput lines
сообщает вам количество строк. Как я уже упоминал в лисическом ответе, его код не будет работать на неанглийском языке 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; [/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'];
Протестируйте это, хотя я не тестировал его.
---
. i.imgur.com/4x02dqT.png
– mpen
13 August 2014 в 02:01
$mode = `mode`; list($rows, $cols) = array_slice(preg_split('/\n/', substr($mode, strpos($mode, 'CON:'))), 2, 2);
. И тогда я просто заменю все, кроме цифр.
– Aleksandr Makov
16 September 2014 в 15:48
CON device status:
? Возможно, что-то похожее на CON.*:
будет работать лучше.
– Camilo Martin
16 September 2014 в 20:37
В bash переменные среды $LINES
и $COLUMNS
должны быть в состоянии сделать трюк. Он будет автоматически установлен при любом изменении размера терминала. (т. е. сигнал SIGWINCH )
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' '='
В POSIX, в конечном счете, вы хотите вызвать вызов TIOCGWINSZ
(Get WINdow SiZe) ioctl()
. Для большинства языков для этого должна быть какая-то обертка. Например, в Perl вы можете использовать Term :: Size :
use Term::Size qw( chars );
my ( $columns, $rows ) = chars \*STDOUT;
:io.columns
Эрланг: io:columns().
erlang.org/doc/man/io.html#columns-0
– Henrik N
1 October 2015 в 20:59
TIOCGWINSZ
, а ioctl()
определяется только для устаревающей функции STREAMS.
– osvein
2 October 2017 в 20:41
Чтобы сделать это в среде 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;
}
Надеюсь, это полезно!
ПРИМЕЧАНИЕ. Возвращаемая высота - это количество строк в буфере, а не количество строк, которые видны внутри окна. Какие-нибудь лучшие варианты там?
yes = | head -n$(($(tput lines) * $COLUMNS)) | tr -d '\n'
yes '='
выводит бесконечное количество строк '=', и следующие команды организуют достаточно для заполнения терминала
– pixelbeat
17 May 2018 в 21:57
$ stty size
60 120 # <= sample output
Он напечатает количество строк и столбцов, а также высоту и ширину, соответственно.
Затем вы можете использовать cut
или awk
для извлечения нужной части.
echo -e "lines\ncols"|tput -S
, чтобы получить как строки, так и столбцы: linux.about.com/library/cmd/blcmdl1_tput.htm – nickl- 26 January 2013 в 05:49tput
- отличная команда с множеством команд для чтения состояния терминала, управления курсором и текстовыми свойствами и т. д. – Drew Noakes 8 January 2014 в 00:27alias dim="echo $(tput cols)x$(tput lines)"
, что может привести к80x50
. – bishop 10 April 2014 в 14:40