2015-07-08 5 views
19

Сегодня я просматривал руководство по php и наткнулся на структуру управления declare.Понимание PHP declare() и тики

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

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

Клеща это события, которое происходит для каждого N низкого уровня tickable заявления, выполненного анализатором в блоке объявляет. Значение для N задается с использованием тиков = N в директиве блока объявления .

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

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

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

[EDIT 1]
Я также видел реализацию declare() другой раздел руководство по PHP Function arguments

[EDIT 2]
Также в Process Control

Вы используете оператор declare() для указания местоположений в вашей программе , где возможны обратные вызовы. Это позволяет минимизировать накладные расходы на обработку асинхронных событий

+0

Возможный дубликат [Что такое тики, используемые в PHP?] (Http://stackoverflow.com/questions/3656257/what-are-ticks-used-for-in-php) –

+0

@HoboSapiens Я видел, что SO post и упомянул об этом в вопросе. У меня есть кое-что, что я до сих пор не понял –

+0

Это по существу тот же вопрос, что и на странице, с которой вы уже связались, где есть хорошие примеры использования тика. Если этот вопрос не ответит на ваши вопросы, вам нужно будет уточнить, что вы не понимаете. –

ответ

7

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

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

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

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

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

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

С 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(), если это не так.

+0

ОК ... теперь у меня появилась идея. –

7

На практике: Игнорируйте declare() директиву. Если вы не используете код, который его использует, что очень редко, вы можете спокойно забыть, что он когда-либо существовал.

Это, здесь, подробности. Директива declare() в настоящее время используется для двух совершенно не связанных между собой вещей:

  • declare(encoding=…) В, для объявления кодировки PHP файла. (В этом смысле он сравним с версией сервера <meta charset="…">.)

    Но не используйте это. В большинстве случаев кодировка сценария не имеет значения. Если это произойдет случайно, кодировка PHP должна быть установлена ​​глобально (надеюсь, на «UTF-8») значением конфигурации zend.script_encoding.Установка его на уровне файла является запутанной и ненужной.

  • Как declare(ticks=…), для определения частоты, с которой вызывается функция тика. Функции Tick вызываются периодически интерпретатором PHP и настраиваются с использованием register_tick_function.

    Хотя некоторые комментарии на php.net предлагают использовать его для реализации тайм-аутов при доступе к сети, это не работает должным образом, поскольку тики не запускаются, когда интерпретатор заблокирован в вызове собственной функции. У этого могут быть некоторые применения в бенчмаркинге, но вне этого это в основном бесполезно. Я бы избегал этого.

+0

У меня есть 'declare()' другой раздел руководства php [аргументы функции] (http://php.net/manual/en/functions.arguments.php#example-173) –

+1

Это новая функция, ожидаемая для PHP 7.0, который еще не выпущен. Я намеренно описываю только те функции, которые существуют в текущих версиях PHP. – duskwuff

2

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

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

+4

Извините, но заявление «вам нужно» неверно. «вы могли бы, но вы действительно не должны» было бы правильно. Обработчики тиков чрезвычайно дороги (или очень непредсказуемы) для улавливания сигналов. Вы * должны * (как и php 5.3 aka давно) использовать 'pcntl_signal_dispatch()' ([manual] (http://php.net/manual/en/function.pcntl-signal-dispatch.php)), чтобы обрабатывать сигналы предсказуемым образом. Я могу найти множество заявлений о том, что тики даже устарели по 5.3, но, похоже, не могут найти надежных источников для поддержания этого - мой личный опыт говорит, что 'pcntl_signal_dispatch' всегда лучше. – Mikk3lRo

Смежные вопросы