Limiter la charge d'un serveur PHP

Limiter la charge d'un serveur PHP - PHP - Programmation

Marsh Posté le 13-05-2011 à 14:20:39    

Bonjour à tous,
j'ai eut beau chercher sur pas mal de site et trouvé quelque infos utilies, rien qui puisse véritablement répondre à mon problème. J’espère donc que vous pourrez m'aider. Voilà le topos :
 
Je dois effectuer des calcul (assez importants) sur des donnés présente en base SQL et simplement afficher le résultat.
Une solution que j'ai envisagé pour limiter la charge du serveur php est de faire faire les calculs coté client via javascript, ce qui nécessite la création automatique par PHP du code javascript (via des echo dans les balises <script></script> ) pour générer la structure de donnée. Ca donne un truc dans le genre :
 

Code :
  1. <script type="text/javascript">
  2. var ligne_b = <?php echo $sql_select->rowCount(); ?>;
  3. var colone_b = <?php echo $sql_select->columnCount(); ?>;
  4. <?php
  5.    while($data = $sql_select->fetch()){ // va normalement tourner plusieurs centaine de fois
  6.        echo "mon_tableau=new Array(".'$data'.');';
  7.    }
  8. ?>
  9. </script>


 
Le script représente l'idée de ce qui doit être fait et n'est pas correcte j'en suis conscient.
 
Ma question est la suivante :
Qu'est ce qui est le plus lourd pour le serveur PHP ?
 - Faire générer une page de cette manière avec plusieurs centaine d'echo ?
 - Faire faire les calculs (complexité n^4) par PHP et afficher la réponse ?
 
Merci beaucoup.

Reply

Marsh Posté le 13-05-2011 à 14:20:39   

Reply

Marsh Posté le 13-05-2011 à 14:34:26    

Si tes résultats sont amenés à être réutilisés, il faut utiliser un simple cache fichier, ou mieux, du cache mémoire distribué type memcached.
C'est l'optimisation n°1 à mettre en place. Sans cache, aucun gros site ne peut espérer tourner.
 
Dans tous les cas, il faut utiliser des requêtes préparées (paramétrées) avec PDO, pour que le plan d’exécution de la requête reste le même.
 
Quand à déporter ceci en javascript, je pense que tu compliques trop les choses. écrit une énorme chaine de caractère plutôt que plusieurs echos, et compresse le tout :

Code :
  1. ob_start('ob_gz_handler');
  2. echo $my_big_string;
  3. ob_end_flush(); // ou un truc du style


 
http://www.php.net/manual/en/function.ob-start.php


---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 16-05-2011 à 09:36:53    

Merci beaucoup pour ta réponse.
Globalement l'idée d'afficher une seul string avec un seul echo marche très bien (0.017s pour générer la ligne depuis une table de 1000 enregistrements contre 0.79 s pour le traitement php). Cependant je n'arrive pas à faire fonctionner la compression j’obtiens une erreur de Firefox 4.0.1 :
 
"Erreur d'encodage de contenu. La page que vous essayez de voir ne peut être affichée car elle utilise un type de compression invalide ou non pris en charge."
 
Autre chose, je ne suis pas sure d'avoir bien saisi le sens de ceci :  

Citation :


Si tes résultats sont amenés à être réutilisés


La/les valeurs à afficher sont des sommes de différences entre des timestamps (des moyennes grosso modo) mais sont juste des indicateurs et n'ont pas votation à être utilisées plus tard (dans d'autre calcules) ni stockés. Alors je me trompe peut être mais le cache serveur ne sera pas vraiment utile dans ce cas là non ?
 
Visiblement le fait de laisser faire les calcules par javascript allège bien la charge sur serveur php qui répond maintenant près de 6 secondes plus vite.
 
Bonne journée.

Reply

Marsh Posté le 16-05-2011 à 12:47:33    

phaerandell a écrit :


"Erreur d'encodage de contenu. La page que vous essayez de voir ne peut être affichée car elle utilise un type de compression invalide ou non pris en charge."


 
Il manque probablement un petit header("Content-Encoding: gzip" ); avant d'afficher.
Mais avant de compresser il faut vérifier si le navigateur accepte la compression GZIP. (présence de Accept-Encoding: gzip dans apache_request_headers() ou $_SERVER)

Message cité 1 fois
Message édité par czh le 16-05-2011 à 12:48:21
Reply

Marsh Posté le 16-05-2011 à 15:55:23    

czh a écrit :

 

Il manque probablement un petit header("Content-Encoding: gzip" ); avant d'afficher.
Mais avant de compresser il faut vérifier si le navigateur accepte la compression GZIP. (présence de Accept-Encoding: gzip dans apache_request_headers() ou $_SERVER)

 

Après vérification que la configuration était correcte ($_SERVER et apache_request_headers() disposent bien tous les deux de Accept-Encoding: gzip).
L'ajout du header ne solutionne malheureusement pas le problème.
Cependant, fait étonnant, le script passe sans problème sur IE 8, mais pas sous firefox 4.0.1 ni sous chrome 11 :

 

Erreur 330 (net::ERR_CONTENT_DECODING_FAILED) : Erreur inconnue


Message édité par phaerandell le 16-05-2011 à 16:03:42
Reply

Marsh Posté le 18-05-2011 à 20:09:42    

Si tu as des erreurs PHP (notice, etc...), la compression peut échouer car un flux d'erreur peut se retrouver au milieu du code de compression. As-tu dans ton php.ini le error_reporting à E_ALL | E_STRICT ?
 
Par rapport à la ré-utilisabilité, effectivement, avec des timestamps, ça va être difficile :D


---------------
Directeur Technique (CTO)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed