2010-06-29 12 views

Odpowiedz

9

Możesz napisać rozszerzenie i spojrzeć na BG(user_shutdown_function_names). Prawdopodobnie łatwiejsze jest utworzenie opakowania dla register_shutdown_function, które zapisuje funkcje wyłączania do pewnej tablicy i wywołuje ją.

(Nietestowane)

#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

wow, co za dogłębne odpowiedź. przez większość czasu PHP ma już funkcję na poziomie PHP, aby robić różne rzeczy, ale w tym przypadku tak się nie dzieje, a mimo to wciąż masz rozwiązanie! –

2

Poza utrzymywaniem ruchu samodzielnie, nie. Lista zarejestrowanych nazw funkcji nie jest narażona na działanie skryptów PHP. Jeśli jesteś otwarty na rozszerzanie samego PHP (byłoby to proste zadanie), zobacz odpowiedź Artefacto.

Powiązane problemy