J'ai un objet complexe que je crée dans un script PHP. Je cherche un moyen de stocker cet objet, de sorte que les demandes suivantes ne devaient pas la recréer, ni passer du temps à le non-désigner et à la reconstruire. Utiliser Xdebug, je trouve que je passe la moitié de l'ensemble de la requête en construisant cet objet. Même lorsque je stocke l'objet explicitement dans APC (ou MemCache), le temps de le désériorialiser et de charger toutes les classes prend presque tant que la création de l'objet en premier lieu. p>
Je ne sais pas s'il est possible de stocker et de charger ultérieurement un objet "compilé" dans PHP. Est-ce possible? Y a-t-il d'autres solutions? P>
Je ne suis pas sûr que cela soit possible, mais je pensais que je devrais demander à la communauté. p>
Edit: L'objet est un arbre binaire et utilisé comme arbre de décision. Le code est essentiellement une API qui est nécessaire pour renvoyer rapidement une réponse de l'arbre. Tout cela a besoin de jouer à un taux de plus en plus élevé, donc j'essaie de maximiser la performance dans la mesure du possible. p>
9 Réponses :
Non, il n'est pas possible de stocker un objet PHP sous une forme non sérialisée; Au moins, pas avec les solutions de mise en cache suivantes (j'ai essayé celles-ci; ne savez pas l'autre qui pourrait exister) em>: p>
Si cela prend beaucoup de temps pour désigneriser votre objet, il est peut-être vraiment Par exemple, Meybe Vous avez un grand groupe de code HTML dans cet objet? Si oui, pourrait-elle être stockée dans une autre entrée de cache?
ou peut-être que cela ne prend pas beaucoup de temps pour le créer à partir de zéro? Dans ce cas, la mise en cache est-elle vraiment nécessaire? P>
(sérialisation est "transformant des données sur une chaîne; donc, si vous travaillez déjà avec une chaîne, vous n'avez pas besoin de le réémarifier pour le stocker dans le cache) em> p>
BTW, WordPress ne cache pas par défaut rien. Donc, oui, vous pouvez mettre en cache dans la base de données.
L'objet ne stocke pas de HTML ou d'informations supplémentaires. La question indique qu'il est très coûteux de créer à partir de zéro et que tout le but de "mettre en cache" l'objet.
Autant que je sache, il n'est pas possible de cacher des objets dans PHP sans sérialiser. En général, cependant, les mécanismes de mise en cache (APC, MemCache, etc.) tentent vraiment d'éliminer la (les) connexion (s) DB étant plus qu'améliorer les performances (et diminuer ainsi la tension globale de la DB). Ceci est définitivement em> comment MemCache, et al sont employés en ce qui concerne Drupal. En d'autres termes, les mécanismes de mise en cache devraient vous permettre de faire échelle, bien qu'ils puissent ne pas améliorer particulièrement les performances.
La mise en œuvre d'un mécanisme de mise en cache devrait vous permettre de réduire plus facilement l'extérieur, même si la performance par machine n'est pas meilleure qu'auparavant pour une seule connexion. À un certain seuil, la performance de la DB se dégradera fortement et les mécanismes de mise en cache devraient aider à atténuer ce problème. P>
Peut-être que la solution est de ne pas construire un objet unique, massif et coûteux. p>
Étant donné qu'une application PHP commence à peu près une ardoise propre sur chaque charge de page, une solution dépend d'un seul objet géant est une solution médiocre à la langue. Puisque vous n'entrez pas beaucoup de détails sur ce que votre objet est & ce que cela fait, je ne peux pas être certain, mais je soupçonnerais que vous n'avez pas vraiment besoin de tout ce que l'objet fait sur chaque page de page. Si tel est le cas, vous pourriez envisager sérieusement de le diviser dans un certain nombre de classes plus petites et plus simples que vous pouvez instancier au besoin. P>
regarde dans le Extension IGBinary PHP. Il s'agit d'une chute de remplacement pour Serialize et non désérioriate et cela pourrait répondre à vos besoins. p>
Il stocke des objets dans un format binaire au lieu d'une chaîne qui diminue l'utilisation de la mémoire et diminue également le temps nécessaire pour sérialiser et insériter des objets. P>
Bien que cela passe par le processus de non-observation d'un objet, le format binaire peut augmenter la performance suffisamment pour rendre ce processus raisonnable pour une utilisation dans votre application. P>
De ma lecture sur igbinary, il ne semble pas que cela augmenterait nécessairement la performance. Je ne vois aucune documentation indiquant une augmentation de la vitesse, seule une diminution de la taille des objets sérialisés.
Dans ce cas, une meilleure option serait d'écrire votre propre serveur. p>
Il est facilement faisable dans PHP - et vous avez déjà le code - mais PHP peut ne pas être le premier choix de la plupart lorsqu'il s'agit de rédiger des serveurs. P>
IGBINAIRE est une extension utile qui peut vous aider à atteindre un processus plus rapide Serialize / Non-sériciarisation. Il remplace le mécanisme de sérialisation standard avec un plus intelligent, binaire. Si vous gérez votre propre serveur et que vous pouvez l'installer, cela vaut la peine d'essayer. P>
Si possible sur votre plate-forme, écrivez un démon simple qui charge l'arborescence au démarrage, puis répond aux demandes sur une prise. Votre processus de serveur peut faire une fourchette et répondre aux requêtes sans recréer l'arborescence. Écrire un démon n'est pas trivial, mais très bien documenté (au moins pour c). Vous ne devriez avoir aucune difficulté à traduire cela en PHP à l'aide des extensions PCNTL et POSIX. P>
PHP peut fournir de nombreuses fonctionnalités dynamiques pour divers types de données, ces opérations ne sont pas magiques et les données sont toujours stockées sous forme de types de données natives de base dans ce que l'on appelle un zval qui est techniquement une hache complexe dans l'API de Zend Native. Comme tout autre type de données dans n'importe quelle langue, chaque Zval n'existe que pour une période finie. Pour PHP, cette période est (à max) la période de manipulation d'une demande HTTP. Sous toute situation, pour que ces données durent plus longtemps qu'une seule demande, il doit être converti de l'original Zval en une autre forme de puis stockée d'une manière ou d'une autre (cela inclut des types complexes tels que des objets PHP ainsi que des types de base tels que intens). Cela nécessitera toujours de réinitialiser chaque zval, puis de la conversion des données de la forme stockée dans divers types de fichiers PHP dans la ZVAL. Certains formats de stockage tels que BSON seront plus rapides que les chaînes sérialisées PHP, mais (au moins à l'heure actuelle), cela ne fournira pas une grande partie d'un saut de performance remarquable, car il n'est nulle part près des performances du maintien de la ZVAL d'origine sur plusieurs demandes. Vous devrez toujours sérialiser ces données d'une manière d'une certaine manière, passez à travers l'heure de la stockage, puis de la récupérer, puis de le désexaminer. Il n'y a pas de vraies solutions pour cela pour le moment. P>
Notez que PHP peut être dit avoir trois étendues différentes: le SAPI, qui initie et gère finalement tout l'état dans chaque demande; les extensions, qui sont initiées avant la démarrage de chaque requête; et ensuite la portée du script qui est initiée par chaque demande. Tous les vars PHP sont initiés dans la portée du script, mais sont accessibles à la fois par des extensions et des SAPI. Mais la seule portée qui peut exister au-delà de chaque demande est la SAPI. En d'autres termes, un objet PHP ne peut être maintenu que sur plusieurs demandes au sein de la SAPI (une extension ne peut pas aider avec ce problème à ce moment-là), mais seulement un SAPI personnalisé est capable de maintenir des zvaux sur des demandes. P>
Vous pouvez réécrire votre application à réactphp Qu'est-ce qui crée un serveur Web dans un processus PHP à long terme (juste comme nœud.js ou Web.py). Ensuite, vous pouvez créer votre gros objet une fois (sur le démarrage du serveur) en tant que variable globale et y accéder à des gestionnaires d'événements de demande. P>
Pas que c'est un moyen de le faire "sans" sérialiser. Mais pourrait vouloir examiner les méthodes __sleep () et __wakeup () afin qu'il puisse reconstruire automatiquement la classe. US3.php.net/manual/ EN / ...
@Chasha merci pour cette information. Je ne suis pas sûr que ce soit une solution, mais j'ai définitivement appris quelque chose de nouveau! Merci.
Stocker un objet, par définition, nécessite une sérialisation. Si vous avez vraiment besoin d'un accès rapide et rapide à un grand arbre binaire en mémoire, un script PHP invoqué sur chaque demande n'est tout simplement pas la bonne solution.
Vous ne pouvez pas stocker le grand objet dans APC sans i> sérialiser? php.net/manual/fr/function.apc-store. PHP # 73560
@RCourtana lorsque vous stockez un objet dans APC, une série intrinsèque est appelée. Si vous retournez votre profileur et que vous regardez effectuez ce magasin / récupération d'APC, vous constaterez que vous passez une grande quantité de temps sérialisée.