Я хотел бы знать, почему, как и когда использовать тики в 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); }
Одно использование было описано rosen_ivanov@abv.bg :
Как уже отмечал Крис, тики не делают ваш сценарий многопоточным, но они по-прежнему велики. Я использую их в основном для профилирования – например, размещение следующего в самом начале скрипта позволяет отслеживать использование его памяти:
<?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 только в конце скрипта. У этого есть некоторые издержки производительности, хотя 🙂
Другое использование было описано warhog@warhog.net :
как я читал о клещах в первый раз, когда я подумал «wtf, бесполезное дерьмо», – но затем я обнаружил какое-то полезное приложение …
вы можете объявить функцию tick, которая проверяет каждый n исполнения вашего сценария, является ли соединение еще живым или нет, очень полезно для каких-то скриптов, чтобы уменьшить нагрузку на сервер
<?php function check_connection() { if (connection_aborted()) { // do something here, eg 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 } ?>
Клещи можно использовать для основных вещей, таких как:
В PHP 4 вы можете использовать тики для реализации обработки ошибок, подобных исключениям.
Клещи можно использовать и для других вещей, например, для реализации приложения, управляемого событиями (например, игры).
Галочка – это событие, которое встречается для каждого N
низкоуровневых операторов, выполняемых парсером в блоке declare
. Значение для N
указывается с помощью ticks=N
в разделе директивы блоков объявлений.
Событие (события), которое происходит на каждом тике, определяется с помощью register_tick_function()
.
Я нашел особенно интересный вариант использования тиков, не описанных здесь.
Я столкнулся с сценарием в моем демоне, где я хотел использовать pcntl_fork и убедиться, что это произошло именно тогда, когда я ожидал, но симптомы, которые показывают мне иначе. Проблема сводится к двум частям: (1) Как zend-ng (новый движок PHP7) сопоставляет выполнение C на основе ваших скомпилированных директив PHP, то есть между каждой группой исполнений мы имеем «тик» и (2) Как ресурсы подвергается вам в PHP, т.е. файловые дескрипторы создаются на O / S кодом C, который может быть или не быть в ожидаемом блоке выполнения при компиляции из вашего кода в C.
Говоря простыми словами, я открыл сокет в родительском процессе и в дочернем процессе использовал его, просто так? ну нет, ресурс в дочернем процессе не всегда был таким, как ожидалось, и во всех случаях родительский процесс не прерывался (что обычно объясняет, почему вы теряете доступ к открытым ресурсам)
Принуждение PHP объявлять, когда галочка выполняется после того, как один блок выполнения фактически заставил zend-ng быть немного менее эффективным и гарантировать, что мои блоки выполнения будут работать как ожидалось.