Je voulais connaitre votre avis sur la meilleur façon de gérer les accès concurrents dans les fichiers XML qu’on accède / modifie avec DOM de PHP 5 !
En faite c’est pour un forum que j’ai créé avec xml et DOM au début pour m’entrainer, et maintenant je trouve que c’est une bonne idée de forum “pret à l’emploi”, c-à-d on télécharge, on copie et ça marche, je trouve que c’est un bon concept pour les novices qui veulent un forum sans rien avoir a configurer !!
Comme j’ai jamais trop reflechis à la façon d’aborder les accès concurrents en PHP, je vous demande votre avis
MERCI
ps : gardez à l’esprit que c’est pour un forum “pret a l’emploi” et donc les solutions trop spécifique ou qui demande des notions spéciales à l’utilisateur sont pas top, une solution en PHP serait mieux
oui, lecture aucun problème, mais quand deux processus PHP écrivent dans le meme fichier ca pose probleme :
dom charge le document xml
je modifie le document xml “dans la mémoire”
j’écris le fichier xml (ecrasement)
maintenant, si entre le moment ou je charge et ou j’écris, un autre processus PHP vient modifier le meme fichier xml, bah la y va y avoir des pertes d’informations.
DOM pas rapide oui mais SAX est pas disponible en natif dans PHP5. Y a que simpleXML, peut etre est-il plus rapide ?
Je vois ton problème, et je doute de sa solvabilité (pas moyen de poser un verrou, puis aussi DOM n’est peut-être pas trop accès concurrent?). As tu envisagé les bases de données? (qui font ça en fait)
Sinon l’idée serait de poser un verrou dés lors que tu as ouvert le fichier en écriture, et attendre que ce verrou soit levé.
Avec des threads poxid, cela donnerait un truc du genre :
pthread_mutex_lock(&file_mutex);
// charge le fichier
// fait mumuse avec
// fin
pthread_mutex_unlock(&file_mutex);
Une thread serait dans ton cas un client.
Bien sûr, php ne dispose pas de verrou, et encore moins de mise en attente (c’est pas non plus un langage multi threadé).
Tu peux éventuellement tenter des trucs genre :
// pose du verrou
while (file_exists('lock')) sleep(100);
touch('lock');
// truc XML
// unlock
unlink('lock');
Une BDD est prévue pour ce genre de cas c’est extérieur à php, et surtout DOM recharge tout le fichier XML, pour y faire une ou deux modifications. Plus ton fichier XML est gros, plus il mettra du temps à le charger, et le modifier.
A contrario, ajouter dans une base de données, c’est quasi linéaire.