Aracılığıyla paylaş


Başarısız İstek İzleme ile PHP hatalarını giderme

Şunlar için geçerlidir: Internet Information Services

PHP'yi çalıştırırken bazen bir hata koşulunu tanılamak için bir hata sayfasını incelemek mümkün değildir. Bu durum şu durumda oluşabilir:

  • Hangi URL'nin hatayla karşılaştığını bilmiyorsunuz.
  • Hata aralıklı olarak gerçekleşir ve el ile yeniden oluşturamazsınız (hata, kullanıcı girişine veya nadiren gerçekleşebilecek dış çalışma koşullarına bağlı olabilir).
  • Hata yalnızca üretim ortamında oluşur.

Bu gibi durumlarda, hatanın ne olduğunu tanımlamak zordur ve tanılamak daha da zordur. İstek günlüklerini veya hata günlüğünü inceleyerek hangi URL'lerin hataya neden olduğunu belirleyebilirsiniz, ancak yine de hatanın neden olduğunu saptamada sorun yaşayabilirsiniz.

Internet Information Services (IIS), belirli isteklerin ayrıntılı yürütme izlemelerini otomatik olarak yakalayan hata tanımları oluşturmanıza olanak tanıyan Başarısız İstek İzleme ile bu zor hata koşullarını izlemeyi ve tanılamayı kolaylaştırır. Bkz . IIS'de izlemeyi kullanarak Başarısız İstek sorunlarını giderme ve Yeniden yazma kurallarını izlemek için Başarısız İstek İzleme'yi kullanma.

PHP tanılamalarına yardımcı olmak için bu izlemeler, istek giriş verilerini ve PHP'den gelen yanıt verilerini yakalamak için de yapılabilir. Bu, bu hata koşullarını tanılamak için gereken içgörüleri sağlayabilir.

Oldukça yaygın bir uygulama sorunu da yoğun kaynak kullanan bir döngüye giren veya kilitleyen koddur. Bunun nedeni genellikle aşağıdakiler olabilir:

  • Bir dosyada veya ağda engelleyici G/Ç işleminin tamamlanması uzun sürer(örneğin, uzak bir Web hizmetine veya veritabanına erişirken).
  • Kodda, cpuyu döndürme veya belleği ayırma gibi sonsuz (veya uzun süre çalışan) bir döngüye girmesine neden olan bir hata vardır.
  • Kod, paylaşılan bir kaynakta veya kilitte kilitleniyor veya kilitleniyor.

Bu koşullar, isteği yapan kullanıcının uzun bekleme süreleri veya zaman aşımlarıyla sonuçlanır ve koşullar uygulamanın ve hatta sunucunun tamamının performansını olumsuz etkileyebilir.

IIS, şu anda yürütülen istekleri inceleyerek hangi isteklerin asılı olduğunu belirlemek için hızlı bir yol sağlar.

Bilinmeyen veya yeniden oluşturması zor hataları tanılamak için Başarısız İstek İzleme'yi kullanma

Başarısız İstek İzleme, aralıklı veya yeniden üretilmesi zor hata koşullarını izlemenin ve istek, yanıt ve IIS modüllerindeki izleme olaylarının zenginliği hakkındaki ayrıntıları inceleyerek hata koşullarını tanılamanın etkili bir yolu olabilir.

Başarısız İstek İzleme bir üretim ortamında kullanılabilir çünkü yalnızca belirli hata tanımını karşılayan izleme isteklerini izlemek için yapılandırılabilir ve başarılı istekler için izleme ek yükünün çoğunu önleyebilir.

Bir sitede Başarısız İstek İzleme'yi etkinleştirmek için (bu örnekte TroubleshootingPhp kullanıyoruz), aşağıdaki adımları kullanın:

  1. IIS Yöneticisi'ne geçin. Kapalıysa Başlat'ı ve ardından Internet Information Services (IIS) Yöneticisi'ni seçin.

  2. Sunucu düğümünü genişletin ve ardından Siteler düğümünü genişletin.

  3. Soldaki ağaç görünümünde sitenizin adını bulun ve seçin.

  4. IIS'nin altında Başarısız İstek İzleme Kuralları'ne çift tıklayın.
    Başarısız İstek İzleme Kuralları simgesine odaklanan I I S bölümünün ekran görüntüsü.

  5. Eylemler panelinde Site İzlemeyi Düzenle'yi seçin.

  6. Etkinleştir onay kutusunu seçin.

  7. Tamam'ı seçin.

  8. Şimdi Başarısız İstek İzleme kuralı oluşturun. Eylemler panelinde Ekle'yi seçin.

  9. Tüm içerik seçeneğini seçili bırakın.
    Tüm içerik seçeneğinin seçili olduğu Başarısız İstek İzleme Kuralı Ekle iletişim kutusunun ekran görüntüsü.

  10. İleri'yi seçin.

  11. Durum kodlarında400-999 girin.
    Durum kodu olarak 4 0 0 tire 9 9 9 girilmiş İzleme Koşullarını Tanımla ekranının ekran görüntüsü.

  12. İleri'yi seçin.

  13. Varsayılan izleme sağlayıcılarını etkin bırakın ve son'u seçin.

  14. Artık isteklerde bulunabilirsiniz. Bu adımlar için, isteklerin sitenizin diğer kullanıcıları tarafından yapıldığını ve isteklerinden veya yanıtlarından haberdar olmadığınız varsayın. Örneğin, Internet Explorer'ı kullanarak aşağıdaki istekleri yapın:

    • Istek http://localhost:84/hello.php
    • Istek http://localhost:84/products.php?productid=3
    • İstek http://localhost:84/products.php?productid=5 (bu sayfa hata oluşturur)
  15. Başarısız istek izlemesini bulun:

    • Başlat'ı ve ardından Komut İstemi'ni seçerek Komut İstemi penceresini açın.

    • Sitemiz için oluşturulan izleme günlüklerini listelemek için aşağıdaki komutu çalıştırın:

      %windir%\system32\inetsrv\appcmd.exe list traces /site.name:"TroubleshootingPhp"
      
    • Şuna benzer bir çıkış elde edersiniz:

      TRACE "troubleshootingPhp/fr000001.xml" (url:http://localhost:84/products.php?product=5,statuscode:500,wp:2864)
      
    • Çıkış, için bir istek /products.php?product=5için bir izleme günlüğü oluşturulduğunu ve bunun sonucunda HTTP 500 hatasına neden olduğunu gösterir. Size şunu söyler:

      • Products.php sayfası hataya neden oldu.
      • Hataya neden olan giriş büyük olasılıkla product=5, diğer sorgu dizeleri için hataları görmediğiniz için olur (bu sayfaya sık erişilirse bu sonuç daha doğru olur; bu durumda yalnızca bu sorgu dizesi için birden çok hata görürsünüz).
  16. Artık istek ve hatanın olası nedeni hakkında daha fazla bilgi toplamak için belirli bir izleme günlüğü edinebilirsiniz. Bunu yapmak için komut isteminden aşağıdaki komutu çalıştırın (önceki çıktıdaki izleme günlüğünün tırnak içinde bulunan kimliğini kullanarak):

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

    Bu, aşağıdakine benzer bir çıkışa sahip olmalıdır:

    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. İzleme günlüğünü inceleyin. Önceki çıkışta belirtilen yolu kullanarak izleme günlüğü dosyasını tarayıcıda açın (bu örnekte C:\inetpub\logs\FailedReqLogFiles\W3SVC2\fr000001.xml). Özet sekmesi istek hakkında temel bilgiler sağlar. Hata durumunun FastCGIModule tarafından ayarlandığını görebilirsiniz ve bu da hatanın PHP'den geldiğini gösterir. Diğer durumlarda, hatanın diğer IIS modüllerinden geldiğini görebilirsiniz. Bu durumda nedenini belirlemek için günlükteki izleme bilgilerinin zenginliğini kullanabilirsiniz. Ancak bu durumda, hata hakkında daha fazla içgörü elde etmek için PHP tarafından oluşturulan yanıtı görmeniz gerekir.
    İstek Tanılama web sayfasının İstek Özeti sekmesinin ekran görüntüsü.

  18. Sıkıştırılmış Görünüm sekmesini seçin. Bu sekme, isteğin işlenmesi sırasında IIS ve IIS modülleri tarafından oluşturulan izleme olaylarının ayrıntılı listesini gösterir.
    Sıkıştırılmış Görünüm sekmesinin vurgulandığı İstek Tanılaması ekranının ekran görüntüsü.

    Not:

    • GENERAL_REQUEST_START olay istek URL'si, fiil, site hakkındaki çalışma zamanı bilgileri ve isteğin gönderildiği uygulama gibi bazı temel bilgileri gösterir.
    • GENERAL_REQUEST_HEADERS olay, bazı durumlarda hangi kullanıcı girişinin hataya yol açabileceğini belirlerken önemli olabilecek üst bilgi listesinin tamamını verir.
    • GENERAL_RESPONSE_HEADERS ve GENERAL_RESPONSE_ENTITY_BUFFER olayları tam yanıt üst bilgilerini ve istemciye gönderilen yanıt gövdesini sağlar. Bu durumda, yanıt gövdesi hatayı tanılamak için gereken ek bilgileri sağlar ve yanlış ürün kimliğini gösterir.

bunlar, izleme günlüğünü incelerken göz önünde bulundurmanız gereken diğer bölümlerdir:

  • İstek Özeti paneli isteğin özetini, sonucunu sağlar ve ayrıca istek yürütme sırasındaki uyarı veya hata olaylarını vurgular.
  • İstek Ayrıntıları paneli, isteklerin yürütülmesine ilişkin hiyerarşik bir görünüm sağlar ve ayrıca olayları Modül bildirimleri, Kimlik Doğrulaması/Yetkilendirme gibi çeşitli kategorilere göre filtrelemenizi sağlar. Ayrıca, yürütmenin hangi bölümlerinin en uzun sürdüğünü anlamanıza yardımcı olan Performans Görünümü'nü de sunar.
  • Sıkıştırılmış Görünüm, istek yürütme hakkında zengin bilgiler de dahil olmak üzere olayların tam listesini sunar. IIS modüllerinin çoğu, yürütmeleri hakkında istek işlemenin çeşitli yönlerini ve sonucu anlamak için kullanılabilecek bilgiler üretir. URL yeniden yazma veya kimlik doğrulaması gibi karmaşık etkileşimlerle ilgili sorunları giderirken bu bilgiler çok değerli olabilir.

Geçerli isteklerin yürütülmesini inceleyerek asılı istekleri bulma

Bu, IIS'de şu anda yürütülen istekleri inceleyerek hangi isteklerin asılı olduğunu belirlemek için hızlı bir yol sağlar.

Bir programlama hatası nedeniyle sonsuz döngüye giren bir sayfa istediğinizi varsayalım. İzleyen adımlarda bu sayfa loop.php. Görev yöneticisinde Php-cgi.exe meşgul olduğunu ve CPU'nun yüzde 100'e yakınını tüketildiğini gözlemleyebilirsiniz (birden çok CPU çekirdeğiniz varsa, işlemin toplam CPU'nun 1/# çekirdeğini tükettığını görürsünüz). Hangi isteğin asılı olduğunu belirleyebilirsiniz:

  1. Başlat'ı ve ardından Internet Information Services (IIS) Yöneticisi'ni seçin.

  2. Soldaki ağaç görünümünde Sunucu düğümünde öğesini seçin.

  3. IIS altında Çalışan İşlemleri'ne çift tıklayın.

  4. Uygulama Havuzu Adı'nın altında uygulama havuzunuzun adına çift tıklayarak İstekler görünümünü açın. (Bu örnekte Sorun GidermePhp'tir.)
    Uygulama Havuzu Adı'nın vurgulandığı Çalışan İşlemleri ekranının ekran görüntüsü.

  5. Web tarayıcısına geçin ve sayfa zaman aşımına uğradıysa sayfayı yenileyin. Bu adımların tamamında yapılması gerekebilir. IIS Yöneticisi'ne geri dönün ve ardından İstekler görünümünü yenileyin.

  6. Şu anda yürütülen isteklerin listesini gözlemleyin ve bu örnekteki /loop.php sorun sayfasına yönelik isteği gösterir. İstek girişi şunları gösterir:

    • İsteğin bir süredir yürütüldüğünü (Geçen Süre).
    • İsteğin URL'si (bu örnekte , /loop.php).
    • Modül adı (FastCGIModule).
    • Yürütme aşaması (ExecuteRequestHandler).

Aynı isteğin aynı aşamada yürütülmeye devam ettiğini ve asılı isteği işaret ettiğini gözlemlemek için görünümü birkaç kez yenileyebilirsiniz.

  • Komut istemini kullanarak hangi isteğin asılı olduğunu belirleyin. Komut istemiyle, belirli bir uygulamaya veya belirli bir URL'ye yönelik istekler gibi ilgi çekici istekleri filtreleyebilirsiniz. Şu anda yürütülen istekleri izleyen betikleri otomatikleştirmek için kullanılabilir. Başlat'ı ve ardından Komut İstemi'ni seçerek Komut İstemi penceresini açın.

  • Web tarayıcısına geçin ve sayfayı yenileyin http://localhost:84/loop.php . ( loop.php örnek bir ad olduğunu unutmayın; sayfanızın adı kullanılmalıdır.) Aşağıdaki adımlar için bu sayfayı sürekli yenilemeniz gerekebilir. Komut istemine geçin.

  • Bir saniyeden uzun süredir yürütülen istekleri listelemek için aşağıdaki komutu çalıştırın:

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

    Aşağıdakine benzer bir çıkış alırsınız ve loop.php yerine sayfa adınızı alırsınız:

    REQUEST " fa000000080000026" (url:GET /loop.php, time:2840 msec, client:localhost, stage:ExecuteRequestHandler, module:FastCgiModule)
    
  • Kullanılabilir istek özniteliklerine göre herhangi bir sayıda ölçüt belirterek döndürülen istekleri filtreleyin. Örneğin, yalnızca belirli bir URL'ye yönelik istekleri göstermek için:

    %windir%\system32\inetsrv\appcmd.exe list requests /url:/loop.php /elapsed:1000
    
  • Daha karmaşık sorgular gerçekleştirmek için AppCmd komut bağlamasını da kullanabilirsiniz, örneğin, uzun süre çalışan istekleri olan tüm uygulamaları belirlemek için:

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

    Aşağıdakine benzer uygulamaların listesini alırsınız:

    APP "troubleshootingPhp/" (applicationPool:troubleshootingPhp)
    
  • Geçerli istek verilerini temel alan bir eylem gerçekleştirme örneği aşağıda verilmiştir: Uygulama havuzlarını beş saniyeden uzun süredir yürütülen isteklerle geri dönüştürme:

    %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
    

    Uygulamanızın adıyla birlikte aşağıdaki çıkışı alırsınız:

    "TroubleshootingPhp" successfully recycled
    

Daha fazla bilgi