Page 1 sur 1
Mémoire partagée ?
Posté : 02 juin 2010, 14:24
par sebcap26
Bonjour,
Une simple question que me pose depuis un moment, et a laquelle mon ami Google ne répond pas assez précisément

.
Y'a-t-il moyen, en PHP, d'avoir une mémoire partagée entre les différents threads du serveur ? Je précise : une mémoire "en mémoire", pas une mémoire improvisée qui passe par une bdd ou par des fichiers.
Par exemple : je veux faire un chat avec un système de serveur web push (qui est un autre débat, c'est juste pour illustrer). J'aurais besoin d'avoir une mémoire partagée (ou mieux, un système de tubes ou un FIFO bufferisé) pour faire communiquer les deux scripts PHP qui s'exécutent en parallèle, et ainsi faire en sorte que je puisse envoyer les infos aux autres clients directement.
J'ai bien vu qu'on pouvait manipuler de la mémoire avec shmop et tout ca, mais j'ai pas réussi à savoir si c'était partagé entre tous les clients ou pour un seul, ni comment récupérer mes adresses mémoires d'un script à l'autre ...
D'ailleurs, s'il existait un outil qui le fasse facilement en gérant les problèmes de synchronisation, ca serait même encore mieux ^^.
Si vous pouviez m'éclairer, ca serait sympa
Merci d'avance.
Re: Mémoire partagée ?
Posté : 02 juin 2010, 16:33
par stealth35
ouai
APC ou avec
memcache 
Re: Mémoire partagée ?
Posté : 02 juin 2010, 16:51
par sebcap26
Merci pour ta réponse.
Memcache passe par un serveur supplémentaire et par une connexion réseau, j'aime pas trop, ce que je veux c'est juste un truc en mémoire, c'est plus rapide :p
APC a l'air intéréssant par contre, je vais regarder en détail. Tu sais comment il réagit si ce que je lui passe est en fait l'adresse mémoire de mon truc (objet, tableau, chaine ...) ? Il risque pas de me détruire mes objets après l'exécution du script, et de me laisser une référence mémoire pourrie ?
Re: Mémoire partagée ?
Posté : 02 juin 2010, 17:03
par stealth35
tu récupères les variable dans la mémoire APC comme un variable de SESSION en gros sauf que la SESSION est partage pour tout le monde
Re: Mémoire partagée ?
Posté : 02 juin 2010, 17:11
par sebcap26
OK parfait alors, merci beaucoup.
Plus qu'a trouver un moyen pratique de faire un peu comme un serveur multi-thread avec mon serveur push (pour communiquer les informations à tous les clients connectés)

et j'aurais tout ce qu'il faut (théoriquement, après faudra passer à la pratique

).
Re: Mémoire partagée ?
Posté : 04 juin 2010, 16:12
par sebcap26
Bon, maintenant j'ai presque tout ce qu'il faut, mais il reste encore un problème à régler : les accès concurrents.
Dans la mémoire, je stockerais les actions des utilisateurs (sous forme d'objets ou de chaine de caractères, c'est pas encore bien défini mais peu importe) dans un tableau. Chaque fois que j'ajoute une action, ca l'ajoute à la suite de mon tableau (à l'indice suivant).
Pour la lecture, aucun problème d'accès concurrent, on ne pourra pas lire une action tant qu'elle ne sera pas écrite dans la mémoire. Par contre, le problème se pose à l'écriture. Si deux actions sont écrites en même temps, une des deux va être perdue

. Il me faudrait donc protéger la section critique qu'est l'écriture d'une action.
Y'a-t-il moyen en PHP de protéger ca ? J'ai bien vu qu'il y a une librairie pour faire des sémaphores, mais j'ai pas trop envie d'installer un truc supplémentaire juste pour ca, d'autant qu'elle a pas l'air compatible windows (même si j'utilise linux, je ne veux pas avoir à tout refaire si dans le futur j'ai besoin de windaube) ... Sinon y'a-t-il moyen de faire des verrous ?
En dernier recours je ressortirais mes cours pour trouver l'algorithme des fonctions des sémaphores et les implémenter moi même, mais j'aimerais éviter.
Re: Mémoire partagée ?
Posté : 04 juin 2010, 16:59
par stopher
Salut ,
On peut créer un mutex via une base de donnée , avec le moteur memory heap ( tout en mémoire volatile , donc acces tres rapide ) , avec un bit à 1 ou 0 ..
Le moteur de base de données gérera si une connexion simultanée se fait à un instant T premier arrivé , premier servi .
Ch.
Re: Mémoire partagée ?
Posté : 04 juin 2010, 17:06
par sebcap26
oui mais le problème c'est que je veux le faire directement en mémoire, avec apc.
Une base de données est beaucoup plus lente, et je ne vais pas utiliser un moteur de base de données juste pour un bit
Je voudrais stocker les variables qui concernent la synchronisation dans apc.
Re: Mémoire partagée ?
Posté : 04 juin 2010, 17:51
par stopher
Ba disons que la base te permet de gérer ça de façon structurée ...
tu peux gérer très simplement plusieurs mutex ou même sémaphores pour différents endroits de ton code .. de plus lacces est tres rapide avec le moteur Membre , il n'y a pas d'accès au disque ... bref le différence ne sera à mon avis pas perceptible !
Evidemment , si ton site n'utilise pas de base de données , c'est dommage de ne l'utiliser que pour ça ...
Le principe sinon avec apc est le même ..
une variable partagée , qui vaut 1 ou 0 ...
exemple :
while( 1=1 ){
if( $this->_P() ){
//access to the critical resource
.....
//unlock the mutex
$this->_V();
//leaves the loop
}else{
//wait 1 second
sleep( 1 );
}
}
Avec _P() :
if( apc_fetch( 'res_mutex' ) ){
apc_store('res_mutex', 0);
return true;
} else{
return false;
}
et _V():
apc_store('res_mutex', 1);
Ch.
Re: Mémoire partagée ?
Posté : 04 juin 2010, 18:45
par sebcap26
C'est pas aussi simple les mutex, ton code ne fonctionne pas
if( apc_fetch( 'res_mutex' ) ){
apc_store('res_mutex', 0);
Si deux threads passent le if en même temps, c'est mort, ils auront tous les deux accès à la ressource.
Re: Mémoire partagée ?
Posté : 04 juin 2010, 19:00
par stopher
Ba oui mais tu veux utiliser un mutex sans passer par l'extension prévu à cet effet , et sans laisser une appli externe ( sgbd ) gérer les connexions simultanées ...
au bout d'un moment tu as quelque chose qui fonctionne mais qui n'est pas fiable ... je ne vois pas ce que tu peux faire d'autre ..
http://www.php.net/manual/fr/book.sem.php
Ch.
Re: Mémoire partagée ?
Posté : 05 juin 2010, 17:30
par sebcap26
Bon, finalement je vais utiliser flock, j'ai pas le choix ^^.
Re: Mémoire partagée ?
Posté : 12 juil. 2010, 11:34
par shadowProd
Salut,
Pour la mémoire partagée, tu as 2 solutions (qui de plus peuvent être couplées):
- tu peux utiliser un système de messages queue. Une file d'attente de messages avec un système de producteur, consommateur. Ton code insère un nouveau message dans la file et un worker récupère la plus ancienne tâche insérée et l'éxécute.
- Utiliser le module Memcache. Il te permet de créer une mémoire partagée en RAM, accessible par chaque instance de ton script PHP ( chaque thead ).
J'espère que ça pourra t'aider.
Re: Mémoire partagée ?
Posté : 12 juil. 2010, 15:37
par telnes
bonjour
je trouve que ca "pense" C et pas PHP
++
Re: Mémoire partagée ?
Posté : 11 août 2010, 12:34
par timar146
Bonjour,
Je cherche à faire exactement le même chose que toi.
J'ai un Chat et je voudrais stocker les messages en RAM. Je suis donc tombé sur ton topic.
A tu trouvé une solution? et si oui laquelle?
Pour l'instant j'ai les messages en BDD mais cela ne me convient pas.
Merci par avance.