PHP hatalarını nasıl görüntüleyebilirim?


1731

Ben PHP ini dosyamı ( php.ini) kontrol ettim ve display_errorsayarlanır ve ayrıca hata raporlama E_ALL. Apache web sunucumu yeniden başlattım.

Hatta bu satırları betiğimin en üstüne koydum ve basit ayrıştırma hatalarını bile yakalamıyor. Örneğin, a ile değişkenler "$"bildiriyorum ve ifadeleri kapatmıyorum ";". Ancak tüm komut dosyalarım bu hatalarda boş bir sayfa gösteriyor, ancak aslında tarayıcı çıktımdaki hataları görmek istiyorum .

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

Yapacak ne kaldı?


8
Tam olarak neden bazen bazen işe yarayan ve başkaları değil çivi henüz, ama bir php komut dosyasında hataları hızlı bir şekilde değiştirmek isteyen herkes için (veya bir $_REQUESTparametre ile onları etkinleştirmek ) bu iki satır çoğu zaman işe yarayacak.
brandonscript

iyi php ini dosyasından xdebug etkinleştirerek hatanın ayrıntılarını görebilirsiniz.
jewelhuq

İşte konuyu kapsıyorsa hızlı bir makale - blog.phplogger.com/2019/03/10/error-message-visibility-in-php
Bogdans

Yanıtlar:


3200

Bu benim için her zaman işe yarar:

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

Ancak, bu PHP'nin ayrıştırma hatalarını göstermesini sağlamaz - bu hataları göstermenin tek yolu php.ini dosyanızı bu satırla değiştirmektir:

display_errors = on

(erişiminiz yoksa php.ini, bu satırı koymak .htaccessda işe yarayabilir):

php_flag display_errors 1

9
Ayrıca, bu 3 satırı kullanabileceğinizi ve ardından ('fileImWorkingOn.php'); öğesini de kullanabileceğinizi unutmayın. Sonra sözdizimi hatalarını da yakalayabilirsiniz!
Snap

14
SysOps olmasam da, php.ini dosyasından daha fazla insanın .htaccess dosyası olduğunu düşünüyorum ve ikisi de ayrıştırmadan önce gelirdi, değil mi? php_flag display_errors 1için .htaccess
Ryan Taylor

1
Şimdi hatalar günlüğe kaydedilir, nereye giderler? / Var / log / apache2'ye gittim ve tüm günlükleri gösteriyor, ancak son zamanlarda çalıştırdığım programla ilgili bilgi yok. Her sabah bir kez sistemin yeniden başlatılması hakkında bilgi alıyorum.
Michael

1
@Michael Hatalar doğrudan ekrana veya çıktının yönlendirildiği yere gider
Fancy John

2
E_ALLPHP 5.3'teki tüm hataları görüntülemek için yeterli değildir . " 5.4.0 'da E_STRICTparçası oldu E_ALL" - PHP Manual İhtiyacınız E_ALL | E_STRICTveya -1bu sürümde.
Gerard Roche

155

Çalışma zamanında hata çıktısını etkinleştirirken ayrıştırma hatalarını yakalayamazsınız, çünkü gerçekte bir şey yürütmeden önce dosyayı ayrıştırır (ve bu sırada bir hatayla karşılaştığından, hiçbir şey yürütmez). Gerçek sunucu yapılandırmasını, display_errors öğesinin açık olması ve onaylanan hata raporlama seviyesinin kullanılabilmesi için değiştirmeniz gerekir. Php.ini dosyasına erişiminiz yoksa, sunucuya bağlı olarak .htaccess veya benzerlerini kullanabilirsiniz.

Bu soru ek bilgi sağlayabilir.


2
Bunu bilmiyordum. Php.ini dosyasını el ile düzenledim ve şimdi çalışıyor. Teşekkürler!
Abs

143

İçerideki php.ini :

display_errors = on

Ardından web sunucunuzu yeniden başlatın.


7
+ ①. Benim ubuntu /etc/php5/apache2/php.ini
m93a

5
için yeniden başlatma (Debian, Ubuntu, vs.)sudo service apache2 restart
Peter Krauss

4
OS X'te yeniden başlatmak için sudo apachectl -k restart.
Bezelye

3
eğlenceli gerçek: Eğer sadece phpinfo () koymak yüklenen php.ini dosyanızı bulabilirsiniz; boş bir php dosyasına. 7. sıra aşağı inip aradıLoaded Configuration File
Frankenmint

CPanel üzerinde php kodu direclty yazıyorsak nasıl yapabiliriz?
arqam

98

Tüm hataları görüntülemek için yapmanız gerekenler:

1. Aşağıdaki satırları tarayıcıdan aradığınız PHP betiğinde bulundurun (genellikle index.php):

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

2. (a) Bu komut dosyasının sözdizimi hatası olmadığından emin olun

-veya-

2. (b) Set display_errors = Oniçinde seninphp.ini

Aksi takdirde, bu 2 çizgiyi bile çalıştıramaz!

Komut dosyasında sözdizimi hatalarını kontrol ederek (komut satırında) kontrol edebilirsiniz:

php -l index.php

Eğer varsa dahil başka bir PHP komut dosyasından senaryoyu o zaman olacak sözdizimi hatalarının görüntülemek dahil senaryo. Örneğin:

index.php

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

// Any syntax errors here will result in a blank screen in the browser

include 'my_script.php';

my_script.php

adjfkj // This syntax error will be displayed in the browser

51

Bazı web barındırma sağlayıcıları .htaccessdosyadaki PHP parametrelerini değiştirmenize izin verir .

Aşağıdaki satırı ekleyebilirsiniz:

php_value display_errors 1

Sizinkiyle aynı sorunu yaşadım ve bu çözüm düzeltti.


Ve nginx ortamında iseniz, php değerini ~ \ .php konum yönergesi altındaki site (sitelerde kullanılabilir) yapılandırmanıza ekleyin. fastcgi_param PHP_VALUE "error_reporting = E_ALL; \ n display_errors = 1;";
Lazaros Kosmidis

40

"Hata raporlama" veya "görüntü hataları" ayarlarının tümü PHP 7'de çalışmaz gibi görünebilir. Bunun nedeni, hata işlemenin değişmiş olmasıdır. Bunun yerine şunu deneyin:

try{
     // Your code
} 
catch(Error $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}

Veya, bir seferde istisnaları ve hataları yakalamak için (bu PHP 5 ile geriye dönük olarak uyumlu değildir):

try{
     // Your code
} 
catch(Throwable $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}

1
PHP7 veya PHP7.1 mi demek istediniz? Kafan karıştı, önerilen doğrulanmış cevap olarak denedim ve işe yarıyor, sanırım biraz farklı bir IMHO, gerçekten "geriye dönük uyumluluk yok" ve tam bir PHP <7 kodunu değiştirmek ve try{} catch() {}her yere kod eklemek gerekiyorsa zaten tanımlanmış php kodunda, ben bile olacak karışıklık düşünmek istemiyorum ..
vdegenne

@FancyJohn, bu yardımcı olabilir: $bt = debug_backtrace(); print_r($bt);.
Frank Forte

@ballangddang, PHP 7.0 ile ilgili sorunla karşılaştım, burada görüntülenme hatasını alabilmenin tek yolu try / catch bloklarını kullanmak ve özellikle yakalamaktı Error. Tüm istekleri (belki JavaScript, CSS, Resimler vb. Hariç) index.php dosyasına yeniden yazarsanız, try catch bloğunu orada bulundurursanız, bunu kolaylaştırır. Evet, tek bir giriş noktası olmayan herhangi bir sistem, güncellenmesi gereken büyük bir baş ağrısı olacaktır.
Frank Forte

PHP işlenmemiş istisnalar göstermiyor mu? Emin misin?
Martin Tournoij

İşlenmemiş istisnalar göstermelidir. Başlangıçta bir çıkış arabelleğini açarsanız (böylece yanıt gövdesini temizlemeden önce herhangi bir noktada üstbilgi gönderebilirsiniz), istisna iletisi bir yerde kaybolabilir.
Frank Forte


33

kullanın:

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

Bu yazmanın en iyi yoludur, ancak bir sözdizimi hatası boş çıktı verir, bu nedenle sözdizimi hatalarını kontrol etmek için konsolu kullanın. PHP kodunda hata ayıklamanın en iyi yolu konsolu kullanmaktır; aşağıdakileri çalıştırın:

php -l phpfilename.php

22

İndex.php dosyanızda ayarlayın :

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

20

PHP dosyanızın bulunduğu klasörde php.ini adlı bir dosya oluşturun .

Php.ini içinde aşağıdaki kodu ekleyin (Ben kod gösteren basit bir hata veriyorum):

display_errors = on

display_startup_errors = on

18

İşte bir PHP betiği:

<?php
    ini_set("display_startup_errors", 1);
    ini_set("display_errors", 1);

    /* Reports for either E_ERROR | E_WARNING | E_NOTICE  | Any Error*/
    error_reporting(E_ALL);

    echo(abc); /* Notice: abc is an undefined constant */
?>

PHP hatalarının daha ayrıntılı açıklaması için PHP Hatası - error_reporting () adresini ziyaret edin .


2
Bunun Fancy John'un cevabından farkı nedir?
Tüm İşçiler

@cpburnz - Bu basit bir soru, her biri kendi tat aynı kod kümesi verilen tek fark. Ek PHP hatası hakkında daha fazla bilgi verecek bir URL bağlantısı verdi.
B.Balamanigandan

15

Yukarıdaki yanıtların tümünü izlemenize rağmen (veya php.ini dosyanızı düzenleyemiyorsanız), yine de hata mesajı alamıyorsanız, hata raporlamayı etkinleştiren yeni bir PHP dosyası oluşturmayı deneyin ve ardından sorun dosyasını ekleyin. Örneğin:

error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('problem_file.php');

Dosyamda her şeyin düzgün ayarlanmasına rağmen, php.inibir ad alanı hatasını yakalamanın tek yolu buydu. Benim kesin senaryom:

//file1.php
namespace a\b;
class x {
    ...
}

//file2.php
namespace c\d;
use c\d\x; //Dies because it's not sure which 'x' class to use
class x {
    ...
}

1
Hayır, hata bildirimi bir loglevel değil, bir bit alanı. 999999 kullanmak çok kötü bir fikirdir, iki eksi 1 gücü, örneğin 2047 kullanın!
peterh - Monica'yı geri yükle

Kesinlikle haklısın, @peterh! Bu, tüm hataların (php 5.4 ve altındaki katı hatalar hariç) raporlanmasını sağlayacak şekilde E_ALL olarak değiştirdim.
jxmallett

15

Ben genellikle benim düz PHP projeleri aşağıdaki kodu ile gider.

if(!defined('ENVIRONMENT')){
    define('ENVIRONMENT', 'DEVELOPMENT');
}

$base_url = null;

if (defined('ENVIRONMENT'))
{
    switch (ENVIRONMENT)
    {
        case 'DEVELOPMENT':
            $base_url = 'http://localhost/product/';
            ini_set('display_errors', 1);
            ini_set('display_startup_errors', 1);
            error_reporting(E_ALL|E_STRICT);
            break;

        case 'PRODUCTION':
            $base_url = 'Production URL'; /* https://google.com */
            error_reporting(0);
            /* Mechanism to log errors */
            break;

        default:
            exit('The application environment is not set correctly.');
    }
}

15

PHP'yi Apache modülü olarak kullanırken, Apache yapılandırma dosyalarındaki (örn. Httpd.conf) ve .htaccess dosyalarındaki yönergeleri kullanarak yapılandırma ayarlarını değiştirebiliriz. Bunun için “AllowOverride Options” veya “AllOverride Override” ayrıcalıklarına sahip olmanız gerekir.

Şuna göz at

http://funbird.co.uk/blog/tech-articals/linux-tech-articals/enabling-error-display-php-via-htaccess


Bağlantı kopmuş (404).
Peter Mortensen

14

Bir şekilde kendinizi ayarı değiştiremeyeceğiniz bir durumda bulursanız php.iniveya .htaccessPHP komut dosyalarınız ayrıştırma hataları içerdiğinde hata görüntüleme şansınız kalmazsa . Daha sonra komut satırındaki dosyaları şu şekilde sıralamak için çözümlemeniz gerekir :

find . -name '*.php' -type f -print0 | xargs -0 -n1 -P8 php -l | grep -v "No syntax errors"

Ana makineniz o kadar kilitliyse php.iniveya .htaccessdeğerinin değiştirilmesine izin vermiyorsa, değerinin değiştirilmesine de izin vermeyebilir ini_set. Bunu aşağıdaki PHP betiğiyle kontrol edebilirsiniz:

<?php
if( !ini_set( 'display_errors', 1 ) ) {
  echo "display_errors cannot be set.";
} else {
  echo "changing display_errors via script is possible.";
}

find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'daha basit
çörekler

14

Şu anda PHP 7 çalıştırdığımız için burada verilen cevaplar artık doğru değil. Hala iyi olan tek kişi PHP 7'den bahsederken Frank Forte'den .

Diğer tarafta, bir try / catch ile hataları yakalamaya çalışmak yerine bir hile kullanabilirsiniz: use include.

İşte üç kod parçası:

Dosya: tst1.php

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    // Missing " and ;
    echo "Testing
?>

PHP 7'de çalıştırmak hiçbir şey göstermez.

Şimdi şunu deneyin:

Dosya: tst2.php

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    include ("tst3.php");
?>

Dosya: tst3.php

<?php
    // Missing " and ;
    echo "Testing
?>

Şimdi hata raporlamasını ayarlayan tst2'yi çalıştırın ve tst3'ü ekleyin. Göreceksin:

Ayrıştırma hatası: sözdizimi hatası, beklenmeyen dosya sonu, 4. satırdaki tst3.php değişkenini (T_VARIABLE) veya $ {(T_DOLLAR_OPEN_CURLY_BRACES) veya {$ (T_CURLY_OPEN) bekleniyor


13

Aşağıdaki gibi bir şey yapabilirsiniz:

Ana dizin dosyanızda aşağıdaki parametreleri ayarlayın:

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

Sonra ihtiyacınıza göre göstermek istediğinizi seçebilirsiniz:

İçin bütün hatalar, uyarılar ve bildirimler:

    error_reporting(E_ALL); OR error_reporting(-1);

İçin bütün hatalar:

    error_reporting(E_ERROR);

İçin bütün uyarılara:

    error_reporting(E_WARNING);

İçin tüm bildirimler:

    error_reporting(E_NOTICE);

Daha fazla bilgi için buraya bakın .


Nedir "ana indeks dosyası" ? Dosya index.html?
Peter Mortensen

12

Ek hata ayıklama bilgileri sağlayabilen kendi özel hata işleyicinizi ekleyebilirsiniz. Ayrıca, bilgileri e-postayla göndermek için ayarlayabilirsiniz.

function ERR_HANDLER($errno, $errstr, $errfile, $errline){
    $msg = "<b>Something bad happened.</b> [$errno] $errstr <br><br>
    <b>File:</b> $errfile <br>
    <b>Line:</b> $errline <br>
    <pre>".json_encode(debug_backtrace(), JSON_PRETTY_PRINT)."</pre> <br>";

    echo $msg;

    return false;
}

function EXC_HANDLER($exception){
    ERR_HANDLER(0, $exception->getMessage(), $exception->getFile(), $exception->getLine());
}

function shutDownFunction() {
    $error = error_get_last();
    if ($error["type"] == 1) {
        ERR_HANDLER($error["type"], $error["message"], $error["file"], $error["line"]);
    }
}

set_error_handler ("ERR_HANDLER", E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
register_shutdown_function("shutdownFunction");
set_exception_handler("EXC_HANDLER");

7

Bu kod üstte çalışmalıdır:

error_reporting(E_ALL);

Ancak, dosyadaki telefonda kodu düzenlemeyi deneyin:

error_reporting =on

6

Hızlı bir hata ayıklama durumunda kullanabileceğiniz en iyi / kolay / hızlı çözüm, kodunuzu yakalama istisnalarıyla çevrelemektir. Üretimde hızlı bir şeyi kontrol etmek istediğimde bunu yapıyorum.

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

Php7 için, catch (Throwable $e)daha iyi ... Veya altında başka bir catch bloğucatch(Error $e)
Frank Forte


4

Ben de öyle öğrendim. PHP.INI dosyasında,

error_reporting = E_ALL
display_errors = On

2
Değişiyor musunuz? Eklensin mi?
Peter Mortensen

atm cevabınız anlamsız çünkü bağlamı yok; ayrıca Peter Mortensen tarafından şart koşuldu. İyileştirmemesi "kaldırılma bayrağı" için hazırlar (botlarla). (Düşük Kaliteli İncelemeden).
ZF007

4
    <?php
    // Turn off error reporting
    error_reporting(0);

    // Report runtime errors
    error_reporting(E_ERROR | E_WARNING | E_PARSE);

    // Report all errors
    error_reporting(E_ALL);

    // Same as error_reporting(E_ALL);
    ini_set("error_reporting", E_ALL);

    // Report all errors except E_NOTICE
    error_reporting(E_ALL & ~E_NOTICE);
    ?>

Siteniz yayınlanırken, php.inigüvenlik nedeniyle dosyada display_errors devre dışı bırakılmalıdır. Ancak, geliştirme ortamı için, sorun giderme için display_errors etkinleştirilebilir.


4

Bunu php.ini dosyasını değiştirerek ve aşağıdakileri ekleyerek yapabilirsiniz

display_errors = on
display_startup_errors = on

VEYA, bu kod her zaman benim için çalıştığı için aşağıdaki kodu da kullanabilirsiniz

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

3

Eğer varsa Xdebug Eğer ayarı tarafından her ayarı geçersiz kılabilir yüklü:

xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;

force_display_errors

Tür: int, Varsayılan değer: 0, Xdebug'da tanıtılır> = 2.3 Bu ayar 1 olarak ayarlanırsa, PHP'nin display_errors ayarı ne olursa olsun hatalar her zaman görüntülenir.

force_error_reporting

Tür: int, Varsayılan değer: 0, Xdebug'da tanıtılmıştır> = 2.3 Bu ayar, error_reporting gibi bir bit maskesidir. Bu bitmask mantıksal olarak OR ile hangi hataların görüntülenmesi gerektiğini göstermek için error_reporting tarafından temsil edilen bitmask olacaktır. Bu ayar yalnızca php.ini dosyasında yapılabilir ve bir uygulamanın ini_set () ile ne yaparsa yapsın belirli hataların gösterilmesini zorlamanızı sağlar.


3

Bu kodu kullanmak isteyebilirsiniz:

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

2

E_NOTICE dışındaki tüm hataları bildir

error_reporting(E_ALL & ~E_NOTICE);

Tüm PHP hatalarını görüntüle

error_reporting(E_ALL);  or ini_set('error_reporting', E_ALL);

Tüm hata raporlarını kapat

error_reporting(0);

1

Unix CLI'de , yalnızca hataları bir dosyaya yönlendirmek çok pratiktir :

./script 2> errors.log

Sonra başka bir kabuktan, canlı değişiklikler için:

tail -f errors.log

ya da sadece

watch cat errors.log

PHP ile ilgili bu soruya nasıl cevap veriyor?
Peter Mortensen

./scriptbir php CLI betiğidir (hashbang #!/usr/bin/php). Bir dosyadaki php hatalarını bu şekilde yönlendirebilirsiniz. Bu unix borulama. Bu CGI olarak php değildir.
NVRM

0

Komut satırındaysa, ayarı şu şekilde geçersiz kılmak için phpile çalışabilirsiniz :-ddisplay_errors=1php.ini

php -ddisplay_errors=1 script.php

-1

Bir PHP betiğindeki php.inive ini_set()işlevleri dışında, aynı şeyi .htaccessvehttpd.conf direktifler aşağıda gösterildiği.

Bazı barındırma sağlayıcıları, PHP ayarlarının .htaccessvehttpd.conf .

PHP hatalarını gizle

php_flag display_startup_errors ON

php_flag display_errors ON

php_flag html_errors ON

php_flag log_errors on

php_flag ignore_repeated_errors off

php_flag ignore_repeated_source off

php_flag report_memleaks on

php_flag track_errors on

php_value docref_root 0

php_value docref_ext 0

php_value error_log /home/path/public_html/domain/PHP_errors.log

php_value error_reporting 999999999

php_value error_reporting -1

php_value log_errors_max_len 0

Order allow,deny

Deny from all

Satisfy All

bu cevabı biraz googling ile buldu

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.