Подтвердить что ты не робот

Какие тики используются в PHP?

Я хотел бы знать, почему, как и когда использовать тики в PHP:

declare(ticks=1);

// A function called on each tick event
function tick_handler()
{
    echo "tick_handler() called\n";
}

register_tick_function('tick_handler');

$a = 1;

if ($a > 0) {
    $a += 2;
    print($a);
}
4b9b3361

Ответ 1

Одно использование было описано [email protected]:

Как уже отмечал Крис, тики не делают ваш script многопоточным, но они по-прежнему велики. Я использую их главным образом для профилирования - например, размещение в самом начале script позволяет отслеживать использование памяти:

<?php

function profiler($return=false) {
    static $m=0;
    if ($return) return "$m bytes";
    if (($mem=memory_get_usage())>$m) $m = $mem;
}

register_tick_function('profiler');
declare(ticks=1);

/*
Your code here
*/

echo profiler(true);

?>

Этот подход более точен, чем вызов memory_get_usage только в конце script. У него есть некоторые служебные накладные расходы:)

Другое использование было описано [email protected]:

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

вы можете объявить функцию tick, которая проверяет все n выполнений вашего script, является ли соединение еще живым или нет, очень полезно для каких-то сценариев для уменьшения серверной загрузки

<?php

function check_connection()
{ if (connection_aborted())
   { // do something here, e.g. close database connections
      // (or  use a shutdown function for this
      exit; }
}

register_tick_function("connection");

declare (ticks=20)
{
  // put your PHP-Script here
  // you may increase/decrease the number of ticks
}

?>

Ответ 2

Клещи могут использоваться для основных вещей, таких как:

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

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

Ключи могут использоваться и для других вещей, например, для реализации приложения, управляемого событиями (например, для игры).

Ответ 3

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

Событие (события), которое происходит на каждом тике, определяется с помощью register_tick_function().

Ответ 4

Я нашел особенно интересный вариант использования для тиков, не описанных здесь.

Я столкнулся со сценарием в моем демоне, где я хотел использовать pcntl_fork и убедиться, что это произошло именно тогда, когда я ожидал, но симптомы, которые показывают мне иначе. Проблема сводится к двум частям: (1) Как zend-ng (новый движок PHP7) сопоставляет выполнение C на основе ваших скомпилированных директив PHP, то есть между каждой группой исполнений мы имеем "тик" и (2) Как ресурсы подвергаются вам в PHP, т.е. файловые дескрипторы создаются на O/S кодом C, который может или не может находиться в ожидаемом блоке выполнения при компиляции из вашего кода в C.

Проще говоря, я открыл сокет в родительском процессе и в дочернем процессе использовал его, просто так? ну нет, ресурс в дочернем процессе не всегда был таким, как ожидалось, и во всех случаях родительский процесс не прерывался (что обычно объясняет, почему вы теряете доступ к открытым ресурсам)

Принуждение PHP объявлять, когда галочка выполняется после того, как один блок выполнения фактически заставил zend-ng быть немного менее эффективным и обеспечить, чтобы мои блоки выполнения выполнялись, как ожидалось.