Current Location: Home> Latest Articles> How to ensure that unregister_tick_function successfully logs out all tick functions

How to ensure that unregister_tick_function successfully logs out all tick functions

gitbox 2025-05-31

1. Basics of tick function registration and cancellation

First, let’s review the basic usage of registering and canceling tick functions:

 <?php
declare(ticks=1);

function tickHandler() {
    echo "Tick handler called.\n";
}

// registertickfunction
register_tick_function('tickHandler');

// Code execution will triggertickfunction调用
for ($i = 0; $i < 3; $i++) {
    echo "Loop iteration $i\n";
}

// Log outtickfunction
unregister_tick_function('tickHandler');
?>

In the above example, the tickHandler will be called after each statement is executed. The function name passed in when calling unregister_tick_function must be the same as the time of registration.


2. How to ensure that all tick functions are successfully logged out?

2.1 Recording registered tick functions

PHP itself does not provide an API to directly get the list of currently registered tick functions. Therefore, developers need to maintain a list of registered tick functions themselves to facilitate unified logout.

Example:

 <?php
declare(ticks=1);

$registeredTickFunctions = [];

function registerTickFunctionWrapper($func) {
    global $registeredTickFunctions;
    register_tick_function($func);
    $registeredTickFunctions[] = $func;
}

function unregisterAllTickFunctions() {
    global $registeredTickFunctions;
    foreach ($registeredTickFunctions as $func) {
        unregister_tick_function($func);
    }
    $registeredTickFunctions = [];
}

// 示例function
function tickOne() {
    echo "tickOne called\n";
}
function tickTwo() {
    echo "tickTwo called\n";
}

// registertickfunction
registerTickFunctionWrapper('tickOne');
registerTickFunctionWrapper('tickTwo');

// Code execution will triggertickfunction调用
echo "Running ticks...\n";

// Log out所有tickfunction
unregisterAllTickFunctions();
?>

By maintaining the $registeredTickFunctions array, you can ensure that all functions can be logged out.


2.2 Pay attention when using anonymous functions or closures

If you use anonymous functions or closures to register a tick function, you must keep a reference to the same closure when logging out, otherwise you cannot log out.

Example:

 <?php
declare(ticks=1);

$closure = function() {
    echo "Anonymous tick function called\n";
};

register_tick_function($closure);

// 尝试Log out,Must use the same closure variable
unregister_tick_function($closure);
?>

Do not pass in new anonymous functions directly, logout will fail.


2.3 Tips for confirming successful logout

The unregister_tick_function itself has no return value, and it is impossible to directly detect whether the logout is successful. It can be verified indirectly by:

  • After executing the logout, run the code segment that triggers the tick to observe whether the callback is still called.

  • By maintaining the state variable, detect whether the function should be executed in the tick callback.


2.4 Example: Complete registration, execution, and cancellation process

 <?php
declare(ticks=1);

$registeredTickFunctions = [];

function registerTickFunctionWrapper($func) {
    global $registeredTickFunctions;
    register_tick_function($func);
    $registeredTickFunctions[] = $func;
}

function unregisterAllTickFunctions() {
    global $registeredTickFunctions;
    foreach ($registeredTickFunctions as $func) {
        unregister_tick_function($func);
    }
    $registeredTickFunctions = [];
}

function tickHandlerA() {
    echo "tickHandlerA triggered\n";
}

function tickHandlerB() {
    echo "tickHandlerB triggered\n";
}

registerTickFunctionWrapper('tickHandlerA');
registerTickFunctionWrapper('tickHandlerB');

echo "Before unregister:\n";
for ($i = 0; $i < 2; $i++) {
    echo "Iteration $i\n";
}

unregisterAllTickFunctions();

echo "After unregister:\n";
for ($i = 0; $i < 2; $i++) {
    echo "Iteration $i\n";
}
?>

The tick function call before and after logout can be clearly seen in the output to ensure the logout is successful.


3. Summary

  • PHP does not have a built-in interface to obtain registered tick functions and needs to be managed by itself.

  • Unified maintenance of the registered function list is conducive to unified cancellation.

  • References should be retained when using anonymous functions to facilitate logout.

  • Verify the logout effect by triggering the code test.

  • These tips ensure that unregister_tick_function successfully cancels all tick functions.


The above content can help you better manage tick callbacks and avoid the residual tick function affecting program behavior.


 <?php
declare(ticks=1);

$registeredTickFunctions = [];

function registerTickFunctionWrapper($func) {
    global $registeredTickFunctions;
    register_tick_function($func);
    $registeredTickFunctions[] = $func;
}

function unregisterAllTickFunctions() {
    global $registeredTickFunctions;
    foreach ($registeredTickFunctions as $func) {
        unregister_tick_function($func);
    }
    $registeredTickFunctions = [];
}

function tickHandler() {
    echo "Tick function called.\n";
}

// registertickfunction
registerTickFunctionWrapper('tickHandler');

echo "Before unregistering:\n";
for ($i = 0; $i < 3; $i++) {
    echo "Loop iteration $i\n";
}

// Log out所有tickfunction
unregisterAllTickFunctions();

echo "After unregistering:\n";
for ($i = 0; $i < 3; $i++) {
    echo "Loop iteration $i\n";
}
?>