Bonjour à tous et toutes,

Je vous sollicite car je rencontre actuellement un problème dans l'un de mes scripts PHP (appel en crontab).

Ce dernier a pour rôle d'effectuer une requête en base de données et de générer un fichier CSV brut.
La requête est colossale : extraction de tout un référentiel avec un croisement d'une table de 3Go avec une multitude d'autres tables.
La requête est brute : pas de filtre, pas de tri, un simple SELECT X FROM X JOIN X [...]
L'écriture du fichier est brut : le résultat de la requête tel qu'obtenu.

Il n'y a donc aucun traitement PHP nécessaire. Afin de ne pas avoir à parcourir les 8 millions de lignes retournées pour l'écriture dans le fichier, j'ai opté pour la solution basique suivante :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
$commande = "mysql -u $login -p$password -h $host $db -e \"$query\" | sed 's/NULL//g;s/\t/;/g;s/$/;/;s/\\n//g' > $path/$file";
exec($commande);
Le sed permet juste d'afficher l'entête dans le fichier.

Le traitement est donc demandé au système via la commande exec().

Pourtant, j'obtiens l'erreur suivante :

PHP Fatal error: Allowed memory size of 838860800 bytes exhausted (tried to allocate 72 bytes) in [...]
sachant que ma mémoire est en effet configurée à 800Mo :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
ini_set('memory_limit', '800M');
Ce que je ne comprends pas, c'est pourquoi la mémoire PHP est-elle sollicitée dans ce contexte, d'autant plus que je ne demande pas à exec() de stocker le flux de sortie ou de résultat de la commande.

Auriez-vous une explication ?

Merci pour votre aide.