11
votes

PHP Caching - est-il plus rapide d'enregistrer dans la base de données ou de créer un fichier?

Je cache actuellement des pages de PHP générées de manière dynamique en les sauvant vers une base de données avec un champ d'expiration. Si la page est à nouveau demandée, le programme vérifie une version mise en cache non expirée de la page pour servir et régénère uniquement la page s'il ne peut pas en trouver un.

Cela fonctionne bien - mais cela mettrait-il moins de chargement sur le serveur pour enregistrer les pages en cache sous forme de fichiers à la place à la sauvegarde de la base de données? Je pourrais utiliser une convention de dénomination dans les fichiers pour gérer l'heure d'expiration.

S'il s'agit d'une taxe plus rapide et moins de serveur pour lire / écrire à partir d'un fichier au lieu d'une base de données, je vais passer à cela. Est-ce que quelqu'un sait qui est plus rapide / pratique?


0 commentaires

4 Réponses :


2
votes

Les deux options utilisent le système de fichiers, car (en supposant que vous utilisez MySQL sans tables de mémoire / tas) sont toujours stockés dans des fichiers.

Si vous avez une connexion de base de données active au moment de la demande des données en cache, je vous entamerais avec la base de données.


2 commentaires

Merci! Oui, une connexion serait déjà ouverte lorsque la gestion de la session est également via la base de données et je voudrais juste authentifier l'utilisateur avant d'évaluer si un cache existe. On dirait que je devrais juste le laisser.


La mémoire / le tas ne vous écrira-t-il pas au mur?



0
votes

Voici quelque chose d'intéressant que je n'ai jamais essayé mais j'ai entendu de bonnes choses à propos de. Vous pouvez utiliser API sur la feuille de calcul Google pour agir en tant que base de données via http Demandes. Cela semble (dans la théorie au moins) comme si c'est une résolution idéale à un problème comme celui-ci. Pas une réponse à votre question juste une autre option.


0 commentaires

8
votes

S'il s'agit d'une taxe plus rapide et moins de serveur pour lire / écrire à partir d'un fichier au lieu d'une base de données, je vais passer à cela. Est-ce que quelqu'un sait qui est plus rapide / pratique?

Le plus rapide consiste à utiliser des fichiers statiques, car vous pouvez ensuite émettre le cache sans même démarrer PHP (en utilisant des rédregles). Il ne sera pas à échelle correctement si vous avez plusieurs extrémités avant, cependant.

La meilleure chose à faire est de le stocker en mémoire, en utilisant MEMCACHE Par exemple.

Le moins préférable est d'utiliser SQL. Si vous vous en tenez, au moins votre disque dur est une faveur en utilisant le moteur de stockage de mémoire ou l'équivalent (par exemple une table non dégradée qui vit dans un espace de table stocké sur un disque RAM, si vous utilisez PostgreSQL).


7 commentaires

Merci Denis Il y a de bonnes idées ici - je vais les rechercher.


En suivant, j'ai utilisé Microtime () avant et après les deux alternatives, et le script pourrait créer un fichier, l'écrire et le fermer 75% plus rapidement qu'il n'a fallu pour exécuter l'instruction insertion dans MySQL. C'est dans les millisecondes, mais au pic trafic, cela vous aidera vraiment ... surtout que je connais des connexions mysql ratés lorsque trop d'utilisateurs se présentent immédiatement.


N'oubliez pas de compter le verrouillage du fichier lorsque vous mesurez les performances de l'écriture de fichier. La meilleure façon de les éviter, de mon expérience, est de créer un fichier temporaire, puis de le renommer à son emplacement final. Cela rend un peu plus lentement sur les écrites, mais cela évite les problèmes d'écriture concurrents.


La mise en cache de fichier sur / dev / shm ou autre point de montage RamDrive est également très rapide. Une simple mise en œuvre peut être effectuée en 100 lignes


Serait formidable de voir des statistiques ou des références pour sauvegarder ces points, surtout si une personne doit convaincre une équipe de basculer.


@SIMON: Je suis sûr que vous trouverez de nombreuses statistiques comparant des lectures de mémoire VS FS Lectures VS DB Reads et la lente PHP est comparée à la servant des fichiers HTML statiques. C'est cependant le bon sens, cependant. De la même manière que 1 <1 + 1, Apache seul est plus rapide que Apache + PHP. La lecture des données de la mémoire seule est plus rapide que de mettre des données HD en mémoire + de lire ces données de la mémoire. Et lire à partir du même serveur est également plus rapide que l'identification du serveur à lire de + la lecture à distance.


@SIMON: Un potentiel de Nitpick One pourrait apporter à la réponse, car écrit est de savoir si la portion d'un cache basé sur Memcached à partir de PHP est matériellement plus lente que de sauter PHP pour servir un cache purement basé sur FS. IMHO, la question est discutable dans la pratique. Au moment où vous devez accumuler à plus d'un serveur, vous voudrez quelque chose que vous pouvez changer sans avoir à réinventer la base de données (lorsque vous vous inquiétez des serrures de fichier et de tels), vous pouvez également utiliser quelque chose comme Memcached (ou SQL, ou NOSQL) commencer par. En tant que bonus, il permet de caresser des partiels de manière transparente. Mettez un autre moyen, vous voulez memcached dans la pratique.



1
votes

Il n'y a pas une vraie réponse à votre question, cela dépend vraiment du nombre de requêtes et du cache que la base de données utilise contrairement au temps nécessaire pour analyser un fichier. Beaucoup d'autres facteurs peuvent également avoir lieu.

Cependant, Vous pouvez utiliser des extensions PHP telles que Memcached comme le suggéré Denis. Cela fonctionne encore mieux en combinaison avec une base de données en utilisant un cadre comme doctrine . Cela facilite la gestion de vos données à l'aide de la base de données. Et servir les données réelles en production par les résultats de la requête en cache.


0 commentaires