Mémoire partagée ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Mémoire partagée ?

Re: Mémoire partagée ?

par timar146 » 11 août 2010, 12:34

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.

Re: Mémoire partagée ?

par telnes » 12 juil. 2010, 15:37

bonjour

je trouve que ca "pense" C et pas PHP

++

Re: Mémoire partagée ?

par shadowProd » 12 juil. 2010, 11:34

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 ?

par sebcap26 » 05 juin 2010, 17:30

Bon, finalement je vais utiliser flock, j'ai pas le choix ^^.

Re: Mémoire partagée ?

par stopher » 04 juin 2010, 19:00

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 ?

par sebcap26 » 04 juin 2010, 18:45

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 ?

par stopher » 04 juin 2010, 17:51

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 ?

par sebcap26 » 04 juin 2010, 17:06

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 :lol:

Je voudrais stocker les variables qui concernent la synchronisation dans apc.

Re: Mémoire partagée ?

par stopher » 04 juin 2010, 16:59

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 ?

par sebcap26 » 04 juin 2010, 16:12

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 #-o . 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 ?

par sebcap26 » 02 juin 2010, 17:11

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) :P et j'aurais tout ce qu'il faut (théoriquement, après faudra passer à la pratique :x ).

Re: Mémoire partagée ?

par stealth35 » 02 juin 2010, 17:03

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 ?

par sebcap26 » 02 juin 2010, 16:51

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 ?

par stealth35 » 02 juin 2010, 16:33

ouai APC ou avec memcache :wink:

Mémoire partagée ?

par sebcap26 » 02 juin 2010, 14:24

Bonjour,

Une simple question que me pose depuis un moment, et a laquelle mon ami Google ne répond pas assez précisément :D .

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 :wink:

Merci d'avance.