PHP preg_match_all Fastcgi 500 hata

1 Cevap php

(Ben bir uzman değilim) bazı egzotik PHP kodu kurmaya çalışıyorum, ve ben 'preg_match_all' içeren bir PHP hattı üzerinde FastCGI hatası 500 olsun.

Ben satırı yorum yaparken, sayfa 200 (ama olması gerekiyordu nasıl) ile döndürülür.

Kod PHP, HTML ve veritabanından yüklenen JavaScript içeriğini ayrıştırma ve bitmiş sayfasına dönmek için onları beste.

Şimdi, bazı error_log girişleri etrafında koyarak ben Ancak çizgi sayfanın yüklenmesi sırasında birden çok kez vurmak. preg_match_all ile satır 500 nedeni olduğunu belirlemek ve olabilir Diğer durumlarda, satırı bir hata neden olmaz.

İşte tam benziyor nasıl:

preg_match_all ("/(<([\w]+)[^>]*>)((?:.|\n)*)(<\/\\2>)/",
                $part['data'], $tags, PREG_PATTERN_ORDER|PREG_OFFSET_CAPTURE);

Konu dize gibi görünen metnin bir parçasıdır:

<script> ... some javascript functions ... </script>

Edit: Bu kadar ve başka bir yerde düzgün çalışıyor kodu, yani bu çok iyi bir PHP ayar veya çevre fark olabilir. Ben FastCGI ile IIS6 PHP 5.2.13 kullanıyorum.

Edit: Hiçbir şey günlük dosyalarında belirtilir. En azından ben kontrol olanlar:

  • IIS Kayıtlar
  • Olay Günlükleri
  • PHP Günlüğü

Edit: jab11 has pointed out the problem, ancak henüz bir çözüm vardır:

Herhangi bir düşünce veya yön hoş olurdu.

1 Cevap

Düzenli ifadeler ile HTML işlemek için kötü bir fikir neden bu harika bir örnektir. Ben HTML kaynak dize, bazı kapanmamış etiketleri içeren regex bir kapanış etiketi bulmak için onun beyhude girişimi permütasyon her türlü denemek yapma (</\2> çünkü bir yığın taşması içine koşuyoruz bahse hazırım .) 32 KB'lık bir HTML dosyası olarak, arabası kapalı regex atmak kolay. Bu bir değil, diğer çalışır belkide yığın farklı bir sunucu üzerinde farklı bir boyutudur.

Hızlı bir test:

Ben (kapanış </html> etiketi çıkardıktan sonra) bu sayfanın kaynak koduna regex uygulanır. RegexBuddy hemen sonra <head> ve <body> etiketleri (başarıyla) eşleşen önce yaklaşık bir dakika boyunca katatonik gitti. <html> itibaren regex ayıklama o maç olamayacağını öğrenmek için regex motoru 970.257 adımlar aldığını gösterdi.