Php 已注册的关机功能列表

Php 已注册的关机功能列表,php,Php,是否有任何方法可以访问已注册的关机功能列表 除了自己跟踪之外,没有。注册函数名的列表不会公开给您的PHP脚本。如果您愿意扩展PHP本身(这将是一项简单的任务),那么请参阅Artefactor的答案。您可以编写一个扩展,然后查看BG(user\u shutdown\u function\u names)。可能更简单的方法是为register\u shutdown\u函数制作一个包装器,将关闭函数保存到某个数组中,然后调用它 (未经测试) #包括“ext/standard/basic_functio

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

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

您可以编写一个扩展,然后查看
BG(user\u shutdown\u function\u names)
。可能更简单的方法是为
register\u shutdown\u函数
制作一个包装器,将关闭函数保存到某个数组中,然后调用它

(未经测试)

#包括“ext/standard/basic_functions.h”
//这里通常包括嫌疑犯
typedef结构\u php\u关闭\u函数\u条目{
zval**参数;
int arg_计数;
}php_关机_函数_条目;
静态无效(php)关闭(function)(entry)关闭(entry)/*{{{*/
{
int i;
对于(i=0;iarg\u count;i++){
zval_ptr_dtor(&shutdown_function_entry->arguments[i]);
}
efree(关闭函数项->参数);
}
静态int构建shutdown数组(php shutdown函数entry*entry,zval*arr TSRMLS\u DC)
{
zval*内部;
zval*args;
int i;
数组_init(内部);
数组_init(args);
Z_ADDREF_P(条目->参数[0]);
添加_assoc_zval(内部,“回调”,条目->参数[0]);
对于(i=1;iarg\u count;i++){
Z_ADDREF_P(条目->参数[i]);
添加下一个索引(args,entry->arguments[i]);
}
添加_assoc_zval(内部,“参数”,参数);
添加下一个索引(arr,内部);
}
PHP_函数(列出关闭函数)
{
if(zend_parse_parameters_none()=失败)
返回;
如果(!BG(用户\功能\名称)){
ALLOC_哈希表(BG(用户关闭函数名));
zend_hash_init(BG(用户关闭函数名),0,NULL,
(无效(*)(无效*)\u关闭\u功能\u数据,0);
}
数组_init(返回_值);
zend_hash_apply_和参数(BG(用户关闭函数名),
(应用函数参数数组)\生成数组\关闭数组,返回值TSRMLS\u CC);
}

wow,这是一个多么深入的答案。大多数情况下,PHP已经在PHP级别上有了一个函数来做事情,但在本例中它没有,而您仍然找到了一个解决方案!
#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);
}