Freigeben über


Behebung von PHP-Fehlern mithilfe der Ablaufverfolgung für fehlgeschlagene Anfragen

Gilt für: Internetinformationsdienste

Bei der Ausführung von PHP ist es manchmal nicht möglich, eine Fehlerseite zu untersuchen, um eine Fehlerbedingung zu diagnostizieren. Dies kann in folgenden Fällen vorkommen:

  • Sie wissen nicht, welche URL einen Fehler aufweist.
  • Der Fehler tritt zeitweise auf, und Sie können ihn nicht manuell reproduzieren (der Fehler kann von Benutzereingaben oder externen Betriebsbedingungen abhängen, die selten auftreten können).
  • Der Fehler tritt nur in der Produktionsumgebung auf.

In diesen Fällen ist es schwierig zu definieren, was der Fehler ist, und noch schwieriger zu diagnostizieren. Möglicherweise können Sie ermitteln, welche URLs die Fehler verursachen, indem Sie die Anforderungsprotokolle oder ein Fehlerprotokoll überprüfen, aber möglicherweise gibt es weiterhin Probleme, zu bestimmen, was den Fehler verursacht hat.

Internetinformationsdienste (IIS) erleichtert das Auffinden und Diagnostizieren dieser schwierigen Fehlerbedingungen mit der Fehleranforderungsablaufverfolgung, mit der Sie Fehlerdefinitionen erstellen können, mit denen automatisch detaillierte Ausführungsablaufverfolgungen bestimmter Anforderungen erfasst werden. Siehe Problembehandlung bei fehlgeschlagenen Anforderungen mithilfe der Ablaufverfolgung in IIS und Verwenden der Fehleranforderungsablaufverfolgung, um Umschreibungsregeln nachzuverfolgen.

Um bei der PHP-Diagnose zu helfen, können diese Ablaufverfolgungen auch vorgenommen werden, um die Anforderungseingabedaten und die Antwortdaten von PHP zu erfassen. Dies kann den Einblick liefern, der für die Diagnose dieser Fehlerbedingungen erforderlich ist.

Ein weiteres ziemlich häufiges Anwendungsproblem ist der Code, der festhängt oder in eine ressourcenintensive Schleife gerät. Dies kann häufig passieren, denn:

  • Eine blockierende E/A-Operation auf einer Datei oder in einem Netzwerk dauert lange, z. B. beim Zugriff auf einen entfernten Webdienst oder eine Datenbank.
  • Der Code hat einen Fehler, der dazu führt, dass er in eine Endlosschleife (oder eine lange Schleife) gerät, die möglicherweise auch die CPU belastet oder Speicher zuweist.
  • Der Code hängt oder sperrt sich auf einer freigegebenen Ressource oder Sperre.

Diese Bedingungen führen zu langen Wartezeiten oder Timeouts für den Benutzer, der die Anforderung vornimmt, und die Bedingungen können sich auch negativ auf die Leistung der Anwendung und sogar auf die Gesamtheit auswirken.

Der IIS bietet eine schnelle Möglichkeit, um festzustellen, welche Anfragen sich aufhängen, indem die aktuell ausgeführten Anfragen untersucht werden.

Verwenden der Fehleranforderungsablaufverfolgung zum Diagnostizieren unbekannter oder schwer zu reproduzierener Fehler

Fehleranforderungsablaufverfolgung kann eine effektive Möglichkeit sein, intermittierende oder schwer zu reproduzierende Fehlerbedingungen zu verfolgen und die Fehlerbedingungen zu diagnostizieren, indem Details zu Anforderung, Antwort und die Fülle von Ablaufverfolgungsereignissen aus IIS-Modulen untersucht werden.

Fehleranforderungsablaufverfolgung kann in einer Produktionsumgebung verwendet werden, da sie nur für Ablaufverfolgungsanforderungen konfiguriert werden kann, die der spezifischen Fehlerdefinition entsprechen und den großteil des Ablaufverfolgungsaufwands für erfolgreiche Anforderungen vermeiden können.

Führen Sie die folgenden Schritte aus, um die Ablaufverfolgung für fehlgeschlagene Anforderungen für eine Website zu aktivieren (in diesem Beispiel verwenden wir "TroubleshootingPhp":

  1. Wechseln Sie zum IIS-Manager. Wenn sie geschlossen ist, wählen Sie "Start" und dann Internetinformationsdienste (IIS)-Manager aus.

  2. Erweitern Sie den Serverknoten und erweitern Sie dann den Knoten "Websites ".

  3. Suchen Sie in der Strukturansicht auf der linken Seite den Namen Ihrer Website, und wählen Sie ihn aus.

  4. Doppelklicken Sie unter IIS auf Ablaufverfolgungsregeln für Anforderungsfehler.
    Screenshot des Abschnitts

  5. Wählen Sie im Aktionsbereich die Option Seitenverfolgung bearbeiten aus.

  6. Aktivieren Sie das Kontrollkästchen "Aktivieren".

  7. Klicken Sie auf OK.

  8. Erstellen Sie nun eine Regel für die Protokollierung fehlgeschlagener Anforderungen. Wählen Sie im Bereich "Aktionen" die Option "Hinzufügen" aus.

  9. Lassen Sie die Option "Alle Inhalte " ausgewählt.
    Screenshot des Dialogfelds

  10. Wählen Sie Weiter aus.

  11. Geben Sie 400-999 in Statuscode(n) ein.
    Screenshot des Bildschirms

  12. Wählen Sie Weiter aus.

  13. Lassen Sie die standardmäßigen Ablaufverfolgungsanbieter aktiviert, und wählen Sie dann "Fertigstellen" aus.

  14. Jetzt können Sie Anfragen stellen. Gehen Sie für diese Schritte davon aus, dass die Anforderungen von anderen Benutzern Ihrer Website gestellt werden und Sie nicht über ihre Anforderungen oder Antworten informiert sind. Verwenden Sie beispielsweise Internet Explorer, um die folgenden Anfragen zu stellen:

    • Anforderung http://localhost:84/hello.php.
    • Anforderung http://localhost:84/products.php?productid=3.
    • Anforderung http://localhost:84/products.php?productid=5 (diese Seite erzeugt einen Fehler)
  15. Suchen Sie die Fehleranforderungsablaufverfolgung:

    • Wählen Sie "Start" und dann "Eingabeaufforderung" aus, um das Eingabeaufforderungsfenster zu öffnen.

    • Führen Sie den folgenden Befehl aus, um die für unsere Website generierten Protokolle aufzulisten:

      %windir%\system32\inetsrv\appcmd.exe list traces /site.name:"TroubleshootingPhp"
      
    • Sie erhalten eine Ausgabe ähnlich wie:

      TRACE "troubleshootingPhp/fr000001.xml" (url:http://localhost:84/products.php?product=5,statuscode:500,wp:2864)
      
    • Die Ausgabe gibt an, dass ein Ablaufverfolgungsprotokoll für eine Anforderung /products.php?product=5generiert wurde, was zu einem HTTP 500-Fehler führte. Es teilt Ihnen mit, dass:

      • Die Products.php Seite hat einen Fehler verursacht.
      • Die Eingabe, die einen Fehler verursacht hat, ist wahrscheinlich product=5, da keine Fehler für andere Abfragezeichenfolgen angezeigt werden (diese Schlussfolgerung wäre genauer, wenn häufig auf diese Seite zugegriffen wird. In diesem Fall werden mehrere Fehler nur für diese bestimmte Abfragezeichenfolge angezeigt).
  16. Sie können jetzt ein bestimmtes Ablaufverfolgungsprotokoll abrufen, um weitere Informationen über die Anforderung und die mögliche Ursache für den Fehler zu sammeln. Führen Sie dazu den folgenden Befehl an der Eingabeaufforderung aus (unter Verwendung der zitierten ID des Ablaufverfolgungsprotokolls aus der vorherigen Ausgabe):

    %windir%\system32\inetsrv\appcmd.exe list traces /site.name:"TroubleshootingPhp" /text:*
    

    Dies sollte eine Ausgabe ähnlich der folgenden liefern:

    TRACELOG
      TRACE.NAME:" troubleshootingPhp/fr000001.xml"
      PATH:"C:\inetpub\logs\FailedReqLogFiles\W3SVC2\fr000001.xml"
    URL:"http://localhost:84/products.php?product=5"
      STATUSCODE:"500"
      SITE.ID:"2"
      SITE.NAME:"TroubleshootingPhp"
      WP.NAME:"2864"
      APPPOOL.NAME:"TroubleshootingPhp"
      verb:"GET"
      remoteUserName:""
      userName:""
      tokenUserName:"NT
    AUTHORITY\IUSR"
      authenticationType:"anonymous"
      activityId:"{ 00000000-0000-0000-1400-0080000000FA }"
      failureReason:"STATUS_CODE"
      triggerStatusCode:"500"
      timeTaken:"100"
    xmlns:freb:"http://schemas.microsoft.com/win/2006/06/iis/freb"
    
  17. Prüfen Sie das Ablaufverfolgungsprotokoll. Öffnen Sie die Ablaufverfolgungsprotokolldatei im Browser, indem Sie den Pfad verwenden, der in der vorherigen Ausgabe angegeben ist (in diesem Beispiel lautet C:\inetpub\logs\FailedReqLogFiles\W3SVC2\fr000001.xml). Auf der Registerkarte "Zusammenfassung" finden Sie grundlegende Informationen zur Anforderung. Sie können sehen, dass der Fehlerstatus von FastCGIModule festgelegt wurde, was darauf hindeutet, dass der Fehler von PHP stammt. In anderen Fällen können Sie feststellen, dass der Fehler aus anderen IIS-Modulen stammt. In diesem Fall könnten Sie die Fülle von Ablaufverfolgungsinformationen im Protokoll verwenden, um die Ursache zu ermitteln. In diesem Fall müssen Sie jedoch tatsächlich die Antwort sehen, die von PHP generiert wurde, um mehr Einblick in den Fehler zu erhalten.
    Screenshot der Registerkarte

  18. Wählen Sie die Registerkarte "Kompaktansicht " aus. Diese Registerkarte zeigt die detaillierte Liste der Ablaufverfolgungsereignisse, die während der Verarbeitung der Anforderung von IIS- und IIS-Modulen generiert wurden.
    Screenshot des Bildschirms

    Hinweis:

    • GENERAL_REQUEST_START Ereignis enthält einige grundlegende Informationen, einschließlich der Anforderungs-URL, des Verbs, der Laufzeitinformationen zur Website und der Anwendung, an die die Anforderung verteilt wurde.
    • GENERAL_REQUEST_HEADERS Ereignis gibt die vollständige Liste der Kopfzeilen an, die in einigen Fällen bei der Bestimmung, welche Benutzereingabe zu dem Fehler führen kann, erheblich sein kann.
    • GENERAL_RESPONSE_HEADERS- und GENERAL_RESPONSE_ENTITY_BUFFER-Ereignisse stellen die vollständigen Antwortheader und den Antwortkörper bereit, die an den Client gesendet wurden. In diesem Fall stellt der Antworttext die zusätzlichen Informationen bereit, die zum Diagnostizieren des Fehlers erforderlich sind, was auf eine falsche Produkt-ID hinweist.

Dies sind andere Abschnitte, die Sie beim Überprüfen des Ablaufverfolgungsprotokolls berücksichtigen sollten:

  • Der Bereich Anforderungszusammenfassung enthält eine Zusammenfassung der Anforderung, des zugehörigen Ergebnisses und hebt auch Warnungs- oder Fehlerereignisse während der Anforderungsausführung hervor.
  • Der Bereich Anforderungsdetails bietet eine hierarchische Ansicht der Anforderungsausführung, sodass Sie die Ereignisse nach verschiedenen Kategorien wie Modulbenachrichtigungen, Authentifizierung/Autorisierung usw. filtern können. Es bietet auch die Leistungsansicht, die Ihnen hilft, zu verstehen, welche Teile der Ausführung die längste Zeit dauerten.
  • Die Kompakte Ansicht bietet die vollständige Liste der Ereignisse, einschließlich einer Fülle von Informationen über die Anforderungsausführung. Viele der IIS-Module liefern Informationen über ihre Ausführung, die verwendet werden kann, um verschiedene Aspekte der Anforderungsverarbeitung und des Ergebnisses zu verstehen. Diese Informationen können bei der Problembehandlung bei komplexen Interaktionen, z. B. beim Umschreiben von URLs oder der Authentifizierung, von unschätzbarem Wert sein.

Suchen Sie hängende Anforderungen, indem Sie die aktuellen Ausführungen der Anforderungen überprüfen.

Auf diese Weise können Sie schnell ermitteln, welche Anforderungen aufgehängt sind, indem Sie die derzeit ausgeführten Anforderungen in IIS prüfen.

Angenommen, Sie fordern eine Seite an, die aufgrund eines Programmierfehlers in eine Endlosschleife eintritt. In den folgenden Schritten ist diese Seite loop.php. Im Task-Manager können Sie feststellen, dass die Php-cgi.exe ausgelastet ist und nahezu 100 Prozent der CPU verbraucht (wenn Sie über mehrere CPU-Kerne verfügen, sehen Sie, dass der Prozess 1/# der Kerne der gesamten CPU verbraucht). Sie können feststellen, welche Anforderung festhängt:

  1. Wählen Sie "Start" und dann Internetinformationsdienste (IIS)-Manager aus.

  2. Wählen Sie in der Strukturansicht auf der linken Seite den Knoten "Server" aus.

  3. Doppelklicken Sie unter IISauf Arbeitsprozesse.

  4. Doppelklicken Sie unter "Anwendungspoolname" auf den Namen Des Anwendungspools, um die Ansicht "Anforderungen " zu öffnen. (In diesem Beispiel ist es ProblembehandlungPhp.)
    Screenshot des Bildschirms

  5. Wechseln Sie zu einem Web-Browser und aktualisieren Sie die Seite, wenn die Sitzung abgelaufen ist. Dies muss möglicherweise durch diese Schritte hindurch ausgeführt werden. Wechseln Sie zurück zum IIS-Manager, und aktualisieren Sie dann die Ansicht Anforderung .

  6. Beobachten Sie die Liste der derzeit ausgeführten Anforderungen, die die Anforderung an die Problemseite anzeigen, in diesem Beispiel /loop.php. Der Anforderungseintrag zeigt Folgendes an:

    • Die Anforderung wurde seit einiger Zeit ausgeführt (Zeit verstrichen).
    • Die URL der Anforderung (in diesem Beispiel /loop.php).
    • Der Modulname (FastCGIModule).
    • Die Ausführungsphase (ExecuteRequestHandler).

Sie können die Ansicht mehrmals aktualisieren, um zu beobachten, dass dieselbe Anforderung weiterhin in derselben Phase ausgeführt wird und auf die aufgehängte Anforderung verweist.

  • Bestimmen Sie mithilfe der Eingabeaufforderung, welche Anfrage hängt. Mit der Eingabeaufforderung können Sie die betreffenden Anforderungen herausfiltern, z. B. Anforderungen an eine bestimmte Anwendung oder eine bestimmte URL. Man kann es verwenden, um Skripte zu automatisieren, die zur Überwachung aktuell ausgeführter Anforderungen dienen. Öffnen Sie das Eingabeaufforderungsfenster, indem Sie Start und anschließend Eingabeaufforderung auswählen.

  • Wechseln Sie zu einem Webbrowser, und aktualisieren Sie dann die http://localhost:84/loop.php Seite. (Beachten Sie, dass loop.php ein Beispielname ist; der Name Ihrer Seite sollte verwendet werden.) Möglicherweise müssen Sie diese Seite für die folgenden Schritte kontinuierlich aktualisieren. Wechseln Sie zur Eingabeaufforderung.

  • Führen Sie den folgenden Befehl aus, um die Anforderungen aufzulisten, die für mehr als eine Sekunde ausgeführt wurden:

    %windir%\system32\inetsrv\appcmd.exe list requests /elapsed:1000
    

    Sie erhalten eine Ausgabe ähnlich wie die folgende, mit dem Seitennamen anstelle von loop.php:

    REQUEST " fa000000080000026" (url:GET /loop.php, time:2840 msec, client:localhost, stage:ExecuteRequestHandler, module:FastCgiModule)
    
  • Filtern Sie die zurückgegebenen Anforderungen, indem Sie eine beliebige Anzahl von Kriterien basierend auf den verfügbaren Anforderungsattributen angeben. So zeigen Sie beispielsweise nur die Anforderungen an eine bestimmte URL an:

    %windir%\system32\inetsrv\appcmd.exe list requests /url:/loop.php /elapsed:1000
    
  • Sie können auch die Verknüpfung von AppCmd-Befehlen verwenden, um komplexere Abfragen auszuführen, z. B. um alle Anwendungen zu ermitteln, die lange ausgeführte Anforderungen haben:

    %windir%\system32\inetsrv\appcmd.exe list requests /elapsed:1000 /xml | %windir%\system32\inetsrv\appcmd list apps /in
    

    Sie erhalten die Liste der Anwendungen, die den folgenden ähnlich sind:

    APP "troubleshootingPhp/" (applicationPool:troubleshootingPhp)
    
  • Hier sehen Sie ein Beispiel für eine Aktion basierend auf den aktuellen Anforderungsdaten: Recycling der Anwendungspools mit Anforderungen, die länger als fünf Sekunden ausgeführt wurden:

    %windir%\system32\inetsrv\appcmd.exe list requests /elapsed:1000 /xml | %windir%\system32\inetsrv\appcmd list apppools /in /xml | %windir%\system32\inetsrv\appcmd recycle apppools /in
    

    Sie erhalten die folgende Ausgabe mit dem Namen Ihrer Anwendung:

    "TroubleshootingPhp" successfully recycled
    

Weitere Informationen