11.5.1 Créer une fonction PHP 3
11.5 Développement PHP
11 Appendices
Manuel PHP
. Prototypes de fonctions . Arguments de fonctions . Fonctions à nombre d'arguments variable . Utiliser les arguments d'une fonction . Gestion de la mémoire dans une fonction . Affecter une variable dans la table des symboles . Retourne une valeur simple . Retourner des valeurs complexes . Utiliser la liste des ressources ->Utiliser la table des ressources persistantes. . Ajouter des directives de configuration à l'exécution
|
11.5.1.10 Utiliser la table des ressources persistantes.
PHP 3.0 dispose d'une lieu de stockage des ressources persistantes (i.e.,
les ressources qui doivent être conservées d'un hit à
l'autre). Le premier module a utiliser cette capacité a été
MySQL, et mSQL suivi, ce qui fait que l'on peut se faire une impression
du fonctionnement de cette fonction avec mysql.c. Les fonctions ressemblent
à ceci :
- php3_mysql_do_connect
- php3_mysql_connect()
- php3_mysql_pconnect()
L'idée conductrice de ces modules est la suivante :
-
Programmez tout votre module pour qu'il travaille avec les
ressources standard, comme mentionné dans la section (9).
-
Ajoutez une autre fonction de connexion, qui vérifie d'abord que
la ressource existe dans la liste des ressources persistantes. Si
c'est le cas, enregistrez cette ressource comme pour les ressources
standard (et grâce à la première étape,
cela va fonctionner immédiatement). Si la ressource n'existe
pas, créez la, ajoutez la à la liste de ressources
persistantes, et ajoutez la à la liste de ressources, ce
qui fait que le code va fonctionner, et que le prochain appel
renverra une ressource existante. Vous devez enregistrer
ces fonctions avec un type différent (LE_MYSQL_LINK pour
les liens non persistants, et LE_MYSQL_PLINK pour les liens persistants).
Si vous jetez un oeil dans mysql.c, vous verrez que, hormis la fonction de
connexion complexe, rien n'a du être changé dans le module.
La même interface existe pour la liste des ressources standard, et pour
la liste des ressources persistantes, seule la 'list' est remplacée par
'plist':
- php3_plist_insert(ptr, type) - retourne l'identifiant 'id'
de la nouvelle ressource insérée.
- php3_plist_delete(id) - efface la ressource
d'identifiant id
- php3_plist_find(id,*type)
- retourne le pointeur de la ressource d'identifiant id,
et modifie le type 'type'
Cependant, il est probable que ces fonctions seront inutiles pour vous,
lorsque vous essayerez d'implémentez un module persistant. Typiquement,
on utiliser le fait que la liste de ressources persistantes est une table de
hash. Par exemple, dans les modules MySQL/mSQL, lors d'un appel à
pconnect(), la fonction construit une chaîne avec
l'hôte/utilisateur/mot_de_passe, et l'utilise pour enregistrer
dans la table de hash. Au prochain appel, avec les mêmes
hôte/utilisateur/mot_de_passe, la même clé sera
générée, et la ressource associée sera
retrouvée.
Jusqu'à ce que la documentation s'étoffe, jetez un oeil aux
fichiers mysql.c ou msql.c pour voir comment implémentez vos
accès aux ressources persistantes.
Une chose importante à noter : les ressources qui sont
enregistrées dans la liste de ressource persistante ne DOIVENT PAS
être allouée avec le gestionnaire de mémoire PHP,
c'est-à-dire qu'elles ne doivent pas être créée
avec emalloc(), estrdup(), etc. Au contraire, il faut utiliser les fonctions
standard malloc(), strdup(), etc. La raison est for simple : à la fin
de la requête, la mémoire sera supprimée par le
gestionnaire. Etant donné que les liens persistants doivent être
conservés, il ne faut pas utiliser le gestionnaire de mémoire.
Lorsque vous enregistrez une ressource qui sera placé dans la liste de
ressources persistantes, il faut ajouter les destructeurs dans les deux listes
de ressources, persistantes ou pas. Le destructeur de la liste de ressources
non persistantes ne doit rien faire du tout, tandis que celui de la liste de
ressources persistantes doit libérer proprement toutes les ressources
acquises (mémoire, lien SQL...). Commep pour les ressources non
persistantes vous DEVEZ ajouter un destructeur, même s'il ne fait
rien. N'oubliez pas que emalloc() et compagnie ne doivent pas être
utilisé en conjonction avec la liste de ressources persistantes, et
donc, vous ne devez pas utiliser efree() non plus.
|