2010-10-02 5 views
3

J'écris un ensemble de classes pour un crawler, il explore une page de démarrage, tire trois liens basés sur des paramètres (trouvé en utilisant Simple Html Dom Parser permettant l'utilisation de jquery comme sélecteurs), explore ces pages , puis va à la page 2, choisit les 3 pages suivantes. Le nombre maximum de pages en cours est de 57 fois.Application PHP à court de mémoire

Inutile de dire que je reçois:

taille de la mémoire autorisée de 50331648 octets épuisé message d'erreur.

Y at-il un moyen que je puisse éviter de manquer de memmory. Pour que vous sachiez, après avoir tiré le contenu de la première page, j'exécute une fonction go(), qui tire continuellement dans les pages jusqu'à ce que $ this-> maxpages soit atteint. Je suppose que je pourrais lancer la boucle lors de l'instanciation des classes, mais cela aiderait-il.

Répondre

5

Vous pouvez régler la limite de mémoire:

ini_set('memory_limit', '128M'); 

Mais je vais essayer de faire le script utilise moins de mémoire. Assurez-vous que vous libérez des données/références sur tout ce qui n'a plus besoin d'exister.

memory_get_usage() peut être utile dans le débogage où l'utilisation de la mémoire s'accumule. De plus, si vous n'utilisez pas PHP 5.3, vous pouvez envisager une mise à jour puisque son garbage collector est meilleur.

+0

La réponse parfaite, et je vais le marquer comme tel. Juste, pouvez-vous donner quelques exemples de la façon de libérer des données/références - est-ce que comme vars, etc. –

+1

S'il n'y a pas de référence à un objet, il sera éventuellement détruit. Donc '$ foo = new Foo(); $ foo = new Foo(); 'ne fuira aucune donnée ... Vous n'avez pas besoin de' unset() 'la première instance. Mais le référencement circulaire (par exemple, références parents enfant et références enfant parent) ne sera pas libéré <5.3. Ainsi, des choses comme ça vont s'accumuler pendant la durée du script. Recherchez des rubriques de référence circulaire PHP pour plus d'informations. – Matthew

Questions connexes