Bonjour,

Je travaille un framework perso qui lance des opérations php de maintenance en cron.

Certaines opérations réclament plus de mémoire que celle configurée par défaut (8 Mo si je me souviens bien), j'ai placé @ini_set('memory_limit', '500M'); dans le __construct de mes classes de maintenance.


Je n'avais jamais eu trop de problèmes avec ça.

Jusqu'ici.


Parce qu'avec le succès de mon site (Youpi !), j'ai dû commencer à développer des exports de notre base avec nos partenaires sous forme fichiers XML (oui, un web service est aussi en dév).


Tous les matins, je fais un dumb de mes données dans un fichier XML qui me sert de référence. Là, pas de problème.
Seulement ensuite, comme chacune de nos passerelles partenaires demande un format spécifique (sinon ce serait pas drôle) :
  • Je charge avec simplexml_load_file() le fichier le fichier XML de référence (plusieurs centaines de milliers d'enregistrements)
  • Je scanne le fichier en mémoire avec un foreach
  • Je transforme chaque enregistrement en fonction des besoins et je forme progressivement le fichier XML à envoyer


Et là problème : la consommation de mémoire du processus Php lancé (en cron donc, pas par Apache) est telle que le serveur entier plante lamentablement.
Il faut dire que mon système en place demande de charger en mémoire à la fois le fichier de référence (qu'il faut bien parcourir) et le fichier d'export (en cours de construction).
Ca fait une sacrée consommation de mémoire.

Mes Questions :
  • Est-il possible de scanner (ou de construire) un fichier XML sans placer son contenu en mémoire ?
  • Mettons que je réduise le memory_limit de 500M à 32M. Quand le script Php aura besoin de plus (ce sera ici le cas), va-t'il y a voir un plantage ou Php va-t'il ruser (en utilisant le DD pour compenser par exemple) ?
  • Ma méthodologie, mes fonctions utilisées sont-elles mauvaises ?
  • Et vous, pour ce genre d'opération d'export, vous faites comment, vous ?