Problème
L'utilisation de l'agent PHP avec une application comportant des tâches longues entraîne une utilisation élevée de la mémoire.
Solution
Pour prendre en charge le tracing distribué, l' agent PHP doit conserver une quantité importante de données d'appel de fonction au moment de l'exécution afin que les étendues puissent être échantillonnées aussi précisément que possible. Pour les transactions Web et les transactions d'arrière-plan plus courtes, cela est généralement imperceptible, à la fois en termes de surcharge CPU et mémoire. Cependant, pour les transactions d'arrière-plan plus longues, l'augmentation de la charge de mémoire peut devenir perceptible, au point même d'entraîner une condition de manque de mémoire.
Si la transaction concernée est une transaction qui exécute une série de processus répétitifs, comme un fichier d'attente de messages consommateur ou une boucle avec plusieurs appels externes, vous souhaiterez peut-être instrumenter manuellement chaque itération comme une transaction distincte. En faisant cela, la mémoire utilisée sera libérée après chaque transaction.
Le démarrage et l’arrêt manuel des transactions présentent les avantages suivants :
- Permet à toutes les fonctionnalités agent PHP de rester activées.
- Fournit des données plus précises sur le fonctionnement du processus.
Pour implémenter cela, ignorez d’abord la transaction automatique initiale avec newrelic_end_transaction()
, puis utilisez newrelic_start_transaction()
et newrelic_end_transaction()
pour instrumenter chaque transaction à tour de rôle.
L’exemple de code suivant montre comment procéder. Dans le code réel, vous remplaceriez la structure while()
par une instruction de boucle PHP appropriée et inséreriez la logique de la fonction à la place des points de suspension.
function example_long_task() { // Ensure PHP agent is available and // stop recording the current transaction if (extension_loaded('newrelic')) { newrelic_end_transaction(); }
// replace next while statement with actual loop while (<condition>) { if (extension_loaded('newrelic')) { // start recording a new transaction newrelic_start_transaction(ini_get("newrelic.appname")); transaction }
// your function logic starts ... ... // your function logic stops
// end transaction for current loop if (extension_loaded('newrelic')) { newrelic_end_transaction(); } }}