2011-11-03 3 views
1

J'ai un script php qui prend une image, la traite et écrit ensuite la nouvelle image dans le fichier. J'utilise imagick/imagemagick avec php 5.3.8 avec fastcgi. Après avoir lu autour de moi, je pensais que peut-être la fonction de collecte des ordures pourrait aider, mais il n'a pas empêché l'utilisation de la mémoire de php dans TOP de croissance à trois chiffres. J'avais l'habitude d'exécuter ce script dans cron.fuite de mémoire dans php sans rapport avec GC?

<?php 
var_dump(gc_enabled()); // true 
var_dump(gc_collect_cycles()); // number comes out to 0 
?> 

Vous ne savez pas quoi faire. Jusqu'à présent, la seule chose qui aide à garder php en échec est de faire un «service php-fpm recharger» toutes les heures. Est-ce que imagick utiliserait un ext partagé au lieu d'une aide statiquement compilée? Toute suggestion ou idée est grandement appréciée.

+0

Sans votre source de script, je ne suis pas sûr que nous puissions vous aider. – Brad

+0

unfnuately je ne peux pas le poster ici. – incognito2

+0

Malheureusement, sans même un meilleur indice de ce que vous faites, nous ne pouvons pas vous aider ici. – Brad

Répondre

1

Deux options:

  • ferme les travaux par gearman ou similaires à un script qui va mourir complètement. En général, je vais faire travailler mes travailleurs à travers un certain nombre d'emplois, puis les faire mourir. Ils seront redémarrés par le superviseur dans ma configuration, donc ce n'est pas un problème. La mort après N demandes évite juste les problèmes de mémoire.
  • Comme de 5.4 cela pourrait aider: http://ca3.php.net/manual/en/function.apache-child-terminate.php

Une note sur construit dans les bibliothèques externes vs. Je n'ai pas joué avec cet aspect de la magie de l'image, mais je l'ai vu avec GD. Vous obtenez une valeur de mémoire beaucoup plus faible à partir des fonctions PHP lorsque vous utilisez la bibliothèque externe, mais l'utilisation réelle de la mémoire est presque égale.

0

Un bon début pour vérifier les fuites de mémoire est valgrind.

0

Si PHP a beaucoup de mémoire disponible à utiliser, il ne prend pas la peine d'effacer la mémoire car il ne le pense pas nécessaire. Comme il utilise plus, ou si d'autres applications commencent à utiliser plus de mémoire, alors il va effacer la mémoire de ce qu'il peut.

Vous pouvez forcer l'effacement de la mémoire pour une variable en la définissant sur NULL, mais unset() est recommandé car vous ne devriez pas avoir besoin de forcer à utiliser moins de mémoire car PHP nettoiera tout seul.

Mais sinon, un extrait de votre code est nécessaire pour répondre à votre question.

+1

* "Si PHP a beaucoup de mémoire disponible à utiliser, il ne prend pas la peine d'effacer la mémoire car il ne pense pas que cela soit nécessaire." * Attendez, quoi? – netcoder

+0

Bien sûr, il n'efface pas la mémoire dès que vous avez désactivé(), il le libère juste. Donc, le top affichera toujours la même quantité d'utilisation de la mémoire, mais alors la gestion de la mémoire de PHP la libérera correctement si votre système commence à manquer de mémoire ou si le script atteint sa limite de mémoire. – Alasdair