2009-05-25 9 views
11

Je suis nouveau sur php, mais dans d'autres technologies Web, vous pouvez partager des objets entre des instances de page. Par exemple, dans les pages Java jsp, vous avez facilement une classe qui existe en tant que classe statique pour l'ensemble de l'instance de serveur. Comment faire cela en php?Existe-t-il un moyen de partager des objets entre les pages php?

Je ne me réfère pas aux variables de sessions (du moins je ne le pense pas). C'est plus dans le but de la mise en commun des ressources (peut-être un socket à partager, ou des connexions de base de données, etc.). Une classe entière doit donc être partagée entre les charges suivantes, pas seulement certaines variables primitives que je peux stocker dans la session.

J'ai également étudié les classes php singleton, mais je crois que cette classe n'est partagée que sur la même page et non sur les pages. Pour clarifier les choses, je cherche quelque chose qui peut m'aider à partager, par exemple, une socket connectée à un serveur pour une page connectSocket.php de sorte que tous les utilisateurs qui chargent cette page utilisent la même socket et n'ouvre pas un nouveau.

Répondre

15

Ceci est une réponse un peu difficile, et peut ne pas être exactement ce que vous cherchez.

PHP est construit sur une architecture 'shared-nothing'. Si vous avez besoin d'un type d'état dans votre application, vous devez le faire par d'autres moyens.

D'abord je recommanderais de regarder dans le noyau du problème .. en avez-vous vraiment besoin? Si vous supposez que l'application PHP pourrait mourir (et perdre l'état) est-il acceptable de perdre les données?

Si vous devez maintenir l'état, même après la mort de l'application ou autrement, vous devriez supposer que le meilleur endroit pour mettre les données est en MySQL. PHP est conçu comme une couche mince autour de votre logique métier, donc je peux fortement le recommander.

Si vous ne vous souciez pas de perdre les données après un redémarrage, le problème que vous recherchez est probablement la mise en cache. Je recommande de regarder dans memcached ou si vous êtes sur une seule machine, apc. APC fonctionnera certainement pour vous avec Apache sur une seule machine, mais vous devrez toujours coder votre application en supposant que vous pourriez perdre les données. Si vous craignez que votre banque de données sous-jacente (MySQL) soit trop lente, mais que vous ayez besoin de conserver les données après un redémarrage, vous devriez envisager une combinaison de ces deux systèmes. Vous pouvez toujours pousser et tirer vos données à partir du cache, mais seulement quand les mises à jour l'envoient à Mysql.

Si les données sont purement utilisateur ou liées à une session, vous voudrez probablement simplement regarder dans le système de sessions.

J'ai personnellement développé une application multi-locataire assez importante, et bien que ce soit une application assez complexe, je n'ai jamais eu besoin de l'état réel que vous recherchez.

Mise à jour: Désolé, je n'ai pas lu votre note sur le partage d'une socket. Vous aurez besoin d'un démon séparé pour gérer cela, peut-être que si vous pouvez expliquer votre problème plus loin, il pourrait y avoir d'autres approches. Quel type de socket est-ce?

1

La plupart des bibliothèques de bases de données PHP utilisent déjà le regroupement de connexions. Vous appelez, par exemple, pg_connect comme si vous demandiez une nouvelle connexion, mais si la chaîne de connexion est la même que celle qui existe déjà, vous obtiendrez la connexion établie à la place. Si vous ne tenez compte que de la mise en pool de l'accès à la base de données, vous pouvez simplement confirmer qu'elle existe dans la bibliothèque db que vous utilisez.

+1

Bien que votre réponse soit correcte, il est souvent déconseillé d'utiliser ces connexions persistantes. Créer de nouvelles connexions est souvent très bon marché, et cela signifie que vous n'aurez pas à les garder tous longtemps. En règle générale, je ne me connecte à un db que lorsque je fais la première requête, et je m'en débarrasse dès que possible. Les bases de données sont difficiles à mettre à l'échelle, PHP est beaucoup plus facile. – Evert

3

Il s'agit probablement d'une réponse partielle, mais vous pouvez enregistrer une instance d'une classe dans une variable de session et y accéder à un autre moment.

+3

Cela ne fonctionnera malheureusement pas avec les sockets ouverts. – Evert

12

Il existe une différence fondamentale entre Java interprété par le Web et les langages interprétés Web tels que PHP et Perl. En Java, votre serveur Web aura un environnement d'exploitation qui maintient l'état (c'est-à-dire Tomcat). Avec les langages interprétés, une requête adressée à votre serveur Web génère généralement un nouveau thread de serveur Web, qui à son tour charge un nouvel environnement d'exploitation pour ce thread, dans ce cas, l'environnement PHP. Par conséquent, en PHP, il n'y a pas de concept d'instances de pages. Chaque demande au serveur Web est un nouveau départ. Toutes les classes sont rechargées, donc il n'y a pas de concept de partage de classe, pas plus qu'il n'y a de concept de mise en commun des ressources, à moins d'être implémenté en externe.

Le partage des sockets entre les requêtes Web n'est donc pas vraiment possible.

+0

Pas vrai, qu'en est-il de memcache? – Pacerier

0

Une autre solution horrible peut être de charger les données de l'objet dans n'importe quelle variable $ _SESSION et de l'utiliser ensuite dans l'objet de l'autre page. En fait, c'est la solution que je vais suivre dans mon projet, jusqu'à ce que j'en obtienne un meilleur.

Cordialement!