PHP'de yararlı hata mesajlarını nasıl alabilirim?


583

Oldukça sık bir PHP betiği çalıştıracağım ve boş bir ekran geri alacağım. Hata mesajı yok; sadece boş bir ekran. Nedeni basit bir sözdizimi hatası (yanlış köşeli ayraç, eksik noktalı virgül) veya başarısız bir işlev çağrısı veya tamamen başka bir şey olabilir.

Neyin yanlış gittiğini anlamak çok zor. Sorunu daraltmaya çalışırken, kod yorumlama, her yerde "yankı" ifadeleri girerek sonunda. Ama elbette daha iyi bir yol olmalı, değil mi?

PHP'nin Java gibi yararlı bir hata mesajı üretmesini sağlamanın bir yolu var mı?




4
@JuannStrauss, Bu çok yetersiz. Ve sonunda hataları gördüğünüzde, diyor T_PAAMAYIM_NEKUDOTAYIM. Ya da belki "tamsayı örneği olmalı, tamsayı verilmelidir" .
Pacerier

Yanıtlar:


498

Sözdizimi hataları için php.ini dosyasında hata görüntülemeyi etkinleştirmeniz gerekir. Varsayılan olarak bunlar, "müşteri" nin hata mesajlarını görmesini istemediğiniz için kapalıdır. 2 yönerge hakkında bilgi için PHP belgelerindeki bu sayfaya bakın: error_reportingve display_errors. display_errorsmuhtemelen değiştirmek istediğiniz kişidir. Php.ini dosyasını değiştiremezseniz, bir .htaccess dosyasına aşağıdaki satırları da ekleyebilirsiniz:

php_flag  display_errors        on
php_value error_reporting       2039

error_reportingTüm hataları almak için PHP sürümünüz için E_ALL (Gumbo tarafından belirtildiği gibi) değerini kullanmayı düşünebilirsiniz . Daha fazla bilgi

Diğer 3 öğe: (1) Hata günlüğü dosyasını tüm hatalara sahip olacağı için kontrol edebilirsiniz (günlük kaydı devre dışı bırakılmadığı sürece). (2) Aşağıdaki 2 satırı eklemek, sözdizimi hatası olmayan hatalarda hata ayıklamanıza yardımcı olacaktır:

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

(3) Başka bir seçenek, yazarken hataları kontrol eden bir düzenleyici kullanmaktır. yazarken PhpEd . PhpEd ayrıca daha ayrıntılı bilgi sağlayabilir bir hata ayıklayıcı ile birlikte gelir. (PhpEd hata ayıklayıcı xdebug'a çok benzer ve her şeyi yapmak için 1 program kullandığınızda doğrudan düzenleyiciye entegre olur.)

Cartman'ın bağlantısı da çok iyi: http://www.ibm.com/developerworks/library/os-debug/


25
2039 değeri E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE. Bkz. Docs.php.net/manual/tr/errorfunc.constants.php
Gumbo

.Htaccess dosyası seçeneğini seviyorum. Genel web sitesinin bir parçası olmayan bir alanda hata ayıklamama yardımcı oluyor. Bu ipucu için çok teşekkürler!
jacekn

1
Ben (ve orada onları arıyor) dosyaya günlüğe kaydetme hataları eklemek en iyi çözümdür. Sayfadaki hataları görüntülemeye güvenmeyin - harap edebilirler, üretim sitesi için hata raporlarını açmayı unutabilirsiniz ve bu gelecekte sorun
yaratacaktır

455

Aşağıdakiler tüm hataları etkinleştirir:

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

Ayrıca aşağıdaki bağlantılara bakın


28
Bu değişiklikleri .ini dosya düzeyinde yapmak en iyisidir. Bir komut dosyasından hata raporunu açmak işe yaramaz, çünkü sözdizimi hatalarına veya derleme aşamasını öldüren diğer önemli hatalara yardımcı olmaz. Komut dosyası yürütülmeye başlamadan çok önce öldürülür ve raporlama geçersiz kılmalarına ulaşır.
Marc B

Gerçekten haklısın. Taşımanın kendi sunucunuza olduğunu fark etmedim.
Eljakim

6
Doğru php.ini dosyasını bulmak için phpinfo () komutunu çalıştırın. Yüklü Yapılandırma Dosyası satırını arayın .
borrible

1
Derleme aşamasında oluşan hataları arıyorsanız, genellikle /var/log/apache2/error.log
csi

1
Bu parametre php7'de katı yazım etkinleştirildiğinde başarısız olur, çünkü ikinci parametresi ini_setbir dizedir.
PeeHaa

175

Aşağıdaki kod tüm hataları göstermelidir:

<?php

// ----------------------------------------------------------------------------------------------------
// - Display Errors
// ----------------------------------------------------------------------------------------------------
ini_set('display_errors', 'On');
ini_set('html_errors', 0);

// ----------------------------------------------------------------------------------------------------
// - Error Reporting
// ----------------------------------------------------------------------------------------------------
error_reporting(-1);

// ----------------------------------------------------------------------------------------------------
// - Shutdown Handler
// ----------------------------------------------------------------------------------------------------
function ShutdownHandler()
{
    if(@is_array($error = @error_get_last()))
    {
        return(@call_user_func_array('ErrorHandler', $error));
    };

    return(TRUE);
};

register_shutdown_function('ShutdownHandler');

// ----------------------------------------------------------------------------------------------------
// - Error Handler
// ----------------------------------------------------------------------------------------------------
function ErrorHandler($type, $message, $file, $line)
{
    $_ERRORS = Array(
        0x0001 => 'E_ERROR',
        0x0002 => 'E_WARNING',
        0x0004 => 'E_PARSE',
        0x0008 => 'E_NOTICE',
        0x0010 => 'E_CORE_ERROR',
        0x0020 => 'E_CORE_WARNING',
        0x0040 => 'E_COMPILE_ERROR',
        0x0080 => 'E_COMPILE_WARNING',
        0x0100 => 'E_USER_ERROR',
        0x0200 => 'E_USER_WARNING',
        0x0400 => 'E_USER_NOTICE',
        0x0800 => 'E_STRICT',
        0x1000 => 'E_RECOVERABLE_ERROR',
        0x2000 => 'E_DEPRECATED',
        0x4000 => 'E_USER_DEPRECATED'
    );

    if(!@is_string($name = @array_search($type, @array_flip($_ERRORS))))
    {
        $name = 'E_UNKNOWN';
    };

    return(print(@sprintf("%s Error in file \xBB%s\xAB at line %d: %s\n", $name, @basename($file), $line, $message)));
};

$old_error_handler = set_error_handler("ErrorHandler");

// other php code

?>

Bu kodla boş bir sayfa oluşturmanın tek yolu, kapatma işleyicisinde bir hatayla karşılaşmanızdır. Bunu test etmeden kendi cms'imden kopyalayıp yapıştırdım, ancak eminim işe yarıyor.


4
Bu koddan boş bir sayfa alıyorum. Ne demek "kapatma işleyicisinde bir hata var" ve sorunu çözmek için ne yapmalıyım?
Paolo M

@PaoloM, ShutdownHandlerYukarıdaki işlevde bir hata söylüyor . Temel olarak bu, doğru hata işleme yerine bir stopgap hack'idir.
Pacerier

Teşekkürler, yararlı oldu, ancak E_NOTICEbu işlevdeki hataları nasıl devre dışı bırakabilirim ?
MajAfy

Bu doğru çözümdür, ancak hata oluştuğunda bilgi bozukluğuna dikkat edin ... (kullanıcılara yankı yapmak yerine günlüğe kaydetmeyi tercih edin)
Sam Jason Braddock

1
Symfony doğru ölümcül hataları yakalayamıyorsa bunu kullanıyorum.
Bobin

61

Hatalar ve uyarılar genellikle php.ini ayarlarınızda ....\logs\php_error.logveya bu ....\logs\apache_error.logayarlara bağlı olarak görünür .

Ayrıca yararlı hatalar genellikle tarayıcıya yönlendirilir, ancak geçerli html olmadığı için görüntülenmezler.

Yani "tail -f"günlük dosyalarınızı ve boş bir ekran aldığınızda IE görmek" view "->" kaynak "menü seçenekleri ham çıktı görüntülemek için.


13
Ne yazık ki, sayfa görüntüleme kaynağında da hiçbir şey görüntülenmiyor.
Matthew Scharley

2
Ayrıştırma hataları, başka bir yerde hangi ayara sahip olduğunuzdan bağımsız olarak Apache'nin hata günlüğünde görünmelidir. Sunucu üzerinde kontrolünüz yoksa, apache hata günlüğünü almak zor olabilir, ancak sağlayıcınızla konuşmanızı öneririz ve hata günlüğünü size göstermenin yolları vardır. Bunun dışında, sadece başka ne var önerebilirsiniz - üretim dağıtmadan önce yerel geliştirme sunucunuzdaki hataları ayrıştırma için kodunuzu veteriner. Ayrıca, Eclipse'nin PDT'si gibi bir doğrulama IDE'si çok yardımcı olabilir.
Guss

5
Buna geri dönersek, son zamanlarda günlüklerde bile hata üretmeyen ve sunucuya xdebug yükleyene kadar kendini göstermeyen bir yığın taşması sorunu yaşadım. Gah.
Matthew Scharley

Php.ini dosyasını değiştiremezseniz, içinde bir .htaccess dosyası oluşturun php_flag display_errors 1.
Tom

59

Hata ayıklamak istediğiniz dosyaya aşağıdaki satırları ekleyebilirsiniz:

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

Bu, PHP'nin hataları günlüğe bildirmesini sağlayan php.ini dosyasındaki varsayılan ayarları geçersiz kılar.


2
Bu doğru. Bu durumda, değerler ini'de doğrudan ayarlanmalıdır - saf bir geliştirme ortamı için bu yine de tercih edilebilir.
Tomalak

53

PHP Yapılandırması

Php.ini dosyasındaki 2 girdi , hataların çıktısını belirler:

  1. display_errors
  2. error_reporting

Gelen üretimi , display_errorsgenellikle olarak ayarlanır Off(üretim sahalarında hata ekranı genellikle arzu edilmez, çünkü iyi bir şeydir hangisi!).

Ancak, geliştirme sırasında , Onhataların görüntülenmesi için ayarlanmalıdır . Kontrol edin !

error_reporting(PHP 5.3'ten itibaren) varsayılan olarak ayarlanmıştır E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(yani, bildirimler, katı standartlar ve kullanımdan kaldırma bildirimleri hariç her şey gösterilir). Şüphe duyduğunuzda, tüm hataları E_ALLgörüntüleyecek şekilde ayarlayın . Kontrol !

Vay vay! Kontrol yok! Php.ini dosyamı değiştiremiyorum!

Bu utanç verici. Genellikle paylaşılan ana bilgisayarlar php.ini dosyasının değiştirilmesine izin vermez ve bu nedenle bu seçenek ne yazık ki kullanılamaz. Ama korkma! Biz diğer seçenekleri !

Çalışma zamanı yapılandırması

İstenilen komut dosyasında, çalışma zamanında php.ini girdilerini değiştirebiliriz! Yani, komut dosyası çalıştığında çalışır! Tatlı!

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

Bu iki satır yukarıdaki php.ini girişlerini değiştirmekle aynı etkiyi yapacak! Müthiş!

Hala boş bir sayfa / 500 hatası alıyorum!

Bu, komut dosyasının çalışmadığı anlamına gelir! Bu genellikle bir sözdizimi hatası olduğunda olur!

Sözdizimi hatalarıyla, komut dosyası çalışma zamanına bile ulaşamaz. Derleme zamanında başarısız olur , yani değiştirmediyseniz hataların görüntülenmesine izin vermeyebilecek olan php.ini içindeki değerleri kullanır.

Hata günlükleri

Ayrıca, PHP varsayılan olarak hataları günlüğe kaydeder. Paylaşılan barındırmada, özel bir klasörde veya rahatsız edici komut dosyasıyla aynı klasörde olabilir.

Eğer php.ini'ye erişiminiz varsa, onu error_loggirişin altında bulabilirsiniz .


30

Raporlarınızı daha da güzelleştirecek " xdebug " adlı gerçekten kullanışlı bir uzantı var .


2
Aslında, bu çok kullanışlı bir hata ayıklama aracıdır - hata mesajlarını tam yığın izleri ve değişken dökümler ve her şeyle çok daha ayrıntılı hale getirir.
hbw

2
Evet. Daha sonra VimDebugger eklentisi gibi bir şey kullanarak kodunuzda ilerleyin ve nerede yanlış gittiğini öğrenin.
Sander Marechal

1
Burada xdebug ile NetBeans. Çok harika. PHP (genellikle ASP.NET) için yeniyim ve daha önce yankı ifadeleri veriyordum.
Bazı Canuck

30

Ben her zaman php betiğinin en üstünde bu sözdizimini kullanıyorum.

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');  //On or Off

3
Özür dilerim, ancak gönderilen diğer cevapları okumadığınız için -1. Bu, .htaccess'te birkaç kez belirtildiği gibi halledilir.
Matthew Scharley

12
her zamanki "ücretsiz hosting" .htaccess'i görmezden gelir
FDisk

27

Hızlı, uygulamalı sorun giderme için normalde burada SO'ya öneriyorum:

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

sorun giderme senaryosunun başına konulmalıdır. Bu mükemmel değil, mükemmel varyant, bunu da etkinleştirmeniz php.inive sözdizimi ve başlangıç ​​hatalarını yakalamak için PHP'deki hataları günlüğe kaydetmenizdir.

Burada özetlenen ayarlar, hangi PHP sürümüne bakılmaksızın katı olanlar da dahil olmak üzere tüm hataları, bildirimleri ve uyarıları görüntüler.

Dikkate alınacak diğer şeyler:

Ayrıca bakınız:


27

Son hatayı veya uyarıyı görünür hale getirmek için bir kanca kaydetmek mümkündür.

function shutdown(){
  var_dump(error_get_last());
}

register_shutdown_function('shutdown');

Bu kodu index.php'nin başına eklemek sorunları ayıklamanıza yardımcı olur.


1
Bu, hata göstermeyen ancak sıfır günlük erişimine izin veren webhost'larda sıkışan insanlar için saf altın
Rafael Mena Barreto

18

Bu, yüklü ve çalışma zamanı yapılandırması sorunudur

Derleme veya ayrıştırma adımı sırasında bir sözdizimi hatası veya ayrıştırma hatası oluştuğunu bilmek önemlidir, bu da PHP'nin kodunuzu yürütme şansı bile olmadan önce kefaletle alacağı anlamına gelir. Bu nedenle display_errors, çalışma zamanı sırasında PHP'nin yapılandırmasını değiştiriyorsanız (bu, ini_setkodunuzda kullanmaktan bir çalışma zamanı yapılandırma dosyası olan .htaccess'i kullanmaya kadar her şeyi içerir ), yalnızca varsayılan yüklü yapılandırma ayarları yürürlüktedir.

WSOD'un geliştirilmesinde her zaman nasıl önlenir

Eğer emin olun istediğiniz bir WSOD önlemek için yüklenen yapılandırma dosyası vardır display_errorsve error_reportinghiç seti -1( tüm bitleri bakılmaksızın PHP hangi versiyonunun açık olduğundan sağlar, çünkü bu sen koşu eşdeğer E_ALL olduğunu ). E_ALL sabit değerini kodlamayın, çünkü bu değer PHP'nin farklı sürümleri arasında değişebilir.

Yüklü yapılandırma Yüklü ya olan php.inidosya veya apache.confveya httpd.confveya sanal ana dosyası. Bu dosyalar, başlangıç ​​aşamasında yalnızca bir kez okunur (örneğin, apache httpd veya php-fpm'yi ilk başlattığınızda) ve yalnızca çalışma zamanı yapılandırma değişiklikleri tarafından geçersiz kılınır. Emin olmak olduğunu display_errors = 1ve error_reporting = -1bir bakın asla Yüklü yapılandırma dosyası teminat altın WSOD bakılmaksızın böyle bir çalışma zamanı değişiminden önce meydana sözdizimi veya ayrıştırma hatası ini_set('display_errors', 1);veya error_reporting(E_ALL);gerçekleşebilir.

(Php.ini) yüklü yapılandırma dosyalarınızı bulma

Yüklü yapılandırma dosyalarınızı bulmak için sadece aşağıdaki kodla yeni bir PHP dosyası oluşturun ...

<?php
phpinfo();

Ardından tarayıcınızı oraya yönlendirin ve genellikle üstünüzde bulunan ve yüklenen tüm yapılandırma dosyalarınızın mutlak yolunu içeren Yüklü Yapılandırma Dosyası ve ayrıştırılan Ek .iniphpinfo() dosyalarına bakın.

(none)Dosya yerine görüyorsanız , Yapılandırma Dosyası (php.ini) Yolunda bir php.ini dosyanız olmadığı anlamına gelir . Böylece PHP ile birlikte gelen stok php.ini'yi buradan indirebilir ve bunu yapılandırma dosyası yolunuza php.ini olarak kopyalayabilir ve ardından php kullanıcınızın o dosyadan okumak için yeterli izinlere sahip olduğundan emin olabilirsiniz. Yüklemek için httpd veya php-fpm'yi yeniden başlatmanız gerekir. Unutmayın, bu PHP kaynağı ile birlikte gelen geliştirme php.ini dosyasıdır. Bu yüzden lütfen üretimde kullanmayın!


Sadece bunu üretimde yapma

Bu, bir WSOD'nin geliştirilmesinden kaçınmanın en iyi yoludur. PHP betiğinizin üstüne koymanızı ini_set('display_errors', 1);ya error_reporting(E_ALL);da üstüne koymanızı ya da burada yaptığınız gibi .htaccess'i kullanmanızı öneren herkes , yüklenen yapılandırma dosyanız varsa bir sözdizimi veya ayrıştırma hatası oluştuğunda (burada da olduğu gibi) bir WSOD'den kaçınmanıza yardımcı olmayacaktır. gelmiştir display_errorskapattı.

Birçok kişi (ve PHP'nin stok kurulumları), display_errorsvarsayılan olarak kapalı olan bir üretim ini dosyası kullanır ve bu da genellikle burada yaşadığınız aynı hayal kırıklığına neden olur. PHP başladığında zaten kapalı olduğundan, bir sözdizimi veya ayrıştırma hatasıyla karşılaşır ve çıktısı olmayan bir şey kefaletle karşılanır. Sen senin bekliyoruz ini_set('display_errors',1);PHP komut dosyası üstündeki o kaçınılması gerekirdi, ama o çalışma zamanını ulaşmış asla çünkü PHP kodunuzu ayrıştırmak olamaz eğer mesele olmaz.


17

Süper iyiyseniz, deneyebilirsiniz:

$test_server = $_SERVER['SERVER_NAME'] == "127.0.0.1" || $_SERVER['SERVER_NAME'] == "localhost" || substr($_SERVER['SERVER_NAME'],0,3) == "192";

ini_set('display_errors',$test_server);
error_reporting(E_ALL|E_STRICT);

Bu, yalnızca yerel olarak çalışırken hataları görüntüler. Ayrıca, uygun olan yerlerde başka yerlerde kullanmak için test_server değişkenini de verir.

Komut dosyası çalıştırmadan önce meydana gelen hatalar yakalanmaz, ancak yaptığım hataların% 99'u için bu bir sorun değildir.


2
Yerel ve üretim ortamları arasında ayrım yapıyorsanız, üretim kodu olabilen kodda değil, yalnızca global (php.ini dosyasında) hataları etkinleştirmeniz veya devre dışı bırakmanız gerekir. Üretim ortamında bir üretim web sitesinde hata ayıklamanız gerekiyorsa ve yalnızca hataları görüntülemenizi istiyorsanız $_SERVER['REMOTE_HOST'], istemcinin siz olup olmadığını kontrol etmek için kullanın .
Jaap Haagmans

17

Sayfanın üst kısmında bir parametre seçin

error_reporting(E_ERROR | E_WARNING | E_PARSE);

16

Bunu devam ettirmek ve uygun hale getirmek için php.ini dosyanızı düzenleyebilirsiniz. Genellikle /etc/php.iniveya içinde depolanır /etc/php/php.ini, ancak php.inibarındırma sağlayıcınızın kurulum yönergelerine bağlı olarak daha fazla yerel dosyanın üzerine yazabilir. En son hangisinin yüklendiğinden emin olmak phpinfo()için Loaded Configuration Fileen üstteki dosyayı kontrol edin .

Bu dosyada display_errors arayın. Sadece 3 örneği olmalı ve bunlardan 2'si yorumlanmalıdır.

Önerilmeyen satırı şu şekilde değiştirin:

display_errors = stdout

16

Eğer yardımcı olacak Dunno, ama burada php projeleri için benim standart yapılandırma dosyası bir parçasıdır. Kendi sunucumda bile apache yapılandırmalarına çok fazla bağımlı olma eğiliminde değilim.

Hiçbir zaman kaybolan hata sorunum yok, bu yüzden belki de burada bir şey size bir fikir verecektir.

APPLICATON_LIVE gösterilecek şekilde düzenlendi

/*
APPLICATION_LIVE will be used in process to tell if we are in a development or production environment.  It's generally set as early as possible (often the first code to run), before any config, url routing, etc.
*/

if ( preg_match( "%^(www.)?livedomain.com$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', true);
} elseif ( preg_match( "%^(www.)?devdomain.net$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', false);
} else {
    die("INVALID HOST REQUEST (".$_SERVER["HTTP_HOST"].")");
    // Log or take other appropriate action.
}


/*
--------------------------------------------------------------------
DEFAULT ERROR HANDLING
--------------------------------------------------------------------
Default error logging.  Some of these may be changed later based on APPLICATION_LIVE.
*/
error_reporting(E_ALL & ~E_STRICT);
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");
ini_set ( "log_errors", 1);
ini_set ( "log_errors_max_len", 0);
ini_set ( "error_log", APPLICATION_ROOT."logs/php_error_log.txt");
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");

if ( ! APPLICATION_LIVE ) {
    // A few changes to error handling for development.
    // We will want errors to be visible during development.
    ini_set ( "display_errors", "1");
    ini_set ( "display_startup_errors", "1");
    ini_set ( "html_errors", "1");
    ini_set ( "docref_root", "http://www.php.net/");
    ini_set ( "error_prepend_string", "<div style='color:red; font-family:verdana; border:1px solid red; padding:5px;'>");
    ini_set ( "error_append_string", "</div>");
}

@Eli, Bu sayfa isteği başına bir çalışma zamanı yükü var .
Pacerier

hata ayıklama ayarları gözden kaçan kavram için 1 yukarı sunucu yapılandırılır, ancak dağıtma veya bakım (geliştirme aşamasında) sırasında iyi
justnajm

15
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);

Ayrıca xdebug ile daha detaylı bilgi alabilirsiniz .


Xdebug php.ini
jewelhuq

15

PHP'de hataların ve istisnaların daha iyi görüntülenmesi için Nette Tracy'yi öneriyorum :

Nette Tracy ekran görüntüsü


3
Tracy, orijinal mesajda açıklandığı gibi durumlarda çıktı sağlamak için tüm ekran hatalarının ve hata raporlama seçeneklerinin doğru ayarlanmasıyla ilgilenir ... Bu araç özellikle askerlere hitap etmek için yararlıdır "Herkes iyi PHP hata ayıklama ipuçları, araçlar ve teknikler önerebilir mi? ".
Jan Drábek

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

10
error_reporting(E_ALL | E_STRICT);

Ve php.ini dosyasındaki görüntü hatalarını açın


9

Kendi hata işleyicinizi PHP'ye kaydedebilirsiniz . Örneğin, tüm hataların bir dosyaya dökülmesi, bu belirsiz durumlarda size yardımcı olabilir. Geçerli hata raporunuz ne olursa olsun, işlevinizin çağrılacağını unutmayın . Çok temel 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');

7

PHP'den yararlı hatalar almak için ihtiyacınız olan iki anahtar satır:

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

Diğer katılımcılar tarafından belirtildiği gibi, bunlar güvenlik nedeniyle varsayılan olarak kapalıdır. Yararlı bir ipucu olarak - sitenizi kurarken, farklı ortamlarınız için bir anahtar yapmak kullanışlı olur, böylece bu hatalar yerel ve geliştirme ortamlarınızda varsayılan olarak AÇIK olur. Bu, aşağıdaki kodla gerçekleştirilebilir (ideal olarak index.php veya config dosyanızda, böylece başlangıçtan itibaren aktif olur):

switch($_SERVER['SERVER_NAME'])
{
    // local
    case 'yourdomain.dev':
    // dev
    case 'dev.yourdomain.com':
        ini_set('display_errors',1);
        error_reporting(E_ALL);
    break;
    //live
    case 'yourdomain.com':
        //...
    break;
}


6

php.ini dosyanızı açın, şu şekilde ayarlandığından emin olun:

display_errors = On

sunucunuzu yeniden başlatın.


6

Kod düzenleyiciniz olarak PHPStorm'u da denemek isteyebilirsiniz. Editörde yazarken birçok PHP ve diğer sözdizimi hatalarını bulacaksınız.


6

bir ubuntu kullanıcısıysanız, terminalinize gidin ve bu komutu çalıştırın

sudo tail -50f /var/log/apache2/error.log

burada son 50 hata görüntülenir. error.logApache2 için tüm hataları kaydeden bir hata dosyası var .


5

Tam hata raporlamayı açmak için bunu komut dosyanıza ekleyin:

error_reporting(E_ALL);

Bu, minimum uyarıların bile ortaya çıkmasına neden olur. Ve her ihtimale karşı:

ini_set('display_errors', '1');

Hataların görüntülenmesini zorlar. Bu, üretim sunucularında kapatılmalıdır, ancak geliştirirken değil.


Tomalak'ın cevabında olduğu gibi, bu sözdizimi hataları için çalışmaz.
Darryl Hein

5

“HATALAR”, geliştiricilerin hatalarını bilmesi ve sistemin mükemmel çalışmasını sağlamak için onları çözmesi için en faydalı şeylerdir.

PHP, geliştiricilere neden ve nerede kodlarının hataları aldığını bilmek için daha iyi yollar sunar, bu nedenle geliştiriciler kodlarını birçok yönden daha iyi hale getirebilir.

Tüm hata mesajlarını almak için komut dosyasının üstüne aşağıdaki iki satırı yazmanın en iyi yolları:

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

IDE'nizde xdebug gibi hata ayıklayıcı araçlarını kullanmanın başka bir yolu .


4

Tam hata raporlamayı etkinleştirebilirsiniz (bildirimler ve katı iletiler dahil). Bazı insanlar bunu çok ayrıntılı buluyor, ama denemeye değer. Set error_reportingiçin E_ALL | E_STRICTphp.ini'nize.

error_reporting = E_ALL | E_STRICT

E_STRICT kullanımdan kaldırılmış işlevler konusunda sizi bilgilendirir ve belirli görevleri gerçekleştirmenin en iyi yöntemleri hakkında önerilerde bulunur.

Bildirim istemiyorsanız, ancak diğer ileti türlerini yararlı buluyorsanız, bildirimleri hariç tutmayı deneyin:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

Ayrıca display_errorsphp.ini dosyasında da etkinleştirildiğinden emin olun . PHP sürümünüz 5.2.4'den daha eskiyse, şu şekilde ayarlayın On:

display_errors = "On"

Sürümünüz 5.2.4 veya daha yeniyse, şunu kullanın:

display_errors = "stderr"

4

Error_reporting ve display_errors ini ayarlarının yanı sıra, web sunucunuzun günlük dosyalarından SYNTAX hataları alabilirsiniz. PHP geliştirirken editörüme geliştirme sistemimin web sunucusu günlüklerini yüklerim. Bir sayfayı test ettiğimde ve boş bir ekran bulduğumda, günlük dosyası bayat ve editörüm yeniden yüklemek isteyip istemediğimi sorar. Yaptığımda, alta atlıyorum 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

3

Nginx kullananlar ve dosya için beyaz bir ekranı olanlar için <?php echo 123;. Benim durumumda nginx yapılandırma dosyasında PHP için bu gerekli seçeneği yoktu:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Bu seçenek fastcgi_params dosyasında değildi, bu yüzden PHP işe yaramadı ve günlüklerde herhangi bir hata yoktu.


Aynı sorunu vardı ve onun nedeniyle Nginx varsayılan yapılandırma dosyası bu satırı eksik.
Salem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.