Home » Php » php – list of registered shutdown functions

php – list of registered shutdown functions

Posted by: admin July 12, 2020 Leave a comment

Questions:

Is there any method to access to list of registered shutdown functions?

How to&Answers:

You can write an extension and look at BG(user_shutdown_function_names). Probably easier is to make a wrapper for register_shutdown_function that saves the shutdown functions to some array and call it instead.

(Untested)

#include "ext/standard/basic_functions.h"
//usual include suspects here

typedef struct _php_shutdown_function_entry {
    zval **arguments;
    int arg_count;
} php_shutdown_function_entry;

static void _shutdown_function_dtor(php_shutdown_function_entry *shutdown_function_entry) /* {{{ */
{
    int i;

    for (i = 0; i < shutdown_function_entry->arg_count; i++) {
        zval_ptr_dtor(&shutdown_function_entry->arguments[i]);
    }
    efree(shutdown_function_entry->arguments);
}

static int _build_shutdown_array(php_shutdown_function_entry *entry, zval *arr TSRMLS_DC)
{
    zval *inner;
    zval *args;
    int i;

    array_init(inner);
    array_init(args);
    Z_ADDREF_P(entry->arguments[0]);
    add_assoc_zval(inner, "callback", entry->arguments[0]);

    for (i = 1; i < entry->arg_count; i++) {
        Z_ADDREF_P(entry->arguments[i]);
        add_next_index_zval(args, entry->arguments[i]);
    }
    add_assoc_zval(inner, "arguments", args);

    add_next_index_zval(arr, inner);
}

PHP_FUNCTION(list_shutdown_functions)
{
    if (zend_parse_parameters_none() == FAILURE)
        return;

    if (!BG(user_shutdown_function_names)) {
        ALLOC_HASHTABLE(BG(user_shutdown_function_names));
        zend_hash_init(BG(user_shutdown_function_names), 0, NULL,
            (void (*)(void *)) _shutdown_function_dtor, 0);
    }

    array_init(return_value);

    zend_hash_apply_with_argument(BG(user_shutdown_function_names),
        (apply_func_arg_t) _build_shutdown_array, return_value TSRMLS_CC);
}

Answer:

Other than keeping track yourself, no. The list of registered function names is not exposed to your PHP scripts. If you’re open to extending PHP itself (this would be a simple task) then see Artefacto’s answer.