2017-08-11 1 views
1

Je tente de mettre en cache une page qui exécute un tableau de bord affichant des informations extraites d'une base de données Salesforce via des API avec PHP, sur un serveur Apache.Cache page dynamique avec Varnish

La dynamique est le suivant,

clients-> apache/php/sqlqueries-> Salesforce

Le tableau de bord se compose dans les tableaux qui Charger à nouveau les pages PHP contenant l'objet que les requêtes Salesforce.

function refreshtable1() { 
    $('#table1').load('/tables/table1.php', function() { 
     setTimeout(refreshtable1, 60000); 
    }); 
} 

Pour que les requêtes à cela arrive, le table1.php comprend un objet de requête et d'un module d'extension API Salesforce qui vous connecter à Salesforce sur chaque reload et les requêtes. Le login renvoie un identifiant de session qui est placé dans la session et réutilisé jusqu'à son expiration.

Maintenant, il ya 30 utilisateurs, 5 tables de 30 colonnes chacune, une pour chaque utilisateur qui affiche des informations afin de pouvoir les partager.

2 tables sont rafraîchies toutes les 30 minutes et 3 toutes les minutes.

Si vous faites les numéros qui pourraient aller jusqu'à 1 million de requêtes tous les jours que ces gars continuent à laisser leurs navigateurs. Il y a un gestionnaire de session qui tue la session après un certain temps, mais s'il rafraichit la chose avant de rentrer à la maison, il dure encore 9 heures.

L'administrateur Salesforce ne m'aime pas beaucoup à ce stade. Donc, j'essaie de mettre une sorte de système ou de cache à vide. Aussi pour éviter d'avoir un db local où je copie tout et la lecture des requêtes à remplir sont 3 par minute. C'est pourquoi j'ai décidé de donner une chance au cache Varnish. Le problème est que je vois qu'il ne fournit pas le contenu des tables aux clients depuis le cache, il semble que la partie HTML soit restituée mais le contenu de la table continue d'être extrait du serveur backend sur lequel le site du tableau de bord tourne.

~# varnishstat -1 | grep "cache_hit \|cache_miss \|cache_hitpass" 
MAIN.cache_hit    44   0.00 Cache hits 
MAIN.cache_hitpass    0   0.00 Cache hits for pass. 
MAIN.cache_miss   16436   0.59 Cache misses 

Je ne sais pas si c'est encore possible, donc j'apprécierais tout conseil.

C'est le Varnish conf,

sub vcl_recv { 

    if (!(req.http.host == "test.local")) { 
     unset req.http.Cookie; 
    } 

} 

Je suis juste essayer essentiellement de mettre en cache tous les cookies pour garder 'PHPSESSID'. J'ai également essayé de mettre en cache POST et GET juste au cas où mais cela n'a pas vraiment fait l'affaire non plus.

if (!(req.method ~ "GET") && !(req.method ~ "POST")) { 
    return (pass); 
} 

Toutes les idées sur la façon d'obtenir Varnish pour travailler sur ce scénario ou sur la façon de réduire l'interrogation avec une autre méthode?

Cheers.

+0

Résolvez le problème à la source. Mettre en cache les réponses de Salesforce par exemple. avec redis ou memcache. S'il vous plaît lire https://stackoverflow.com/questions/4273734/how-to-make-varnish-ignore-not-delete-cookies si vous voulez continuer avec Varnish, mais cela peut avoir des conséquences assez désagréables. –

+0

n'ont pas accès au backend et les administrateurs de salesforce ne le feront pas, c'est le problème, donc il faut trouver une solution intermédiaire ou frontale – eLGusto

+0

Ensuite, vous n'avez pas de chance. Si vous devez conserver PHPSESSID afin que les réponses ne soient pas partagées entre les utilisateurs, il n'y a rien à mettre en cache. Même si vous mettez en cache les réponses par utilisateur, cela annule l'objectif d'actualisation des tables à la première place puisque vous allez renvoyer des données obsolètes. Vous pouvez obtenir la même chose en réduisant le taux de rafraîchissement en javascript. –

Répondre

-1

Les gens sur les commentaires ont raison de ne pas utiliser Varnish pour cela, mais si vous n'avez pas le choix, allez-y. Je l'ai utilisé comme solution de contournement des problèmes d'organisation aussi.

Vous pouvez modifier la fonction vcl_hash pour utiliser les cookies comme partie de la clé de cache, regardez-la here. Par exemple:

sub vcl_hash { 
    hash_data(req.http.cookie); 
} 

Vous devez prêter attention à hash colisions. Je crois que vous pouvez l'éviter en supprimant tous les cookies qui ne sont pas ceux que vous voulez utiliser comme clé. Il y a un exemple de cela dans ce link.

Bonne chance.