5
是否有任何方法可以訪問註冊關機功能列表?註冊關機功能列表
是否有任何方法可以訪問註冊關機功能列表?註冊關機功能列表
你可以寫一個擴展名,並看看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);
}
除了跟蹤自己,沒有。註冊的函數名稱列表不會暴露給您的PHP腳本。如果您願意擴展PHP本身(這將是一項簡單的任務),那麼請參閱Artefacto的答案。
哇,多麼深入的答案。大多數情況下,PHP已經在PHP級別上有一個功能來處理事務,但在這種情況下,它並沒有這樣做,但您仍然可以通過解決方案來實現這一目標! – 2016-07-15 01:03:16