persistance de l'objet en php
je suis assez nouveau à la programmation web, j'ai principalement utilisé java pour créer des applications de bureau dans le passé.
j'essaie de comprendre comment créer des objets persistants en php. Peut-être que persistent n'est pas le bon mot, Je ne veux pas que l'objet soit unique à chaque client, comme je l'obtiendrais en le sérialisant dans une variable de session. Je veux que l'objet soit créé sur le serveur et que le même objet soit accessible à tout moment. L'objet interrogerait la base de données et stockerait certaines données. De cette façon, chaque chargement de page, le code php obtiendrait ces données du même objet persistant plutôt que d'avoir à interroger la base de données à chaque fois.
j'utilise actuellement le modèle singleton pour la création d'objets parce que ma compréhension initiale était qu'il me permettrait d'accomplir ce que je veux. Une partie de l'objet est un tableau, et quand j'exécute une page php qui ajoute une valeur au tableau, et que j'accède à cette valeur sur la même page, c'est parfait. Cependant quand j'ajoute une valeur à le tableau et ensuite charger une autre page qui accède à la valeur, le tableau est de nouveau vide.
Est-ce possible? Est-ce que j'exagère en pensant que poser tant de questions sur la base de données est mauvais? Il y aura parfois jusqu'à 20 utilisateurs qui demanderont des données au cours d'une seconde, et je me sens ridicule d'interroger la base de données à chaque fois.
Merci
7 réponses
habituellement, vous obtenez votre persistance en utilisant la base de données. Si c'est un goulot d'étranglement, vous commencez à mettre en cache des données, par exemple dans memcached ou peut-être un fichier local avec un sérialisé tableau sur votre serveur web.
PHP n'a pas le concept de persistance comme Java le fait: la JVM permet aux applications Java de persister en mémoire entre les requêtes HTTP; le serveur web bifurque un nouveau processus PHP chaque fois qu'une nouvelle requête HTTP est servie afin que les variables statiques d'un objet ne persistent pas les données pour vous entre les requêtes.
Utiliser une base de données pour stocker les données persistantes. La programmation Web se concentre sur la concurrence, donc vous ne devriez pas vous soucier des requêtes de base de données - 20 une seconde est peu. Si vous atteignez les limites de votre base de données, vous avez les options pour ajouter une couche de cache ou du matériel "scale out" en ajoutant des esclaves en lecture seule.
bien que ce ne soit pas la solution la plus jolie, mais vous pouvez utiliser SESSIONS pour cette question.
class SomeObject{
public function __costructor{
$_SESSION['object'] = serialize($this);
}
}
et sur une autre page, vous pouvez appeler de l'objet, simplement avec:
$object = unserialize($_SESSION['object']);
bien sûr, cette approche semble la plus facile. Il doit venir avec la plus grande précaution:
sachez que les sessions dépendant du trafic de votre serveur ne doivent pas être trop grandes en taille car beaucoup d'utilisateurs demandent simultanément pour chacune de ces sessions. Dimensionner la taille à votre discrétion.
toujours serialize et unserialize des sessions de ne pas le faire va mal.
ce qui navigue sur votre bateau. Faites-le à votre propre analyse attentive. goodluck
la persistance des données dans la programmation Web se fait par l'utilisation de cookies/sessions et la transmission des variables cookie/session à travers les appels de page web. Théoriquement, n'importe quel type de données peut être stocké dans ces variables - mais pour la plupart des buts pratiques, seulement les données les plus importantes (regardez-les plus comme des jetons) nécessaires pour identifier/reconstruire les objets nécessaires (avec ou sans une base de données) sont transférées vers et depuis le serveur et le navigateur.
je vous conseille de bien regarder memcached. Lorsque vous parlez de la charge du serveur et des capacités de performance, une métrique utile est souvent pages/seconde. Si vous avez un serveur dédié et non optimisé mais des choses très intensives en cours, vous pouvez être en mesure de servir seulement 5 pages / seconde. L'utilisation de la mise en cache de données est un excellent moyen d'augmenter que 3 à 10 fois. Cependant, c'est toujours un compromis en ce qui concerne la façon dont les données peuvent être périmées. Vous en aurez vraiment besoin de tester votre site correctement comprendre (quantifier) d'autres facteurs limitant les performances possibles tels que d'autres connexions par page (images, css, etc.), les entrées/sorties de fichiers, d'autres activités de réseau, et enfin, mais non des moindres, les
arrêtez d'utiliser singleton et utilisez l'injection de dépendances.
la meilleure façon est d'utiliser DataMapper (http://www.martinfowler.com/eaaCatalog/dataMapper.html) et l'attacher à un objet au moyen de propriétés dynamiques. Laissez le Data mapper gérer la persistance.
$CS = new CookieStorage();
$SS = new SessionStorage();
$FS = new FileStorage('config/object.db');
$DM = new ObjectDataMapper($FS);
$O = new Object($DM);
$Object->DynamicProperty = 1;
DynamicProperty
persistera automatiquement et sera automatiquement chargé à partir du fichier object.db
. Et la définition de la classe:
class Object
{
public function __construct(MapperInstance $Storage = NULL)
{
$this->setMapper($Storage?: new ObjectDataMapper(new FileStorage('config/object.db')));
}
public function __get($name)
{
$this->_Mapper->getProperty($name);
}
public function __isset($name)
{
$this->_Mapper->isProperty($name);
}
public function __set($name, $value)
{
$this->Mapper->setProperty($name, $value);
}
}
il est possible de stocker des objets dans la session courante. Maintenant, il suffit de créer une classe de base qui est capable de stocker et de recréer l'objet lui-même. Tout objet dérivé sera alors également persistant.
Vous pouvez lire ici : classe de base persistante et exemple
pour autant que je sache, la session est stockée en RAM et devrait donc être plus rapide que la sérialisation des objets sur le disque pour atteindre la persistance.