2010-04-27 8 views
2

Je crée environ 150 nœuds par programme et je rencontre des erreurs 'out of memory' lorsque je fais tout cela en une seule requête. (J'ai un rappel de menu qui génère les noeuds et appelle node_save() sur eux.)comment éviter les erreurs 'out of memory' lors de la génération par programme de nombreux noeuds dans drupal?

Exemple:

for($i=0; $i<150; $i++) { 
    $node = new stdClass(); 
    $node->title="Foo $i"; 
    $node->field_myfield[0]['value'] = "Bar $i"; 
    ... 
    node_save($node); 
} 

Je l'ai entendu parler de BatchAPI, mais jamais utilisé. Est-ce le bon outil pour contourner cela? Les docs parlent des délais, mais pas des problèmes de mémoire. Y at-il quelque chose de plus simple que je pourrais manquer?

+0

utilisez-vous node_load() pour obtenir des informations sur d'autres nœuds? – gapple

+0

Non, pour l'instant, ils sont entièrement construits à partir de zéro. Je vais ajouter un peu d'exemple de code ci-dessus. – sprugman

+0

Cela ne devrait pas être trop un problème. Quelle est la quantité de RAM de votre appareil électronique? – Rimian

Répondre

2

Oui, Batch API peut résoudre ce problème. Il divisera votre utilisation de la mémoire en requêtes HTTP distinctes, chacune avec l'accès à votre limite de mémoire totale.

0

avez-vous déjà utilisé Views Bulk Operations? (http://drupal.org/project/views_bulk_operations) il est livré avec une vue groupée affichée à admin/content/node2 vous pouvez l'éditer pour activer une action "Exécuter le code PHP", ainsi que l'API Batch. C'est le moyen le plus simple de modifier des nœuds par programmation. Toutefois, puisque vous créez les nœuds, vous devez simplement désactiver le nœud $ à la fin de l'instruction, et cela devrait diminuer l'utilisation de la mémoire. essayez:

 
    for($i=0; $i 150; $i++) { 
    $node = new stdClass(); 
    $node->title="Foo $i"; 
    $node->field_myfield[0]['value'] = "Bar $i"; 
    ... 
    node_save($node); 
    unset($node); 
    }
}

+0

bien, mon code actuel est plus comme 'pour (1-150) {mymod_create_node(); } 'donc la mémoire devrait être libérée chaque fois que la fonction sort en théorie. – sprugman