Améliorer la performance des scripts php cycliques

Le PHP est bien connu pour sa très mauvaise libération de la mémoire. PHP 5.3 apporte un garbage collector qui corrige les problèmes de fuite mémoire. Je vous invite à lire l'article suivant. Utilisant Magento avec la version 5.2 de PHP, je ne peut pas profiter des avancés de PHP 5.3.

Pour palier au problème de la gourmandise des longs scripts cycliques, il est possible de les lancer plusieurs fois. Le gain en performance est très net : dans le cas que j'ai rencontré dernièrement à partir de 100 itérations l'application perdait plus de 50% de performance ! L'idée est donc de réaliser un script bash afin de lancer plusieurs scripts php se chargeant de traiter des paquets de tâches. Ce dernier devra donc prendre un paramètre pour définir quel paquet traiter. Pour rappel, les paramètres se récupèrent à l'aide du tableau global $argv. Je propose d'utiliser un second paramettre pour définir la taille du paquet.

Notre script ressemblerait donc à cela :

  1. <?php
  2. $cursor = $argv[1];
  3. $size = $argv[2];
  4. process($cursor, $size);

Afin d'automatiser à l'aide d'un script bash générique on définit que le passage du nombre "0" au paramètre "cursor" permet de connaitre le nombre de traitement à effectuer. Notre code ressemblera alors à cela :

  1. <?php
  2. $cursor = $argv[1];
  3. $size = $argv[2];
  4.  
  5. // On retourne le nombre de paquet à traiter
  6. if($cursor == 0) {
  7. echo getCount($size);
  8. exit();
  9. }
  10.  
  11. // On traite le paquet $cursor de $size éléments
  12. process($cursor, $size);

Voici donc un exemple de script bash :

  1. #!/bin/bash
  2.  
  3. # Calcul du nombre de produit & du nombre de fois que l'on doit lancer le script
  4. nbStep=`php ../script.php 0 25`
  5. nbStep=$((nbStep / 25))
  6. echo $nbStep;
  7.  
  8. for i in $(seq 1 $nbStep)
  9. do
  10. php ../script.php $i 25
  11. done

Il est possible de rendre l’exécution du script plus rapide et la "parallèlisant". Pour cela il suffit d'ajouter un & à la fin de la ligne 10.

 

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

À propos

Photographie

Maxence de Flotte

Développeur cœur PrestaShop

Passionné de nouvelles technologies

PHP, HTML5/CSS3, jQuery, Bootstrap, LESS CSS, ...

Voir mon CV

Mes projets