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 :
Le sed permet juste d'afficher l'entête dans le fichier.
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 traitement est donc demandé au système via la commande exec().
Pourtant, j'obtiens l'erreur suivante :
sachant que ma mémoire est en effet configurée à 800Mo :PHP Fatal error: Allowed memory size of 838860800 bytes exhausted (tried to allocate 72 bytes) in [...]
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part ini_set('memory_limit', '800M');
Auriez-vous une explication ?
Merci pour votre aide.
Partager