Понимание PHP declare() и ТИКов

сегодня я просматривал руководство php и наткнулся на структуру управления объявить.

конструкция declare используется для задания директив выполнения для блока кода

это declare Что должен делать. Честно говоря, я этого не понимал. При повторном чтении он нашел новую вещь Ticks

тик-это событие, которое происходит для каждого N низкоуровневого тикового выполненные заявления синтаксическим анализатором в блоке declare. Значение для N указывается с помощью ticks=N в директиве declare block раздел.

Я тоже не понял. что значит N low-level tickable statements Если бы был хороший пример кода, то это было бы легко понять. Но в инструкции ничего не было. Я нашел некоторые на SO 1 квартале, что на самом деле увеличило мое любопытство и замешательство. Так может кто-нибудь что это такое и где мы можем использовать этот.

моя фактическая путаница с этим утверждением (из связанного сообщения so) you can declare a tick-function which checks each n executions of your script whether the connection is still alive or not. Поэтому, когда я регистрирую функцию tick с tick = 20 на php-файле и выполняю ее, файл будет жить до завершения выполнения 20(получил эту идею, когда она ошибочно рассматривалась как многопоточная). Это идея, которую я получил, я не думаю, что это правильно..

или это простая замена для while($x = 20)

[EDIT 1]
Я также видел реализация declare() другой раздел руководства по php аргументов функции

[EDIT 2]
Также в

3 ответов


когда PHP выполняет ваш скрипт, выполнение можно рассматривать как множество выполняемых операторов. Большинство операторов вызывают галочку, хотя не обязательно все операторы делают это. (Инструкция говорит:Typically, condition expressions and argument expressions are not tickable.)

этот блок обычно вызывает 5 тиков, так как вы выполняете 5 операторов:

$a = 1;
$B = 2;
$a = 3;
$B = 4;
$a = 5;

и этот блок обычно вызывает 5 ТИКов, и еще один тик в конце цикла while также считается как оператор / ТИК:

while ($i < 5)
    $a++;

С помощь declare(ticks=N) и register_tick_function(), теперь вы можете выполнять код между операторами / тиками. Register_tick_function указывает, какая функция должна вызываться при возникновении события tick. И declare устанавливает, сколько тиков должно пройти, прежде чем произойдет событие тика.

С declare(ticks=1) и register_tick_function('someFunction'); вы называете someFunction() код между каждым оператором / тиком.

если вы используете declare(ticks=3), потом someFunction() будет выполняться на каждом третьем заявление / галочка.

пример:

function handler(){
    echo "x";
}
register_tick_function("handler");
$i = 0;
declare(ticks = 4) {
    while ($i < 9)
        echo ++$i;
}

этот скрипт выведет:1234x5678x9 Все очень просто.

теперь то, что подразумевается в связанном вопросе с "жива ли связь", на самом деле не интересно само по себе и фактически не связано с вышеупомянутым. Это просто то, что вы могли бы сделать на каждом событии тика. Но вы также можете сделать что-то совершенно другое. Что упоминается, это просто, что некоторые скрипты могут занять довольно много времени выполнить и что во время выполнения клиент может отключиться. (Представьте, что вы закрываете браузер, пока скрипт все еще работает.) PHP по умолчанию продолжит выполнение скрипта, даже если клиент отключен. Вы можете использовать функцию connection_aborted() чтобы определить, отключен ли клиент. Это то, что вы также можете сделать без использования клещей вообще.

теперь предположим, например, что вы хотите, чтобы ваш скрипт прекратил работу, как только клиент отключится. Просто использовать ...

function killme() {
    if (connection_aborted()) {
        die();
    }
}
register_tick_function('killme');
declare(ticks=1);

... и ваш скрипт вызовет killme() после каждой инструкции кода. killme() проверит, подключен ли клиент и die() когда это не так.


на практике: игнорировать


одно использование, не упомянутое в этом или возможном дублирующем ответе, ловит сигналы.

Если у вас есть сценарий CLI и вы хотите поймать пользовательские сигналы (например, SIGHUP или SIGTERM (CTRL+C)), вам нужно declare(ticks... вместе с pcntl_signal https://secure.php.net/manual/en/function.pcntl-signal.php что позволяет вам ловить эти сигналы (такие же, как trap в сценариях оболочки)