Dans mon cas précis, j’écris une task qui me sert a migrer les données d'un ancien site vers sa nouvelle version remise neuf sous Symfony 1.4 avec Doctrine. Voici la boucle qui concerne la migration de la table utilisateur (note: le nouveau systeme utilise sfDoctrineGuard, mais ça n'a pas vraiment d'importance pour notre problème):
$DBO = Doctrine_Manager::getInstance()->getConnection('doctrine')->getDbh(); /** * Users migration */ $users = $DBO->query("SELECT * FROM old_tblusers")->fetchAll(); foreach($users as $oldUser){ $user = new sfGuardUser(); $user->setFirstName($oldUser['FName']); $user->setLastName($oldUser['LName']); $user->setEmailAddress($oldUser['EMail']); $user->setUsername($oldUser['UserName']); $user->setPassword($oldUser['Password']); $user->save(); $user->free(true); unset($user); echo memory_get_usage()."\n";; }A lui tout seul cet exemple est peu gourmand en mémoire, mais celle-ci ne sera cependant pas stable et continuera a augmenter à chaque boucle... Voici l'astuce qui permet d'avoir une utilisation de mémoire constante :
Dans le fichier config/databases.yml, ajoutez les informations suivantes à vos paramètres de connexion :
# Disable profiler for import in task dev: doctrine: class: sfDoctrineDatabase param: profiler: falseJe précise évidemment que ma task utilise l'environnement dev pour fonctionner. Grâce a cette modification, mes boucles utilisent entre 152 et 156Mo de mémoire et ce constamment, quel que soit le nombre d'objets à insérer (dans mon cas 48 000). Pour les informations techniques de mon environnement, j'utilise un serveur local sous Centos 5.5, avec PHP 5.3 et MySQL 5.1.
Voila, j’espère que cette astuce fonctionnera pour vous aussi. Je la partage ici car j'ai passé beaucoup de temps à chercher une solution à ce problème sans jamais rien trouver de vraiment probant.
Ce mec est un Dieu
RépondreSupprimerExactement !!!
SupprimerMerci à toi !