Question

Je suis une grande demande PORTAGE Web pour un environnement d'hébergement Web partagé. L'application a été écrit en PHP 4. Le nouvel environnement a PHP 5.2.

Pour une raison quelconque, l'application fuit d'énormes quantités de mémoire lors de l'exécution en PHP 5.2. Je peux littéralement regarder l'utilisation de la mémoire en passant par le toit à l'aide memory_get_usage (), jusqu'à ce qu'il atteigne la limite de 64 Mo (ce qui est très généreux dans un environnement partagé, le site utilisé pour exécuter avec 12 ou 16 Mo sur PHP 4).

Je pense que cela est un effet secondaire de quelque chose qui a changé en PHP 5, très probablement le traitement des références d'objets dans les arguments. Cependant, la recherche du comportement particulier (s) que la cause (s) de la fuite est extrêmement difficile car l'application est très complexe, et en partie pas très bien écrit (oui, il est à moi).

Comme l'application est installée sur un espace Web partagé, je ne peux pas utiliser les installations de débogage classiques (pour autant que je sache). Je vous serais très, très semblable à éviter de recréer l'environnement local, comme je travaille sur le projet littéralement toute la journée pour un certain temps.

Alors mes questions sont:

  • Quelqu'un sait-il PHP4 typique => 5 pièges de transition, en particulier lorsqu'ils traitent avec de grandes quantités d'objets, qui pourraient être la cause de ma fuite (s)

  • Quelqu'un sait-il une sorte de débogueur indépendant, script seul outil « de vidage de champ graphique » pour les variables utilisées par PHP qui pourraient me aider à trouver quelles variables engloutissaient ces énormes quantités de mémoire?

Était-ce utile?

La solution

Pour résoudre ce problème, je voudrais:

  1. Profil le script avec xdebug + wincachegrind (ou un autre profileur) et / ou FirePHP.
  2. Activer le mode STRICT pour obtenir toutes les erreurs php + avis.

En faisant cela, vous serez en mesure de:

  • Optimiser votre code. (Suppression des erreurs / avertissement / avis peut accélérer votre code)
  • Nettoyez votre code. (Utilisation de la syntaxe objet php5 ne peut être bon pour la performance).

Le modèle d'objet totalement changé de PHP4 à PHP5. Bien sûr, le mode STRICT vous dira que vous ne devriez pas utiliser un explicite « passé par référence ».

Autres conseils

Une commune a j'ai trouvé dans une version de 5.2 était que strtotime sans fuite memory_get_usage attraper. Le passage à strptime fixe la question.

Il y a un rapport de bogue pour ce pour 5.2.8 - http: // bogues .php.net / bug.php? id = 46889 .

Sans débogueur vous pouvez ouvrir un script que vous pensez utiliser beaucoup de mémoire et de mettre la fonction memory_get_usage dans les locaux critiques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top