2011-08-25 3 views
3

J'ai créé un script PHP qui récupère certaines données d'un site Web, recherche les informations pertinentes et les stocke dans une base de données. Le script fonctionne bien sur la machine locale mais quand je l'exécute sur un serveur en utilisant cron, il s'arrête après avoir fait 10 insertions de base de données disantPHP: Utilisation très élevée de la mémoire sur le serveur de production alors que la mémoire locale est faible

"Erreur fatale: La taille de la mémoire autorisée de 67108864 octets est épuisée (essaye d'allouer 35 octets) dans /home/content/36/78632936/html/scripts/simple_html_dom.php en ligne
"

J'ai vérifié le même script sur mon utilisant get_memory_peak_usage local() et l'utilisation maximale vient environ 8 MB

Je suis perplexe quant à la raison pour laquelle l'utilisation de la mémoire est spectaculairement élevée sur la machine en direct .. Toute aide sera appréciée ..

Glimpse de mon code:

DB_table1: contient la liste des lignes de 60000 data

Le code principal commence par appeler le DB1 et obtenir les données, puis utiliser chaque ligne de données pour former une URL. Chacune de ces URL sera récupérée à l'aide de la fonction simple_html_dom() et le script recherchera des informations particulières sur chaque page et stockera ces données dans une autre table DB_table2.

S'il vous plaît laissez-moi savoir si vous avez besoin de savoir quoi que ce soit d'autre. Merci :)

+1

Quels systèmes d'exploitation, versions php et mysql sont utilisés en direct et en local? – gnur

+2

C'est une bonne idée si on ne voit pas ce qui se passe dans simple_html_dom.php à la ligne 809 (et les lignes au-dessus et en dessous, idéalement le bloc entier ...) – ty812

+0

Etiez-vous en train de gratter tout le site? ? ou vous insérez-comme-vous-allez? – Quamis

Répondre

0

Mise à jour:
regardant la php change log il y a beaucoup de problèmes de mémoire qui sont l'adresse. Si vous utilisez une partie de PHP qui a une fuite dans 5.2, il est possible que cela puisse être une cause. Si vous voulez être sûr, essayez d'encapsuler une partie intensive de votre code avec les différences dans memory_get_usage et de voir s'il y a des différences entre l'utilisation de la mémoire.


Question/Réponse:

afuzzyllama: Votre environnement de production identique à votre environnement local? Il est possible que votre production db ait beaucoup plus de données que votre sandbox.

user743914: Malheureusement, je n'ai pas remarqué la différence précédemment, Mon serveur de production exécute la version 5.2 de PHP tandis que mon localhost est sur 5.3.1 ... DB de production a la même quantité de données que ...


solution simple:
Quelle est la limite maximum de mémoire de votre serveur permet?

Rechercher 'memory_limit' sur this page [php.net].

Comme vous le voyez dans les docs, en fonction de votre version de PHP, votre limite pourrait être aussi faible que 8mb. Je vais deviner que votre limite est définie à ~ 64M maintenant puisque votre script échoue à ~ 67mb.

Si vous avez besoin de l'augmenter temporairement, vous pouvez utiliser ini_set() ou vous pouvez le définir dans votre php.fichier ini et redémarrez votre serveur.

+0

Merci beaucoup pour votre contribution ... Malheureusement, je n'ai pas remarqué la différence précédemment, Mon serveur de production exécute PHP version 5.2 tandis que mon localhost est sur 5.3.1 ... DB de production a la même quantité de données que celle de localhost ... La différence de version peut-elle être la seule raison de la différence d'utilisation de la mémoire? J'utilise unset à chaque étape dans la mesure du possible. – ankit

0

Ne pas oublier d'utiliser unset() après tout/foreach pour le nettoyage ne sont plus nécessaires (DB) résultats.

Questions connexes