已注册的关闭功能列表

时间:2010-06-29 11:38:48

标签: php

是否有任何方法可以访问已注册的关闭功能列表?

2 个答案:

答案 0 :(得分:10)

您可以撰写扩展程序并查看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);
}

答案 1 :(得分:2)

除了跟踪自己之外,没有。已注册的函数名列表未公开给您的PHP脚本。如果您愿意扩展PHP本身(这将是一项简单的任务),那么请参阅Artefacto的答案。