2009-12-15 4 views
4

J'ai écrit une bibliothèque d'extension PHP en C++. J'écris l'extension pour l'annonce PHP 5.x ci-dessus.Bibliothèque d'extension PHP accédant aux superglobaux PHP

J'ai besoin d'accéder aux superglobales PHP dans mon code C++. Est-ce que quelqu'un sait comment faire ça?. Un extrait de code ou un pointeur (sans jeu de mots) vers une ressource similaire (sans jeu de mots ...) serait grandement apprécié.

Répondre

3

Quelles données avez-vous réellement besoin? - Le meilleur moyen pour la plupart des données est de se référer à la structure C d'où elles proviennent. Par exemple avec les données de demande, vous pouvez vérifier la sapi_globals, accessible par le SG() macro, les données de session est disponible via le module de session, ...

Si vous avez vraiment besoin d'un accès à un super-global, vous pouvez le trouver dans le hachage EG(symbol_table) table. Comme PHP a un mécanisme JIT pour fournir des super globales uniquement lorsque cela est nécessaire, vous devrez peut-être appeler d'abord zend_auto_global_disable_jit() pour désactiver cela.


Répondre au commentaire ci-dessous: Est-ce tout cela suffisamment de données:

typedef struct { 
    const char *request_method; 
    char *query_string; 
    char *post_data, *raw_post_data; 
    char *cookie_data; 
    long content_length; 
    uint post_data_length, raw_post_data_length; 

    char *path_translated; 
    char *request_uri; 

    const char *content_type; 

    zend_bool headers_only; 
    zend_bool no_headers; 
    zend_bool headers_read; 

    sapi_post_entry *post_entry; 

    char *content_type_dup; 

    /* for HTTP authentication */ 
    char *auth_user; 
    char *auth_password; 
    char *auth_digest; 

    /* this is necessary for the CGI SAPI module */ 
    char *argv0; 

    /* this is necessary for Safe Mode */ 
    char *current_user; 
    int current_user_length; 

    /* this is necessary for CLI module */ 
    int argc; 
    char **argv; 
    int proto_num; 
} sapi_request_info; 

typedef struct _sapi_globals_struct { 
    void *server_context; 
    sapi_request_info request_info; 
    sapi_headers_struct sapi_headers; 
    int read_post_bytes; 
    unsigned char headers_sent; 
    struct stat global_stat; 
    char *default_mimetype; 
    char *default_charset; 
    HashTable *rfc1867_uploaded_files; 
     long post_max_size; 
     int options; 
     zend_bool sapi_started; 
     time_t global_request_time; 
     HashTable known_post_content_types; 
} sapi_globals_struct; 

Ensuite, utilisez SG(request_info).request_uri ou similaire, alors que vous ne devez lire ces valeurs, ne pas écrire, donc faire une copie si nécessaire.

Aucun de ces produits n'est suffisant? - Revenez ensuite à ce que je disais plus haut:

/* untested code, might need some error checking and stuff */ 
zval **server_pp; 
zval **value_pp; 
zend_auto_global_disable_jit("_SERVER", sizeof("_SERVER")-1 TSRMLS_CC); 
if (zend_hash_find(EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void**)&server_pp) == FAILURE) { 
    zend_bailout(); /* worst way to handle errors */ 
} 
if (Z_TYPE_PP(server_pp) != IS_ARRAY) { 
    zend_bailout(); 
} 
if (zend_hash_find(Z_ARRVAL_PP(server_pp), "YOUR_VARNAME", sizeof("YOUR_VARNAME"), (void**)&value_pp) == FAILURE) { 
    zend_bailout(); 
} 
/* now do something with value_pp */ 

S'il vous plaît l'esprit que je jsut dactylographié ici de mon ind sans vérifier quoi que ce soit il peut se tromper, contenir des fautes de frappe, etc. Et comme une note: Vous devriez être conscient du fait que vous devez utiliser sizeof() pas sizeof()-1 avec les API de hachage comme nulle octet de terminaison fait partie du hachage calculée et a des fonctions matcher ou un échec, alors que SUCCESS est défini comme 0 et FAILURE comme -1 qui est pas ce on pourrait s'attendre, donc utilisez toujours ces constantes!

+0

Salut Johannes, je cherche les données de variables du serveur (généralement accédé en utilisant $ _SERVER en PHP) Comme la documentation sur les extensions PHP semble être plus rare, je serais extrêmement reconnaissant si vous pouviez poster un extrait qui montrerait comment accéder au tableau, ou l'un de ses éléments du coté C/C++ Vous pouvez poster l'extrait ici, ou sur patebin.com MTIA –

+2

Voir la réponse longue – johannes

+0

Johannes: Vous êtes un érudit et un gentleman! –

0

Je suppose que vous avez besoin quelque chose comme zend_hash_find(CG(auto_globals),... mais je ne suis pas un expert

+1

CG = compiler_globals, CG ne doit être utilisé que lors de la compilation d'un script. – johannes