已注册的关闭功能列表

ts.*_*ts. 6 php

有没有方法可以访问已注册的关闭功能列表?

Art*_*cto 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);
}
Run Code Online (Sandbox Code Playgroud)