6
votes

Cache de page dans PHP qui gère la concurrence?

J'ai lu des réponses précédentes ici sur la mise en cache dans PHP et les articles qu'ils lienaient. J'ai vérifié l'OFT-Recommandé Cache_light , QuickCache et WordPress Super Cache. (Désolé - apparemment, je suis autorisé à hyperlien une seule fois.)

Non aucun traite des problèmes de concurrence, ou rien n'appelle explicitement qu'ils font dans leur documentation.

Quelqu'un peut-il me dire dans la direction d'un cache de page PHP qui gère la concurrence?

Ceci est sur un hôte partagé, les caches MEMCACHACHE et OPCODE sont malheureusement pas une option. Je n'utilise pas de moteur de modèles et je voudrais éviter de prendre une dépendance sur une. L'approche de WP Super Cache est préférable - c'est-à-dire stocker des fichiers statiques sous wwwroot pour laisser Apache les servir - mais pas une exigence.

Merci!

P.s. Des exemples de choses qui doivent être traitées automatiquement:

  1. Apache / Le cache PHP est au milieu de la lecture d'un fichier mis en cache. Le fichier mis en cache devient obsolète et la suppression est tentée.
  2. Un fichier mis en cache a été supprimé car il était obsolète. Une demande de ce fichier est entrée et le fichier est en cours de recréer. Une autre demande pour le fichier est disponible pendant cela.

0 commentaires

6 Réponses :


0
votes
  1. Sous Linux, généralement, le fichier restera "ouvert" à lire, même s'il est "supprimé" jusqu'à ce que le processus ferme le fichier. C'est quelque chose intégré au système et peut parfois causer d'énormes divergences dans des tailles d'utilisation des disques (supprimant un fichier 3G pendant qu'il est toujours "ouvert" signifierait toujours alloué sur le disque comme utilisé jusqu'à ce que le processus ferme jusqu'à la fermeture du processus) - I ' m ne sachant pas si la même chose est vraie sous Linux.
  2. En supposant un système de fichiers de journaux (la plupart des systèmes de fichiers Linux et NTFS) - alors le fichier ne doit pas être vu comme "créé" tant que le processus ferme le fichier. Cela devrait apparaître comme un fichier non existant!

2 commentaires

Modifier Merci, cela est informatif. Le "Que se passe-t-il?" questions dans la P.S. étaient simplement rhétorical. J'ai mis à jour la question à la réfléchir.


ACK! J'ai oublié que j'ai écrit "Mise en œuvre / Recherche" dans le titre de la question. J'ai supprimé "la mise en œuvre". Si cela vient à cela, je vais ouvrir une autre question. Merci encore.



0
votes

Assumer un système de fichiers de journaux (la plupart des systèmes de fichiers Linux et NTFS) - Ensuite, le fichier ne doit pas être considéré comme «créé» jusqu'à ce que le processus ferme le fichier. Cela devrait apparaître comme un fichier non existant!

Nope, il est visible dès sa création, vous devez le verrouiller. Renommer est atomique cependant. Donc, vous pourriez ouvrir (), écrire (), fermer (), renommer (), mais cela n'empêchera pas le même élément de cache recréé deux fois en même temps.

Un fichier mis en cache a été supprimé car il était obsolète. Une demande de ce fichier est entrée et le fichier est en cours de recréer. Une autre demande pour le fichier est disponible pendant cela.

S'il n'est pas verrouillé, un fichier demi-complet sera servi ou deux processus essaieront de régénérer le même fichier en même temps, donnant des résultats «intéressants».


0 commentaires

2
votes

Il semble que la poire :: Cache_Lite a une sorte de sécurité pour traiter des problèmes de concurrence.
Si vous regardez le manuel de constructeur cache_lite :: cache_lite , vous avez ces options:

fillocking Activer / désactiver la filocage. Peut éviter la corruption cache sous mal circonstances.

WriteControl Activer / désactiver le contrôle d'écriture. Activer le contrôle d'écriture sera légèrement lent l'écriture de cache mais pas la cache en train de lire. La commande d'écriture peut détecter certains fichiers de cache corrompus mais peut-être que ce n'est pas un contrôle parfait.

readcontrol Activer / désactiver le contrôle de lecture. Si activé, une clé de contrôle est incorporée dans Le fichier de cache et cette clé est comparé avec celui calculé après le Lecture

readcontroltype Type de contrôle de lecture (uniquement si le contrôle de lecture est activé). Doit être 'MD5' (pour un contrôle de hachage MD5 (meilleur mais le plus lent)), 'CRC32' (pour un hachage de CRC32 contrôle (légèrement moins sûr mais plus rapide)) ou 'strylen' (pour une longueur seul test (le plus rapide))

Lequel utiliser est toujours à vous et dépendra de quel type de performance vous êtes prêt à être sacrifié - et le risque d'accès à la concurrence qui existe probablement dans votre application.


Vous voudrez peut-être aussi jeter un coup d'œil à zend_cache_fronttend_output , pour mettre en cache une page, en utilisant quelque chose comme zend_cache_backend_file comme backend.

Celui-là semble supporter une sorte de sécurité aussi - le même kinf de choses que cache_lite vous a déjà donné (donc je ne copierai pas-coller une seconde fois) < / em>


En tant que SidENOTE, si votre site Web s'exécute sur un hôte partagé, je suppose qu'il n'a pas que beaucoup d'utilisateurs ? De sorte que les risques d'accès simultané ne sont probablement pas si élevés, sont-ils?

Quoi qu'il en soit, je ne rechercherais probablement pas plus loin que ce que ces cadres de remorquage proposent: il est déjà probablement plus que suffisant pour répondre à vos besoins: -)

(je n'ai jamais vu aucun mécanisme de mise en cache "plus sûr" que ce qui vous permet de faire ... et je n'ai jamais rencontré un problème de concurrence catastrophique de ce type encore ... dans 3 ans de php-développement)


Quoi qu'il en soit: amusez-vous!


1 commentaires

PEAR CACHE_LIGHT ne gère pas toutes les problèmes de concurrence - par exemple, la lecture du cache lorsqu'un fichier est verrouillé pour l'écriture. (Ou peut-être que je devrais dire: les problèmes de concurrence sont pancétaires au code de la demande.) C'est un non-aller pour moi. Vous avez demandé: "... Les risques d'accès simultané ne sont donc probablement pas si élevés, n'est-ce pas?" Bien que les visites suivent évidemment une tendance plus importante (par exemple plus à la mi-journée, plus sur mercredi) Les demandes de pages de deuxième au second sont aléatoires. La concurrence est un problème pour tous les sites Web.



0
votes

Vous pouvez mettre en cache des pages dans la base de données, créez simplement une table «Nom, Valeur» et stockez des pages en cache dessus.


1 commentaires

Merci. Bien qu'une base de données évite les problèmes de corruption possible avec des fichiers (en raison du "C" dans l'acide), il existe toujours d'autres choses à gérer correctement, par exemple. le "i" dans l'acide. Ce n'est pas une question de "créer une table de dB".



1
votes

Je serais tenté de modifier l'un des caches existants. Le cache de Zend Framework devrait pouvoir faire l'affaire. Sinon, je le changerais.

Vous pouvez créer une stratégie de verrouillage vraiment primitive. La base de données pourrait être utilisée pour suivre tous les éléments mis en cache, permettre le verrouillage de la mise à jour, permettre aux gens d'attendre que la mise à jour de quelqu'un d'autre se termine, ...

qui gérerait vos problèmes d'acide. Vous pouvez définir la mise à jour de quelqu'un d'autre à une très courte période, ou éventuellement, ignorez-la tout à fait le cache pour ce voyage aller-retour en fonction de votre charge / capacité du serveur et du coût de la production du contenu mis en cache.

jacob


0 commentaires

1
votes

Création de ressources simultanée AKA Cache Slamming / FileD Cache peut être un problème grave sur les sites Web occupés. C'est pourquoi j'ai créé la bibliothèque de cache qui synchronisent les processus / threads de lecture / écriture.

Il a une structure élégante et claire: interfaces -> adaptateurs -> classes pour une extension facile. À la page GitHub, je explique en détail Quel est le problème avec la claquage et la façon dont la bibliothèque le résout.

Vérifiez-le ici: https://github.com/tztztztz/php-no-slam-cachele_/a >


0 commentaires