Какие тики используются в 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);
}
Ответы
Ответ 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 быть немного менее эффективным и обеспечить, чтобы мои блоки выполнения выполнялись, как ожидалось.