Aller au contenu

Sujets conseillés

Posté

Bonjour le HUB,

J'ai un ptit problème avec un site et l'activation d'un système de cache Quickcache. J'essaye en vain de le mettre en place sur un wordpress qui est hébergé sur un serveur dédié ovh mais je rencontre un problème que je n'arrive pas à solutionner.

Lorsque je navigue sur le site avec firefox le site rame et me propose de temps en temps des fichiers à télécharger quand le serveur met trop de temps pour répondre :( .

Alors que sur IE tous roule à merveille, les pages se charge à très grandes vitesses et sans jamais me proposer de fichier.

On m'a dit que ca pourrait venir de la configuration du gzip sur les dédiés d'ovh mais je en vois pas trop comment faire et quel ligne de code modifier dans le php ini.

Je vous remercie d'avance pour votre aide

Cordialement,

Posté

Re,

Toujours personne qui connait Ce système de cache ? Et aurais eu ce genre de beug... Il semblerait que ca soit juste spécifique au serveur dédié. Je viens de tester sur un mutualisé le plugin fonctionne parfaitement

  • 2 semaines plus tard...
Posté

Hello,

j'ai bien une idée sur la cause du problème mais il me faudrait plus d'infos : est ce que si tu désactives le KeepAlive dans la configuration d'Apache le problème est toujours présent ?

Posté

Hello Kioob,

Tout d'abord merci pour ton intervention. Je vais essayer avec mes maigres connaissances de l'administration de Apache de désactiver Keepalive.

Pour info, avec un pote on a réussit à bien diagnostiquer le problème. En faite le bug n'apparait que lorsqu'on navigue sur mozilla (3.5) et que l'on a Windows XP + Kaspersky comme anti virus :(

Je vais essayer ta technique et te tiendrais au courant si ca corrige le problème.

Un grand merci kioob A++

Posté

Kaspersky, ce qui confirmerait donc le cas auquel je pensais : un "bug" de PHP connu de longue date qui n'affecte que les scripts gérant le cache HTTP correctement.

Il me semblait pourtant que QuickCache avait corrigé ça de son coté.

La solution serait donc d'ajouter dans QuickCache un "ini_set('zlib.output_compression', false);" après chaque entête 304 renvoyé (à placer juste après l'appel à header(), avant l'appel à exit()).

Posté

ça se passe donc dans le fichier quickcache_main.php, à la ligne 266 tu as ce pavé :

    // Not modified!

if(stristr($_SERVER["SERVER_SOFTWARE"], "microsoft")) {

// IIS has already sent a HTTP/1.1 200 by this stage for

// some strange reason

header("Status: 304 Not Modified");

} else {

if ( $QUICKCACHE_ISCGI ) {

header('Status: 304 Not Modified');

} else {

header('HTTP/1.0 304');

}

}

Il suffit donc d'ajouter juste après (ou juste avant) :

    ini_set('zlib.output_compression', false);

Et je t'invite vivement à faire un rapport de bug sur le site de QuickCache afin que d'autres ne rencontrent plus ce problème.

Posté

Kioob,

Comment te dire, un grand merci d'abord. C'était bien cela, le bug n'apparait plus et le systeme quickcache fonctionne à merveille meme sur firefox.

Je te remercie sincèrement et énormément pour ton aide sans ton aide, je n'aurais peut être jamais corrigé ce beug.

Pour info il faut rajouter sur le htaccess

SetEnv nokeepalive

pour corriger le problème et je recommande tout spécialement quickcache à ceux qui cherchent un systeme efficace.

Ps: Merci à Kioob et R23o qui se reconnaitra

Thks

Posté

merci mais attention : la désactivation du KeepAlive comme je l'indiquais dans mon premier post est uniquement un moyen rapide de tester qu'il s'agisse bien de la cause du problème. Il ne faut pas laisser le KeepAlive désactivé simplement à cause de ce bug, cela pourrait avoir des impacts non voulus sur la vitesse de navigation de tes visiteurs.

Pour ce bug spécifique, la seule solution valable à mon avis est d'ajouter ce "workaround" dans le code comme indiqué ci dessus : c'est la seule solution qui n'a aucun "effet de bord".

Posté

j'avais pas vu tes conseils. je m'en vais de ce pas modifier comme il faut le fichier. Merci beaucoup pour ton aide précieuse Kioob.

Je te tiens au courant une fois le bug corrigé de manière plus stable ;)

Posté (modifié)

Kioob,

En faite j'ai bien ce que tu me demande de rajouter mais c'est dans un else


function quickcache_flush($gzdata, $datasize, $datacrc) {
// First check if we can send last-modified
$myETag = "\"qcd-$datacrc.$datasize\"";
header("ETag: $myETag");
$foundETag = isset($_SERVER["HTTP_IF_NONE_MATCH"]) ? stripslashes($_SERVER["HTTP_IF_NONE_MATCH"]) : "";
$ret = NULL;

if (strstr($foundETag, $myETag)) {
// Not modified!
if(stristr($_SERVER["SERVER_SOFTWARE"], "microsoft")) {
// IIS has already sent a HTTP/1.1 200 by this stage for
// some strange reason
ini_set('zlib.output_compression', false);
header("Status: 304 Not Modified");
} else {
if ( $QUICKCACHE_ISCGI ) {
ini_set('zlib.output_compression', false);
header('Status: 304 Not Modified');
} else {
ini_set('zlib.output_compression', false);
header('HTTP/1.0 304');
}
}
} else {
// Are we gzipping ?
if ($GLOBALS["QUICKCACHE_USE_GZIP"]) {
$ENCODING = quickcache_encoding();
if ($ENCODING) {
// compressed output: set header. Need to modify, as
// in some versions, the gzipped content is not what
// your browser expects.
header("Content-Encoding: $ENCODING");
$ret = "\x1f\x8b\x08\x00\x00\x00\x00\x00";
$ret .= substr($gzdata, 0, strlen($gzdata) - 4);
$ret .= pack('V',$datacrc);
$ret .= pack('V',$datasize);
} else {
// Darn, we need to uncompress
$ret = gzuncompress($gzdata);
}
} else {
// So content isn't gzipped either
$ret=$gzdata;
}
}
return $ret;
}

Tu pense que je devrais quand mm l'insérer à la fin ou au début de la fonction ?

Donc je viens de tester en insérant au dessus de la fonction le code mais j'ai encore le beug par contre j'ai supprimer la mention dans le htaccess. Ce serait lié peut être ?

Merci en tous cas Kioob pour le temps que tu passe à m'aider :)

Modifié par Djames-Allen
Posté

C'est pas au début ou à la fin de la fonction qu'il faut le mettre mais exactement avant ou après le bloc que j'ai indiqué.

Il faut absolument que ce soit entre les accolades du if (strstr($foundETag, $myETag)).

Et il faut également enlever le "SetEnv nokeepalive" dans le .htaccess oui.

Posté (modifié)

Merci Kioob, pour tes indications.

Je viens d'y rajouter à l'intérieur de la fonction comme ceci :


if (strstr($foundETag, $myETag)) {
ini_set('zlib.output_compression', false);
// Not modified!
if(stristr($_SERVER["SERVER_SOFTWARE"], "microsoft")) {
// IIS has already sent a HTTP/1.1 200 by this stage for
// some strange reason
ini_set('zlib.output_compression', false);
header("Status: 304 Not Modified");
} else {
if ( $QUICKCACHE_ISCGI ) {
ini_set('zlib.output_compression', false);
header('Status: 304 Not Modified');
} else {
ini_set('zlib.output_compression', false);
header('HTTP/1.0 304');
}
}

Ca fonctionne je n'ai pas eu de fichier proposé au téléchargement mais par contre ca rame un peu...

Au niveau du htacces j'ai enlevé SetEnv nokeepalive

mais par contre on avait mis en place avec un ami des indications pour mozilla je ne sais pas si ca peut aider ou pas à corriger le beug.


## enable resulting html compression

#php_flag zlib.output_compression on

############################################
## enable apache served files compression
## http://developer.yahoo.com/performance/rules.html#gzip

# Insert filter
SetOutputFilter DEFLATE

# Netscape 4.x has some problems…
BrowserMatch ^Mozilla/4 gzip-only-text/html

# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# Don’t compress images
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary

# Make sure proxies don’t deliver the wrong content
Header append Vary User-Agent env=!dont-vary

Ceci aussi je l'ai supprimé du htaccess qui est revenu comme il était avant l'installation de Quickcache.

Pense tu s'il te plait que ceci aussi n'est pas nécessaire.

Merci Kioob :)

Modifié par Djames-Allen
Posté

Et bien tu actives à la fois la compression interne à PHP et celle d'Apache, ça fait double emploi, au moins sur les pages PHP.

Pour ce qui est des lenteurs constatées, tu n'aurais pas une URL à donner, que je vérifie la présence ou non du bug en question ?

Posté (modifié)

Kioob,

Je voudrais te dire un grand merci. Le site est stable sous firefox, plus de bug et les ralentissements sont raisonnables. J'ai remis le htacces comme il etait avant l'installation du plugin. Tout est nikel, je tiens à te dire un grand merci pour ton aide précieuse.

Je vais me rendre sur le forum de Quickcache est leur dire que le plugin souffre d'un bug, ca pourrait servir à d'autres.

Encore merci Kioob passe une bonne soirée ;)

Oui désolé c'est le 3eme site en signature :)

Enfin, concernant les lenteurs ca reste raisonnable je pense... Je ne sais pas trop car je n'ai pas trop de recul par rapport à d'autres sites web

Modifié par Djames-Allen
Posté

Es tu certain de bien avoir fait la modification ? Si je teste avec mon script maison (cf plus bas), l'entête GZIP en trop est toujours présent au milieu du flux HTTP.

<?php
$sk = fsockopen('www.last-video.com', 80);

$headers = array(
'GET /category/cinema HTTP/1.1',
'Host: www.last-video.com',
'Accept-Encoding: gzip,deflate',
'Keep-Alive: 300',
'Connection: keep-alive',
// 'If-Modified-Since: Tue, 21 Aug 2007 13:00:54 GMT',
'If-None-Match: "qcd-3211233437.29771"',
);

function sock_send( &$sk, $line )
{
echo '> ', $line, PHP_EOL;
fputs($sk, $line."\r\n");
}

function sock_gets( &$sk )
{
$line = fgets($sk, 4096);
echo '< ', rtrim($line), PHP_EOL;
return $line;
}

for( $i = 1; $i <=2 ; $i++ ) {
echo "Sending request ", $i, PHP_EOL;

foreach( $headers as $h )
sock_send($sk, $h);
sock_send($sk, '');

echo "Reading headers only (no contents should be send)", PHP_EOL;

$numLine = 0;
while( !feof($sk) ) {
$line = trim(sock_gets($sk));
if( ++$numLine === 1 ){
echo '['.dechex(ord($line{0})).dechex(ord($line{1})).']'.PHP_EOL;
}
if( $line === '' ) {
break;
}
}
}

fclose($sk);

Note : l'ETag dans la ligne "If-None-Match" est évidement à adapter en fonction du véritable ETag de tes pages (visibles via l'extension LiveHTTPHeaders de Firefox, ou encore l'extension Web Developper).

Par exemple là tout de suite ça me retourne ça :

Sending request 1

> GET /category/cinema HTTP/1.1

> Host: www.last-video.com

> Accept-Encoding: gzip,deflate

> Keep-Alive: 300

> Connection: keep-alive

> If-None-Match: "qcd-3211233437.29771"

>

Reading headers only (no contents should be send)

< HTTP/1.1 304 Not Modified

[4854]

< Date: Wed, 30 Sep 2009 00:40:31 GMT

< Server: Apache/2.0.59 (Unix) mod_ssl/2.0.59 OpenSSL/0.9.8g

< Connection: Keep-Alive

< Keep-Alive: timeout=15, max=100

< ETag: "qcd-3211233437.29771"

< Vary: Accept-Encoding,User-Agent

<

Sending request 2

> GET /category/cinema HTTP/1.1

> Host: www.last-video.com

> Accept-Encoding: gzip,deflate

> Keep-Alive: 300

> Connection: keep-alive

> If-None-Match: "qcd-3211233437.29771"

>

Reading headers only (no contents should be send)

< HTTP/1.1 304 Not Modified

[1f8b]

< Date: Wed, 30 Sep 2009 00:40:31 GMT

< Server: Apache/2.0.59 (Unix) mod_ssl/2.0.59 OpenSSL/0.9.8g

< Connection: Keep-Alive

< Keep-Alive: timeout=15, max=99

< ETag: "qcd-3211233437.29771"

< Vary: Accept-Encoding,User-Agent

<

On voit clairement lors de la deuxième réponse qu'il y a des caractères "bizarres" en trop avant le "HTTP/1.1 304 Not Modified".

Comme indiqué juste en dessus cette ligne commence par les caractères 0x1f8b, ce qui est la signature du GZIP, et c'est ça qui cause tes soucis : QuickCache continue à faire l'encodage gzip sur les réponses 304.

Posté

on a pourtant bien mis ini_set('zlib.output_compression', false); avant tout header('Status: 304 Not Modified'); dans les fichiers de quickcache.

En faisant un Phpinfo() j'ai même zlib.output_compression à Off (Local Value et Master Value)

if (strstr($foundETag, $myETag)) {
// Not modified!
if(stristr($_SERVER["SERVER_SOFTWARE"], "microsoft")) {
// IIS has already sent a HTTP/1.1 200 by this stage for
// some strange reason
ini_set('zlib.output_compression', false);
header("Status: 304 Not Modified");
} else {
if ( $QUICKCACHE_ISCGI ) {
ini_set('zlib.output_compression', false);
header('Status: 304 Not Modified');
} else {
ini_set('zlib.output_compression', false);
header('HTTP/1.0 304');
}
}
}

Posté

Ah bah dans ce cas c'est un tout autre problème oui... il y aurait une autre "couche" qui viendrait ajouter sa compression GZIP à tord sur ces requêtes 304 ??

Peux tu désactiver tes options Apache concernant le module DEFLATE, pour voir ?

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...