PHP hata iletilerini almak nasıl?

16 Cevap php

PHP programlama oldukça sinir bozucu buluyorum. Oldukça sık denemek ve çalıştırmak komut ve sadece geri boş bir ekran alırsınız. Hiçbir hata iletisi, sadece boş ekran. Neden basit bir sözdizimi hatası (yanlış dirsek, eksik noktalı virgül), ya da başarısız bir işlev çağrısı, ya da tamamen başka bir şey olabilir.

Bu neyin yanlış gittiğini anlamaya çok zordur. Ben sorunu daraltmak için çalışırken, vb her yerde "echo" ifadeleri girerek, kodu yorum sonunda. Ama kesinlikle doğru, daha iyi bir yolu olmalı?.

So, is there a way to get PHP to produce useful error message like Java does? Can anyone recommend good PHP debugging tips, tools and techniques?

16 Cevap

Sözdizimi hataları için, php.ini hata ekranı etkinleştirmeniz gerekir. Eğer hata mesajları görünce bir "müşteri" istemiyorum çünkü varsayılan olarak bu kapalıdır. error_reporting ve display_errors: Check this page 2 direktifleri hakkında bilgi için PHP belgelerinde. display_errors muhtemelen değiştirmek istediğiniz biridir. . Eğer php.ini değiştirmek değil, aynı zamanda bir htaccess dosyasına aşağıdaki satırları ekleyebilirsiniz:

php_flag  display_errors        on
php_value error_reporting       2039

Sen (bamya tarafından belirtildiği gibi) error_reporing hataları tüm almak için PHP sürümü için E_ALL değerini kullanarak düşünebilirsiniz. more info

3 diğer ürün: (1) Bunu tüm hataları olacak gibi (günlük devre olmuştur sürece) hata günlük dosyasını kontrol edebilirsiniz. (2) Aşağıdaki 2 satırları ekleme sözdizimi hataları olmayan hataları ayıklama yardımcı olacaktır:

error_reporting(-1);
ini_set('display_errors', 'On');

(3) Başka bir seçenek gibi PhpEd olarak yazdığınız neden hatalarını denetleyen bir editör kullanmaktır. PhpED Ayrıca daha ayrıntılı bilgi verebilir bir hata ayıklayıcı ile geliyor. (PhpED debugger xdebug çok benzer ve her şeyi yapmak için 1 programı kullanmak böylece editörü içine doğrudan entegre.)

Cartman link da çok iyi: http://www.ibm.com/developerworks/library/os-debug/

Yanı sıra raporlar daha güzel yapacak "xdebug" adında gerçekten yararlı bir uzantısı vardır.

Için hızlı, hands-on giderme Ben normalde burada SO öneririz:

error_reporting(~0); ini_set('display_errors', 1);

sorun giderme altında yazısının başında koymak gerekir. Bu mükemmel bir varyantı da php.ini o etkinleştirmek ve sözdizimi ve açılış hatalarını yakalamak için PHP hataları günlüğe o ki, mükemmel değildir.

Burada özetlenen ayarları ne olursa olsun katı dahil olmak üzere bütün hataları, bildirimler ve uyarılar, PHP version gösterilecek.

Dikkate Sonraki şeyler:

  • Kurulum Xdebug ve IDE ile uzaktan hata ayıklama etkinleştirin.

De bakınız:

Sen ayıklamak istediğiniz dosyasında aşağıdaki satırları ekleyebilirsiniz:

error_reporting(E_ALL);
ini_set('display_errors', '1');

Bu sadece günlüğüne PHP rapor hataları yapmak php.ini içinde varsayılan ayarları geçersiz kılar.

PHP Configuration

2 girişleri php.ini hataları çıkışını dikte:

  1. display_errors
  2. error_reporting

In production, display_errors genellikle Off (üretim sitelerde hata ekranı genellikle arzu edilmez, çünkü iyi bir şeydir Hangi!) Ayarlanır.

Hataları görüntülenen olsun, böylece Ancak, development, bu On ayarlanmalıdır. Check!

error_reporting (PHP 5.3 gibi) E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED için varsayılan olarak ayarlanır (anlam, her şeyi bildirimler, sıkı standartlar ve amortisman bildirimler hariç gösterilmiştir). Şüphe, E_ALL görüntülemek all hataları için ayarlandığında. Check!

Whoa whoa! No check! I can't change my php.ini!

Bu bir utanç. Genellikle paylaşılan host kendi php.ini dosyasının değiştirilmesini izin vermez, ve bu yüzden, bu seçenek ne yazık ki kullanılamaz. Ama korkmayın! Biz diğer seçenekleri var!

Runtime configuration

İstediğiniz komut, biz çalışma zamanında php.ini girdileri değiştirebilir! Komut dosyası çalıştırıldığında, yani çalıştırmak olacak! Tatlı!

error_reporting(E_ALL);
ini_set("display_errors", "On");

Bu iki satır yukarıdaki gibi php.ini girdilerini değiştirerek aynı etkiyi yapacak! Başar!

I still get a blank page/500 error!

Bu komut dosyası bile çalıştırmak değil demektir! Eğer bir sözdizimi hatası varsa o zaman genellikle olur!

Yazım hataları ile, komut dosyası bile runtime almaz. Bu size değişmiş olmasaydı, hataların görüntülenmesini izin vermeyebilir ki, php.ini içindeki değerleri kullanacağız, yani compile time başarısız.

Error logs

Ayrıca, varsayılan günlükleri hataları PHP. Barındırma paylaşılan, özel bir klasör veya kusurlu dosyası olarak aynı klasörde olabilir.

Php.ini erişiminiz varsa, error_log giriş altında bulabilirsiniz.

Bu deneyin PHP error reporting reference tool. Bu çok iyi bir görsel referans ve bana karmaşık hata raporlama mekanizması anlamamıza yardımcı oldu.

error_reporting(E_ALL | E_STRICT);

Ve php.ini görüntüleme hataları açmak

FirePHP hem de yararlı olabilir.

PHP kendi error handler kayıt olabilirsiniz. Bir dosya tüm hataları damping örneğin, bu karanlık durumlarda size yardımcı olabilir. Işlev olursa olsun sizin akımı error_reporting olarak ayarlandığında, ne denir alacak unutmayın. Çok basit bir örnek:

function dump_error_to_file($errno, $errstr) {
    file_put_contents('/tmp/php-errors', date('Y-m-d H:i:s - ') . $errstr, FILE_APPEND);
}
set_error_handler('dump_error_to_file');

Sen (bildirimler ve sıkı mesajlar dahil) tam hata raporlama özelliğini etkinleştirebilirsiniz. Bazı insanlar bu çok ayrıntılı buluyorum, ama denemeye değer. error_reporting php.ini E_ALL | E_STRICT ayarlayın.

error_reporting = E_ALL | E_STRICT

E_STRICT önerilmiyor fonksiyonları ile ilgili sizi uyarır ve belirli görevleri yapmak için en iyi yöntemler hakkında öneriler verecektir.

Eğer bildirimleri istemiyorum, ancak diğer mesaj türleri yararlı bulursanız, bildirimler hariç deneyin:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

Ayrıca display_errors php.ini etkin olduğundan emin olun. PHP version 5.2.4 daha eski ise, onu set On:

display_errors = "On"

Lütfen sürüm 5.2.4 veya daha yeni ise, kullanın:

display_errors = "stderr"

Kenara error_reporting ve display_errors ini ayarı, web sunucunun günlük dosyalarından SÖZDİZİMİ hataları alabilirsiniz. Ben PHP gelişmekte olduğumda benim editör içine benim geliştirme sisteminin web sunucusu günlükleri yükleyin. Ben bir sayfayı test ve boş bir ekran bulduğumda, günlük dosyası bayat gider ve onu yeniden yüklemek istiyorsanız benim editörü sorar. Yapmam, ben alt atlamak ve sözdizimi hatası var. Örneğin:

[Sun Apr 19 19:09:11 2009] [error] [client 127.0.0.1] PHP Parse error:  syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\\webroot\\test\\test.php on line 9

Tam hata raporlama açmak için, komut bunu ekleyin:

error_reporting(E_ALL);

Bu bile minimal uyarılar göstermek neden olur. Ve, sadece bu durumda:

ini_set('display_errors', '1');

Hataların görüntülenmesini zorlar. Bu üretim sunucularında kapatılabilir, ama gelişmekte konum değil, ne zaman gerekir.

PHP Error hata raporlama için iyi bir seçimdir.

Çoğu hata raporlama kütüphanelerde çok daha güzelmiş, ve onlar anlamak kolaydır böylece bazı mesajları yeniden ayrıştırır.

Hata raporlama açılması ancak ancak sonradan dahil programlarda, onu açıyor programında etkili olması için görünmüyor, doğru çözümdür.

Böylece, hep ben aslında istiyorum burada aslında popüler çözüm olarak aynı kodu vardır (yani raporlama hatası açın) ve aynı zamanda daha sonra sayfa (Ben genellikle "genwrap.php" diyoruz) bir dosya / program oluşturun diyoruz.

Bu hata ayıklama uygulamak için 2 adım vardır;

One - genwrap.php oluşturmak ve bu kodu koyun:

<?php
error_reporting(-1);
ini_set('display_errors', 'On');

include($_REQUEST['page']);
?>

Two - Sen genwrap.php üzerinden gitmek ayıklamak istediğiniz program / sayfa bağlantısını değiştirmek,

Örn: değişiklik:

$.ajax('dir/pgm.php?param=val').done(function(data) { /* ... */

karşı

$.ajax('dir/genwrap.php?page=pgm.php&param=val').done(function(data) { /* ... */

Benim her zamanki sorun, maalesef görünmüyor "küçük, aptal" ayrıştırıcı hatalardır.

However, when a .PHP-File includes a file that has parser-errors, they are shown! So I had the idea of writing a little "executor-script" that is launched with the name of the buggy file as argument, i.e. example.com/sx.php?sc=buggy.php

Zaten belki de, başkasına yararlı olacaktır, baş ağrısı bir sürü beni kurtarmıştı :)

sx.php

$sc = $_GET["sc"];
if ((!isset($_GET["sc"]) && empty($_GET["sc"]))) {
    echo "Please select file to execute using ?sc= (you may omit the .PHP-extension)";
} else {
    $sc = $_GET["sc"];
    if (false==stripos('.php',$sc)) $sc.='.php';  // adjust this if your preferred extension is php5!
    require($sc);
}
?>

Geliştiriciler kendi hatalarını bilmek ve sistem mükemmel çalışma yapmak için bunları çözülmesi için "HATALAR" en yararlı şeylerdir.

PHP bu hatalar geliştiriciler birçok yönden daha iyi kod yapabilirsiniz bilerek neden ve nerede kod kendi parçası hataları oluyor, bu yüzden geliştiriciler bilmek için daha iyi yollar bazı sağlar.

  1. Best ways to write following two lines on the top of script to get all errors messages: error_reporting(E_ALL);
    ini_set("display_errors",”1”);
  2. Lütfen IDE xdebug gibi debugger araçları kullanmak için başka bir yolu.