список зарегистрированных функций завершения работы

Там какой-либо метод должен получить доступ к списку зарегистрированных функций завершения работы?

6
задан ts. 29 June 2010 в 11:38
поделиться

2 ответа

Вы можете написать расширение и посмотреть BG (user_shutdown_function_names) . Вероятно, проще сделать оболочку для register_shutdown_function , которая сохраняет функции выключения в некоторый массив и вызывает его вместо этого.

(Не проверено)

#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);
}
10
ответ дан 9 December 2019 в 20:39
поделиться

Если не считать самостоятельного отслеживания, то нет. Список зарегистрированных имен функций не доступен для ваших PHP-скриптов. Если вы готовы к расширению самого PHP (это было бы простой задачей), то смотрите ответ Artefacto.

2
ответ дан 9 December 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: