Cette solution pour les caches et les cookies va-t-elle me causer des ennuis?

23

J'ai trouvé une solution provisoire pour un problème pas exactement commun, mais loin d'être sans précédent avec l'interaction des solutions de mise en cache WP populaires avec les cookies, dans ce cas les cookies de commentaire WP standard. Ma solution porte également sur l'exception des "utilisateurs connus" rarement bien définie pour la diffusion de fichiers en cache. Que ce soit utilisable ou non, je pense que l'expliquer et peut-être apprendre pourquoi c'est une mauvaise idée pourrait être généralement instructif.

J'ai testé ma méthode avec WP Super Cache, W3 Total Cache et Comet Cache. Celui que j'ai analysé en détail en étudiant ce problème était WP Super Cache ("WPSC" ci-après), donc je vais l'utiliser comme mon exemple principal.

CONTEXTE

Lorsqu'un fil de commentaires standard WP est défini pour permettre aux visiteurs de commenter, des cookies de commentaires sont définis pour tout commentateur qui n'est pas un utilisateur enregistré et connecté, avec des privilèges de commentaires réels soumis à des vérifications supplémentaires. Dans ce que je pense être la configuration la plus courante, un commentateur doit fournir uniquement un nom et une adresse e-mail. Ceux-ci sont généralement stockés dans deux cookies de navigateur comment_author_ . COOKIEHASHet comment_author_email_ . COOKIEHASH. COOKIEHASHest défini en fonction des options utilisateur.

S'il est configuré pour fournir des fichiers fraîchement générés à des «utilisateurs connus», WPSC détermine s'il faut ou non servir un fichier mis en cache sur la base de plusieurs vérifications: les utilisateurs connectés obtiennent de nouveaux fichiers, tout comme les visiteurs «qui peuvent commenter». Ces derniers sont principalement identifiés par la présence dans leurs navigateurs de comment_author_cookies qui ne sont pas spécifiquement ou uniquement identifiés pour l'utilisateur particulier par le COOKIEHASH(généralement mais pas toujours une version encodée MD5 du "siteurl" enregistrée dans les options du site).

Ce qui semble être l'élément clé du code WPSC, à partir de wp-cache-phase1.php LL371-383, utilise un modèle RegEx pour obtenir une chaîne, en parcourant les cookies:

$regex = "/^wp-postpass|^comment_author_";
if ( defined( 'LOGGED_IN_COOKIE' ) )
    $regex .= "|^" . preg_quote( constant( 'LOGGED_IN_COOKIE' ) );
else
    $regex .= "|^wordpress_logged_in_";
$regex .= "/";
while ($key = key($_COOKIE)) {
    if ( preg_match( $regex, $key ) ) {
        wp_cache_debug( "wp_cache_get_cookies_values: $regex Cookie detected: $key", 5 );
        $string .= $_COOKIE[ $key ] . ",";
    }
    next($_COOKIE);
}

Maintenant, si je travaillais strictement en PHP, je pourrais reproduire ou accrocher les fonctions de base de WP, et obtenir la valeur normale comment_author_ . COOKIEHASHdéfinie par le modèle de commentaire, mais je travaille en jQuery en utilisant le plug-in jQuery Cookie. Cependant, comme vous pouvez le voir si vous regardez le RegEx, la fonction WPSC ne se soucie pas du COOKIEHASH: elle est satisfaite si elle rencontre comment_author_.

MA SOLUTION TENTATIVE

$.cookie( 'comment_author_proxyhash', 'proxy_author', { path: '/' } );

Pour ceux qui ne connaissent pas le cookie jQuery: ce qui précède définit un cookie de session simple avec clé = comment_author_proxyhashet valeur = proxy_author, bon pour l'ensemble du site. (De plus, pour ceux qui utilisent jQuery Cookie et WP, en plus de pré-substituer le jQuery familier $au WP jQuery, j'ai également déjà défini $.cookie.raw = true;.)

J'ai ajouté la ligne à mon script jQuery, et le tour est joué! , WPSC, W3 Total Cache et Comet Cache agissent tous comme je le souhaite. Après avoir utilisé le script et rechargé, j'obtiens de nouvelles pages. S'il m'arrive de placer un vrai commentaire, la normale comment_author_et les comment_author_email_cookies sont définis, et il ne semble pas y avoir de problème de coexistence.

Un défaut serait peut-être que le cookie "proxyhash" voyagera avec l'utilisateur tant qu'il ou elle gardera la session ouverte, mais cela ne me semble pas être un problème majeur - ni même un avertissement. Je n'ai certainement jamais entendu parler de quelqu'un se plaindre d'une telle chose se produisant avec l'un des cookies habituels.

Mais peut-être qu'il me manque quelque chose, et que je suis sur le point de découvrir beaucoup de choses à mon malheur, peut-être aussi à mon édification. Ou peut-être qu'il existe un moyen relativement simple de meilleures pratiques pour répliquer le COOKIEHASHdans jQuery, couvrant également des cas d'utilisation alternatifs ... ou pour obtenir le même effet final par d'autres moyens - d'autres façons de tromper les plug-ins de mise en cache pour traiter le visiteur en tant que commentateur ...

Sinon, y a-t-il une bonne raison de NE PAS pousser ceci ou quelque chose de proche vers l'univers dans un plug-in?

CK MacLeod
la source
3
Les accessoires pour une question bien documentée et bien documentée. Cependant, je pense que la nature de la question pourrait ouvrir cela à plus d'une discussion plutôt qu'à une réponse définitive (hors sujet: principalement basée sur l'opinion). FWIW à mon avis, je ne vois rien de mal ici - en fin de compte, vous définissez simplement un cookie générique unique sans données personnelles.
TheDeadMedic
Merci beaucoup pour la contribution. Je serais reconnaissant pour une telle discussion, et je marquerais comme de bonnes réponses toutes celles qui a) ont signalé un problème avec cette méthode des «cookies génériques», b) ont fourni des moyens alternatifs pour obtenir le même effet, ou c) ont fourni des informations utiles aperçu des questions techniques sous-jacentes relatives aux «utilisateurs connus».
CK MacLeod
Juste pour noter, vous pouvez utiliser wp_localize_scriptpour passer le hachage de cookie à votre Javascript afin que vous puissiez utiliser le cookie "natif" au lieu du proxyhash. Sinon, c'est un problème très intéressant et votre solution semble solide, bien que les cookies + le cache soient toujours si complexes qu'il est difficile de dire si c'est "la bonne" solution ou s'il manque quelque chose. Grande recherche!
phatskat
Question intéressante - je ne peux pas penser à quoi que ce soit qui pourrait vous causer des ennuis, mais puis-je vous demander pourquoi vous voulez contourner le cache de cette façon? Donner aux utilisateurs cette capacité défait en quelque sorte le but d'avoir le cache de page complète pour commencer. De plus, un cookie supplémentaire ajoute à la taille de la demande (quoique de façon minimale), lorsque le même résultat peut être obtenu avec des configurations de cache communes en ajoutant simplement tous les paramètres de requête à l'URL, par exemple mysite.com?a. Juste mon 0,02 $ ...
ssnepenthe
ssnepenthe: J'aurais peut-être dû expliquer: Un plugin que je développais quand j'ai écrit la question - wordpress.org/plugins/commenter-ignore-button - utilise jQuery pour permettre aux visiteurs de mettre les commentateurs sélectionnés "sur ignorer". L'action initiale applique une mise en forme CSS au fil de commentaire, puis s'appuie sur un cookie pour stocker la désignation et sa présence pour dupliquer l'effet (via PHP) sur les actualisations suivantes jusqu'à l'expiration du cookie. Dans une version en cache de la page, l'effet ne serait pas enregistré. Donc, oui, c'est une forme de contournement du cache localisé intentionnel.
CK MacLeod

Réponses:

1

Votre solution avec le cookie comment_author_proxyhash fonctionnera bien sûr techniquement - tous les plugins de mise en cache que je connais n'analysent pas la valeur de hachage et arrêteront simplement la livraison du contenu mis en cache en fonction de la présence du cookie comment_author_ *.

Le problème ici est que la fonctionnalité de mise en cache des pages est quelque chose dont les sites Web ont vraiment besoin et souvent la mise en cache des pages est configurée exactement parce que les performances WordPress nues ne sont pas suffisantes et peuvent même planter le serveur aux heures de pointe. Cela dépend de la nature du contenu du site Web, mais les propriétaires de sites ne sont parfois tout simplement pas en mesure de payer le matériel nécessaire pour tout gérer via le code PHP / WP. En d'autres termes, autant que possible, le trafic doit être servi à partir du cache de pages. De la pratique, je peux dire que nous devons souvent identifier et désactiver les plugins faisant des exceptions de cache.

Bien sûr, ce n'est pas toujours possible, mais essayez de travailler avec la page en cache autant que possible. Par exemple, vous pouvez masquer des divbalises avec des commentaires que vous souhaitez ignorer via javascript ou le bloc de commentaires entier ajax-ify.

Dans tous les cas, vous n'avez pas besoin de marquer le visiteur comme un commentateur, mais arrêtez la mise en cache pour vos raisons de logique personnalisée. Il est donc préférable d'utiliser un cookie unique et d'en faire un signal d'exception de cache. W3 Total Cache a l'option "Rejeter les cookies" pour cela, mais pas d'autres plugins de votre liste, vous aurez donc besoin d'un hack comme celui que vous avez suggéré.

WowPress.host
la source
Merci! Vous soulevez un certain nombre de problèmes valides, mais je dirai que ce que ce code fait, essentiellement, traite tout visiteur qui participe suffisamment aux fils de commentaires pour mettre quelqu'un "sur ignorer" ou "muet" comme un "utilisateur connu / commentateur. " Si un site ne peut pas gérer une telle participation, il ne peut probablement pas non plus gérer un modèle de commentaire WordPress standard (et une communauté de commentaires)!
CK MacLeod
Pensez que vous êtes ici, bien que vous ne puissiez pas savoir avec certitude comment vos utilisateurs l'utilisent. De nombreux sites Web à fort trafic déchargent le traitement de leurs commentaires sur des demandes distinctes ou même sur un service tiers exactement dans le but d'afficher le contenu des articles rapidement et paresseusement, de charger les commentaires dynamiques par la suite. Prenez-le comme une idée hors sujet pour peut-être d'autres versions de votre plugin :)
WowPress.host