Question

Nous avons un grand logiciel de gestion qui produit de gros rapports de toutes sortes, basés sur de nombreuses boucles, avec des extractions de bases de données, des créations d’objets (plusieurs), etc.>.

Sous PHP4, il pourrait fonctionner sans problème avec une limite de mémoire de 64 Mo. Nous l’avons maintenant déplacé sur un nouveau serveur et avec la même base de données. Même code, les mêmes rapports ne seront pas générés sans une limite de mémoire. ..

Je sais que PHP5 a beaucoup évolué sous le capot, mais existe-t-il un moyen de le faire se comporter?

La question qui se pose à la fin est la suivante: quelles stratégies appliquez-vous lorsque vous avez besoin que vos scripts suivent un régime?

Était-ce utile?

La solution

Un gros problème que nous avons rencontré concerne les références circulaires entre les objets, les empêchant de libérer de la mémoire quand ils deviennent hors de portée.

En fonction de votre architecture, vous pourrez peut-être utiliser __destruct () et supprimer manuellement les références. Pour notre problème, j'ai fini par restructurer les classes et supprimer les références circulaires.

Autres conseils

Lorsque j'ai besoin d'optimiser les ressources d'un script, j'essaie toujours d'analyser, de profiler et de déboguer mon code, j'utilise xDebug. , et le xDebug Profiler , il existe d'autres options telles que APD et Benchmark Profiler .

De plus, je vous recommande ces articles:

Depuis que vous avez migré sur le nouveau serveur, avez-vous vérifié que vos variables système MySQL et PHP sont identiques à celles sur votre ancien serveur?

PHP5 a introduit de nombreuses nouvelles fonctionnalités, mais en raison de son mantra de compatibilité ascendante, je ne pense pas que les différences entre PHP5 et PHP4 soient à l’origine d’un tel impact sur les performances d’une application dont le code et la base de données n’ont pas été modifiés. modifié.

Utilisez-vous également la même version d’Apache ou d’IIS?

Cela ressemble à un problème qui est plus probablement lié à votre nouvel environnement système qu'à une mise à niveau de PHP4 à la version 5.

Bertrand,

Si vous souhaitez refactoriser le code existant, je vous recommande de surveiller d’abord votre utilisation de la mémoire et du processeur lors de l’exécution des rapports. Verrouillez-vous votre serveur SQL ou Apache (ce qui se produit si le code PHP impose beaucoup de contraintes au système)?

J'ai travaillé sur un projet qui, au départ, avait tellement bloqué MySQL que nous devions refactoriser tout le processus de génération de rapports. Cependant, lorsque nous avons terminé, le chargement a été simplement transféré vers Apache (via le code PHP plus complexe). Notre dernière solution consistait à refactoriser la conception de la base de données pour améliorer les performances des fonctions de reporting et à utiliser PHP pour prendre le relais de ce que nous ne pouvions pas faire de manière native dans MySQL.

En fonction de la nature des rapports, vous pouvez envisager de dénormaliser les données utilisées pour les rapports. Vous pourriez même envisager de construire une deuxième base de données qui servira d’entrepôt de données et s’articulera autour des principes OLAP plutôt que des principes OLTP. Vous pouvez commencer par Wikipedia pour une explication générale sur OLAP et l’entreposage de données.

Cependant, avant de vous pencher sur une refactorisation sérieuse, avez-vous vérifié que vos environnements sont suffisamment similaires en consultant phpinfo (); pour PHP et SHOW VARIABLES; dans MySQL?

Un concert!?!

même 64 Mo est grand.

En ignorant la discordance entre les environnements (ce qui semble très particulier), il semble que le code puisse nécessiter une refonte.

toute chance que vous puissiez modifier votre code afin que les ensembles de résultats des requêtes de base de données ne soient pas vidés dans des tableaux. Je vous recommande de construire un itérateur pour vos jeux de résultats. (vous pouvez les traiter comme des tableaux dans la plupart des cas). Il existe une grande différence entre le traitement d’un enregistrement à la fois et le traitement de 10 000 enregistrements à la fois.

Deuxièmement, regardez si votre code crée plusieurs instances des données. Pouvez-vous passer les objets par référence. (utilisez le '& amp;'). Nous avons dû faire la même chose lorsque nous utilisions une première version du framework horde. une pièce jointe de 1 Mo disparaîtrait à 50 Mo de nombreux appels ayant transmis l'ensemble du jeu de données comme une copie plutôt que comme une référence.

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