Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy: Internet Information Services
W przypadku uruchamiania języka PHP czasami nie można sprawdzić strony błędu w celu zdiagnozowania warunku błędu. Może się tak zdarzyć, jeśli:
- Nie wiesz, który adres URL napotyka błąd.
- Błąd występuje sporadycznie i nie można go odtworzyć ręcznie (błąd może zależeć od danych wejściowych użytkownika lub zewnętrznych warunków operacyjnych, które mogą wystąpić rzadko).
- Błąd występuje tylko w środowisku produkcyjnym.
W takich przypadkach trudno jest zdefiniować, co to jest błąd, a nawet trudniej go zdiagnozować. Możesz określić, które adresy URL powodują błędy, sprawdzając dzienniki żądań lub dziennik błędów, ale nadal występują problemy z ustaleniem, co spowodowało wystąpienie błędu.
Usługi Internet Information Services (IIS) ułatwiają śledzenie i diagnozowanie tych trudnych warunków błędów za pomocą śledzenia żądań, które umożliwiają tworzenie definicji błędów, które automatycznie przechwytują szczegółowe ślady wykonywania niektórych żądań. Zobacz Rozwiązywanie problemów z niepowodzeniami żądań przy użyciu śledzenia w IIS oraz Używanie śledzenia niepowodzeń żądań do śledzenia reguł przepisywania.
Aby ułatwić diagnostykę PHP, te ślady można również skonfigurować tak, aby przechwytywały dane wejściowe żądania oraz dane odpowiedzi z PHP. Może to zapewnić szczegółowe informacje potrzebne do zdiagnozowania tych warunków błędu.
Innym dość typowym problemem aplikacji jest kod, który zawiesza się lub wchodzi w pętlę intensywnie korzystającą z zasobów. Często może się to zdarzyć, ponieważ:
- Blokowanie operacji we/wy w pliku lub sieci trwa długo, na przykład podczas uzyskiwania dostępu do zdalnej usługi sieci Web lub bazy danych.
- Kod zawiera błąd, który powoduje, że wchodzi w nieskończoną (lub długotrwałą) pętlę, prawdopodobnie również obciążając procesor lub przydzielając pamięć.
- Kod zawiesza się lub zakleszcza na udostępnionym zasobie lub blokadzie.
Te warunki powodują długie czasy oczekiwania lub przekroczenia limitu czasu dla użytkownika wysyłającego żądanie, a warunki mogą również negatywnie wpłynąć na wydajność aplikacji, a nawet serwer jako całość.
Usługi IIS umożliwiają szybkie określenie, które żądania zawieszają się, sprawdzając aktualnie wykonywane żądania.
Użyj śledzenia nieudanych żądań, aby zdiagnozować nieznane lub trudne do odtworzenia błędy
Śledzenie nieudanych żądań może być skutecznym sposobem na śledzenie sporadycznych lub trudnych do odtworzenia okoliczności błędów oraz diagnozowanie tych błędów poprzez sprawdzanie szczegółów dotyczących żądania, odpowiedzi i szerokiego zestawu zdarzeń śledzenia z modułów IIS.
Śledzenie żądań zakończonych niepowodzeniem może być używane w środowisku produkcyjnym, ponieważ można go skonfigurować do śledzenia tylko żądań spełniających określoną definicję błędu i uniknąć większości obciążeń związanych z śledzeniem dla żądań zakończonych powodzeniem.
Aby włączyć śledzenie żądań niepomyślnych dla witryny (w tym przykładzie użyjemy funkcji TroubleshootingPhp), wykonaj następujące kroki:
Przejdź do Menedżera usług IIS. Jeśli jest zamknięta, wybierz pozycję Start, a następnie wybierz pozycję Menedżer usług Internet Information Services (IIS).
Rozwiń węzeł Serwer, a następnie rozwiń węzeł Lokacje.
W widoku drzewa po lewej stronie znajdź i wybierz nazwę witryny.
W IIS kliknij dwukrotnie Reguły śledzenia niepomyślnych żądań.
W panelu Akcje wybierz pozycję Edytuj śledzenie witryny.
Zaznacz pole wyboru Włącz.
Wybierz przycisk OK.
Teraz utwórz regułę śledzenia żądań, które zakończyły się niepowodzeniem. W panelu Akcje wybierz pozycję Dodaj.
Pozostaw wybraną opcję Cała zawartość.
Wybierz Dalej.
Wprowadź wartość 400–999 w kodzie stanu.
Wybierz Dalej.
Pozostaw włączonych domyślnych dostawców śledzenia, a następnie wybierz pozycję Zakończ.
Teraz możesz wysyłać żądania. Załóżmy, że w przypadku tych kroków żądania są wysyłane przez innych użytkowników witryny i nie znasz ich żądań ani odpowiedzi. Na przykład wykonaj następujące żądania przy użyciu programu Internet Explorer:
- Żądanie
http://localhost:84/hello.php
- Żądanie
http://localhost:84/products.php?productid=3
- Żądanie
http://localhost:84/products.php?productid=5
(ta strona generuje błąd)
- Żądanie
Znajdź ślad żądania, który zakończył się niepowodzeniem:
Wybierz Start, a następnie wybierz Wiersz polecenia, aby otworzyć okno wiersza polecenia.
Uruchom następujące polecenie, aby wyświetlić listę dzienników śledzenia wygenerowanych dla naszej witryny:
%windir%\system32\inetsrv\appcmd.exe list traces /site.name:"TroubleshootingPhp"
Otrzymasz dane wyjściowe podobne do następujących:
TRACE "troubleshootingPhp/fr000001.xml" (url:http://localhost:84/products.php?product=5,statuscode:500,wp:2864)
Dane wyjściowe wskazują, że dla żądania
/products.php?product=5
wygenerowano dziennik śledzenia , co spowodowało błąd HTTP 500. Informuje o tym, że:- Strona Products.php spowodowała błąd.
- Dane wejściowe, które najprawdopodobniej spowodowały błąd, to
product=5
, ponieważ nie widzisz błędów dla innych ciągów zapytania (ten wniosek byłby bardziej uzasadniony, jeśli ta strona jest często odwiedzana; w takim przypadku widzisz wiele błędów tylko dla tego konkretnego ciągu zapytania).
Teraz możesz uzyskać określony dziennik śledzenia, aby zebrać więcej informacji o żądaniu i możliwe przyczyny niepowodzenia. W tym celu uruchom następujące polecenie w wierszu polecenia (przy użyciu cytowanego identyfikatora dziennika śledzenia z poprzednich danych wyjściowych):
%windir%\system32\inetsrv\appcmd.exe list traces /site.name:"TroubleshootingPhp" /text:*
Powinny to mieć dane wyjściowe podobne do następujących:
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"
Sprawdź dziennik śledzenia. Otwórz plik dziennika śledzenia w przeglądarce, używając ścieżki określonej w poprzednich danych wyjściowych (w tym przykładzie jest to C:\inetpub\logs\FailedReqLogFiles\W3SVC2\fr000001.xml). Karta Podsumowanie zawiera podstawowe informacje o żądaniu. Widać, że stan błędu został ustawiony przez moduł FastCGIModule, co sugeruje, że błąd pochodzi z języka PHP. W innych przypadkach może się okazać, że błąd pochodzi z innych modułów IIS, wtedy można użyć bogactwa informacji śledzenia w dzienniku, aby określić przyczynę. W takim przypadku należy jednak zobaczyć odpowiedź wygenerowaną przez język PHP, aby uzyskać lepszy wgląd w błąd.
Wybierz kartę Widok kompaktowy. Na tej karcie przedstawiono szczegółową listę zdarzeń śledzenia generowanych przez IIS i moduły IIS podczas przetwarzania żądania.
Uwaga:
- GENERAL_REQUEST_START Zdarzenie przedstawia niektóre podstawowe informacje, w tym adres URL żądania, metodę HTTP, informacje o czasie działania witryny i aplikację, do której wysłano żądanie.
- GENERAL_REQUEST_HEADERS zdarzenie zawiera pełną listę nagłówków, co w niektórych przypadkach może być istotne podczas określania, które dane wejściowe użytkownika mogą prowadzić do błędu.
- GENERAL_RESPONSE_HEADERS i zdarzenia GENERAL_RESPONSE_ENTITY_BUFFER zapewniają pełne nagłówki odpowiedzi i treść odpowiedzi, która została wysłana do klienta. W takim przypadku treść odpowiedzi zawiera dodatkowe informacje potrzebne do zdiagnozowania błędu wskazujące nieprawidłowy identyfikator produktu.
Są to inne sekcje, które należy wziąć pod uwagę podczas inspekcji dziennika śledzenia:
- Panel Podsumowanie żądania zawiera podsumowanie żądania, jego wynik, a także wyróżnia wszelkie zdarzenia ostrzeżenia lub błędu podczas wykonywania żądania.
- Panel Szczegóły żądania zawiera hierarchiczny widok wykonywania żądania, który umożliwia również filtrowanie zdarzeń według różnych kategorii, takich jak powiadomienia modułu, uwierzytelnianie/autoryzacja itp. Oferuje również widok wydajności, który pomaga zrozumieć, które części wykonywania zajęły najdłuższy czas.
- Widok Compact oferuje pełną listę zdarzeń, zawierając bogactwo informacji o wykonaniu żądania. Wiele modułów usług IIS generuje informacje o ich wykonaniu, które mogą służyć do zrozumienia różnych aspektów przetwarzania żądań i wyniku. Te informacje mogą być nieocenione podczas rozwiązywania problemów ze złożonymi interakcjami, takimi jak ponowne zapisywanie adresów URL lub uwierzytelnianie.
Lokalizowanie zawieszających się żądań przez sprawdzenie wykonania bieżących żądań
Dzięki temu można szybko określić, które żądania zawieszają się, sprawdzając aktualnie wykonywane żądania w usługach IIS.
Załóżmy, że żądasz strony, która wchodzi w nieskończoną pętlę z powodu usterki programowania. W kolejnych krokach ta strona jest loop.php. W Menedżerze zadań można zauważyć, że Php-cgi.exe jest zajęty, zużywając prawie 100 procent procesora CPU (jeśli masz wiele rdzeni procesora CPU, zobaczysz proces zużywający 1/# rdzeni całkowitego procesora CPU). Możesz określić, które żądanie jest zawieszone:
Wybierz pozycję Start, a następnie wybierz pozycję Menedżer usług Internet Information Services (IIS).
W widoku drzewa po lewej wybierz węzeł Serwer.
W obszarze IIS kliknij dwukrotnie pozycję Procesy robocze.
W obszarze Nazwa puli aplikacji kliknij dwukrotnie nazwę puli aplikacji, aby otworzyć widok Żądania . (W tym przykładzie jest RozwiązywanieProblemówPhp.)
Przełącz się do przeglądarki internetowej i odśwież stronę, jeśli upłynął limit czasu strony. Może to być konieczne w ramach tych kroków. Wróć do Menedżera usług IIS, a następnie odśwież widok Żądania .
Zwróć uwagę na listę aktualnie wykonywanych żądań, pokazujących żądanie do strony problemu, w tym przykładzie /loop.php. Wpis żądania pokazuje:
- Czy żądanie zostało wykonywane przez jakiś czas (upłynął czas).
- Adres URL żądania (w tym przykładzie /loop.php).
- Nazwa modułu (FastCGIModule).
- Etap wykonywania (ExecuteRequestHandler).
Można odświeżyć widok kilka razy, aby zaobserwować, że to samo żądanie jest nadal wykonywane w tej samej fazie, co wskazuje na zawieszające się żądanie.
Ustal, które żądanie jest zawieszone przy użyciu wiersza polecenia. Za pomocą wiersza polecenia można odfiltrować interesujące żądania, na przykład żądania do określonej aplikacji lub określonego adresu URL. Może służyć do automatyzowania skryptów monitorujących aktualnie wykonywane żądania. Otwórz okno wiersza polecenia, wybierając Start, a następnie Wiersz polecenia.
Przejdź do przeglądarki sieci Web, a następnie odśwież
http://localhost:84/loop.php
stronę. (Należy pamiętać, że loop.php jest nazwą przykładową; należy użyć nazwy strony). Aby wykonać poniższe kroki, może być konieczne ciągłe odświeżanie tej strony. Przejdź do wiersza polecenia.Uruchom następujące polecenie, aby wyświetlić listę żądań, które zostały wykonywane przez więcej niż jedną sekundę:
%windir%\system32\inetsrv\appcmd.exe list requests /elapsed:1000
Otrzymasz dane wyjściowe podobne do poniższego, z nazwą swojej strony zamiast loop.php.
REQUEST " fa000000080000026" (url:GET /loop.php, time:2840 msec, client:localhost, stage:ExecuteRequestHandler, module:FastCgiModule)
Odfiltruj zwrócone żądania, określając dowolną liczbę kryteriów na podstawie dostępnych atrybutów żądania. Aby na przykład wyświetlić tylko żądania do określonego adresu URL:
%windir%\system32\inetsrv\appcmd.exe list requests /url:/loop.php /elapsed:1000
Możesz również użyć polecenia AppCmd, aby wykonać bardziej złożone zapytania, na przykład określić wszystkie aplikacje, które mają długotrwałe żądania:
%windir%\system32\inetsrv\appcmd.exe list requests /elapsed:1000 /xml | %windir%\system32\inetsrv\appcmd list apps /in
Zostanie wyświetlona lista aplikacji podobnych do następujących:
APP "troubleshootingPhp/" (applicationPool:troubleshootingPhp)
Oto przykład podjęcia akcji na podstawie bieżących danych żądania: ponowne uruchomienie pul aplikacji z żądaniami, które były wykonywane przez ponad pięć sekund.
%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
Uzyskasz następujące dane wyjściowe z nazwą aplikacji:
"TroubleshootingPhp" successfully recycled