2010-06-29 46 views

回答

9

你可以寫一個擴展名,並看看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); 
} 
+0

哇,多麼深入的答案。大多數情況下,PHP已經在PHP級別上有一個功能來處理事務,但在這種情況下,它並沒有這樣做,但您仍然可以通過解決方案來實現這一目標! – 2016-07-15 01:03:16

2

除了跟蹤自己,沒有。註冊的函數名稱列表不會暴露給您的PHP腳本。如果您願意擴展PHP本身(這將是一項簡單的任務),那麼請參閱Artefacto的答案。