2011-06-13 4 views
4

J'écris un peu apache (2.2) en C et je suis assez nouveau à elle, donc je me demandais:modules variables globales dans le serveur Apache

J'ai besoin de savoir s'il est possible de créer une variable globale qui sera lancé chaque fois que le serveur Apache commencera à fonctionner. Voyez, j'ai besoin d'une liste de noms d'hôtes (qui seront "privilégiés"), de sorte que chaque requête que je reçois, je dois vérifier si le nom d'hôte apparaît dans la liste (pour vérifier s'il est "prévilé" "). La liste doit donc être globale (de sorte que chaque instance de serveur aura la même instance de la liste), et j'ai besoin de l'initialiser au début.

Comment faire cela, si c'est possible?

Merci!

+0

Est-ce la liste statique, ou est-il chargé d'une source externe? –

+0

Je voudrais que la liste soit chargée à partir d'un simple fichier texte lors de son lancement. – user795810

Répondre

4

Bien que n'étant pas une réponse complète, j'ai réussi à trouver un moyen d'avoir des variables globales.

J'ai utilisé les méthodes apr_pool_userdata_get et apr_pool_userdata_set avec les pools globaux du processus (pconf et pool).

Pour d'autres références:
http://apr.apache.org/docs/apr/0.9/group_apr_pools.html

Exemples:

attachent des données globales statiques processus serveur piscine

char *data = "this is some data"; 
apr_pool_userdata_setn ((void*) data, "myglobaldata_key", NULL, request->server->process->pool); 

attacher des données tas malloced à la piscine processus serveur

char *data = strdup("this is some data"); 
apr_pool_userdata_setn ((void*) data, "myglobaldata_key", (apr_status_t(*)(void *))free, request->server->process->pool); 

maintenant récupérer les données globales:

char *data; 
apr_pool_userdata_get ((void**)&data, "myglobaldata_key", request->server->process->pool); 
if (data == NULL) { 
    // data not set... 
} 
0

Ce lien indique on peut utiliser des variables statiques/globales dans un module, ils ont besoin de soins pour accéder à partir de plusieurs threads. Mon observation est que, étant donné qu'il peut y avoir plusieurs processus (la variable globale vivrait dans un processus, partagé par de nombreux threads), le static ne devrait pas être compté pour être initialisé. C'est-à-dire que l'initialisation une fois n'est probablement pas suffisante.

http://httpd.apache.org/docs/2.2/developer/thread_safety.html#variables