PHP Bildirimlerini nasıl kapatırım?


126
Notice: Constant DIR_FS_CATALOG already defined

Zaten dışarı yorumladı ettik display_errorsde php.ini, ama çalışmıyor.

PHP'nin bu tür şeyleri tarayıcılara vermemesini nasıl sağlarım?

GÜNCELLEME

Oraya koydum display_errors = Offama hala bu tür bildirimleri bildiriyor,

Bu PHP 5.3 ile ilgili bir sorun mu?

Çok sayıda Çağrı Yığını da bildiriliyor ..


3
Apache kullanıyorsanız, sunucunuzu yeniden başlatmanız gerekebilir! XAMPP kullanıyorsanız, yönetici uygulamasında "yeniden başlat" ı seçin.
st4wik

2
grep display_errors /path/to/php.iniDosyanın altında bir yerde hattınızın geçersiz kılınmış olup olmadığını görmek için koşmanızı öneririm . Bana olan buydu.
usandfriends

Çözüm hata raporlama
David Stienen

ini_set('display_errors',0)php dosyanızda deneyin . Başlangıç ​​ayarlarınız çalışmadığında, phpinfo()istediğiniz değeri gösterip göstermediğini kontrol etmelisiniz . Ya yanlış ini dosyasını değiştirmediyseniz ya da bir şey php.ini'deki değerlerinizi geçersiz
kılarsa

php 5.3 hatası değildir. display_errors php 4.0.3'ten en son sürümlere kadar çalışır @see 3v4l.org/87gIl
Radon8472

Yanıtlar:


78

Ayarlayabilirsiniz display_errorsiçin 0veya kullanım error_reporting()işlevi.

Ancak, bildirimler can sıkıcıdır ( kısmen anlayabiliyorum ) ama bir amaca hizmet ediyorlar. Bir sabiti iki kez tanımlamamalısınız, ikinci sefer işe yaramaz ve sabit değişmeden kalır!


4
+1: Raporlamayı kapatmaması, hataları düzeltmesi gerektiğini söylemeyi onaylıyorum. Ve bunu @Jonathan Kuhn'dan daha nazik bir şekilde yaptın :-)
Josh,

1
Hayır, bu bir php5.3 hatası gibi görünüyor, display_errorsbeklendiği gibi çalışmıyor.
user198729

@user phpinfo(), ayarın gerçekten geçerli olup olmadığını görmeye çalışır . Beni bağışlayın, ancak PHP 5.3'te bir hata bulduğunuzdan kesinlikle şüpheliyim - Sadece gördüğümde inanacağım :)
Pekka

Garip, local valueAçık, ama master valuekapalı, bunun tam olarak ne anlama geldiğini bilmiyorum ...
user198729

1
@user Yerel değerin dosyalardaki ini_setyönergelerden veya php_ini_flagayarlardan gelebileceğini düşünüyorum .htaccess.
Pekka

242

PHP belgelerinden ( error_reporting ):

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

Bu işlev için diğer ilginç seçenekler:

<?php

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL & ~E_NOTICE);
// For PHP < 5.3 use: E_ALL ^ E_NOTICE

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

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

?>

Çok yardımcı oldu ve sorunun cevabını veriyor. Tüm bildirimleri düzeltmenin daha iyi olduğunu bilmeme rağmen. Bazen uyarılar dışında her şeyi görüntülemek kullanışlı olabilir.
Timo002

3
Yukarıdaki gönderide belirtildiği gibi ^ NOTICE kullanarak yalnızca bildirimleri kapatmak benim için işe yaramadı. PHP v5.3 için şunu kullanın: E_ALL & ~ E_NOTICE
Chizzle

JSON veya XML veya başka bir şey döndüren bir REST API'niz varsa, bunları kapatmak isteyebilirsiniz. Veya en azından bunları istisnalara dönüştürün ve buna göre ele alın.
TheRealChx101

Merhaba. Benim için çalıştı. Çok teşekkür ederim.
H. Farid

Display_errors, hatalar standart çıktıya gönderilirse kontrol eder. Ancak error_reporting'i 0 olarak değiştirdiğinizde, tüm hata işleme ve hata kaydı işlerini tamamen devre dışı bırakırsınız .. ASLA error_reporting (0) yapmamalısınız.
Radon8472

30

Php komut satırı için

error_reporting = E_ALL & ~E_NOTICE

içinde /etc/php5/cli/php.ini

komut phpyürütme daha sonra bildirimleri atlar.


Php.ini içinde bu error_reporting = E_ALL & ~ E_NOTICE & ~ E_WARNING yaparak. PHP Bildirimini ve PHP Uyarılarını devre dışı bırakır. Böylece tarayıcılarda php bildirimi ve php uyarıları görülmez
Deepak Lamichhane

Bu konsol php ayarları için geçerlidir. Apache2 web sunucusu yapılandırma dosyası üzerinden web sayfaları oluşturmak için php kullanıyorsanız, şu şekildedir: /etc/php5/apache2/php.ini Gerçekte hangi yapılandırma dosyasının kullanıldığını görmek için phpinfo () kullanmak en iyisidir.
MilanG

23
<?php

// Turn off all error reporting
error_reporting(0);

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

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

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

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

?>

kaynak http://php.net/manual/en/function.error-reporting.php


2
Bu, yıllar önce gönderilen bu mevcut cevabın bir kopyası değil mi?
Pang

İkimiz de php belgelerinden kopyalayıp yapıştırdık ve her iki yanıt da kaynaklardan bahsetti.
Abhishek Goel

@AbhishekGoel Tek boynuzlu atlar kılık değiştirmiş midillilerdir, bu ifade alakasızdır, dört yıl sonra zaten var olan cevabı hala kopyaladınız .
Ricky Boyce

@RickyB Mevcut cevabı kontrol etmedim ve kopyalamadım.
Abhishek Goel

12

Bu Satırı Kodunuzda Kullanmış

error_reporting(E_ALL ^ E_NOTICE);  

Sanırım size çok yardımcı olacak.


6

Aradığınız:

php -d error_reporting="E_ERROR | E_WARNING | E_PARSE"

2
Merhaba @Christian, StackOverflow'a hoş geldiniz! Gelecekte, çözümün neden / nasıl çalıştığını / sorunu çözdüğünü görenleri aydınlatmak için cevabınıza biraz daha fazla açıklama / ayrıntı ekleyebilirseniz harika olur. Çok teşekkürler ve mutlu kodlamalar :)
Zachary Kniebel

1
kesinlikle! /usr/bin/php -d error_reporting="E_ERROR | E_WARNING | E_PARSE" -f /path/to/file.phpCrontab için kullanıyorum
vladkras

4

Ayarlamamayı tercih ederim error_reporting içini . Ancak bir durumda, eski bir üründe, gizlenmeleri gereken çok fazla bildirim vardır.

Bu yüzden, sunucu tarafında yapılandırılmış değeri ayarlamak için aşağıdaki parçacığı kullandım error_reportingancak E_NOTICEs.

error_reporting(error_reporting() & ~E_NOTICE);

Şimdi hata raporlama ayarı ayrıca yapılandırılabilir php.iniya .htaccess. Yalnızca bildirimler her zaman devre dışı bırakılacaktır.


3

ini_set('display_errors',0);Komut dosyanızda ayarlayabilir veya hangi hatalarla görüntülemek istediğinizi tanımlayabilirsiniz error_reporting().


ini_setBurada bahsedilen yöntemi kullanmam gerekiyordu , error_reporting(0)başka yerde bahsedilen yöntemin bir etkisi olmadı.
pix

2

hatalara neden olmayarak:

defined('DIR_FS_CATALOG') || define('DIR_FS_CATALOG', 'whatever');

Gerçekten yapmanız gerekiyorsa, error_reporting () kullanarak hata raporlamasını E_ALL ^ ​​E_NOTICE olarak değiştirin.


1
Bu bir üretim sitesiyse, hatasız olduğunu düşünseniz de düşünmeseniz de, hataları ortaya çıkarsa yine de göstermemelisiniz - bu nedenle 'hatalara neden olmamak' geçerli bir soruya biraz küstahça bir yanıt gibi görünüyor.
Cam

5
Ne zamandan beri bir üretim yerinde hatalara izin vermek uygundur? Bir üretim sitesinde hataları göstermemeniz gerektiğine katılıyorum, söylediğim bu değil. Sabitin tanımlı olup olmadığını kontrol etmeniz ve tanımlanmamışsa ayarlamanız gerektiğini söylüyordum (bu yüzden kod örneğini verdim).
Jonathan Kuhn

Cevabınız "güzel" olmasa da, OP'nin sorusuna sonuna kadar cevap veriyor gibi görünüyor. Cevabınıza +1 ve / keşke cevap olarak işaretlenmiş olsun, çünkü doğru cevap budur.
Nazca

@Nazca Evet, o zamandan beri tavrımı değiştirdim ve daha arkadaşça olmaya çalışıyorum. :)
Jonathan Kuhn

2

PHP kodu için:

<?php
error_reporting(E_ALL & ~E_NOTICE);

İçin php.iniyapılandırma:

error_reporting = E_ALL & ~E_NOTICE

1

Bu numarayı son zamanlarda buldum. Bir uyarı / hata üretebilecek bir satırın başına bir @ vurun.

Sanki sihirle yok olurlar.


21
bu genellikle kötü bir fikirdir, arabanız korkunç bir gıcırtı sesi çıkardığı için kulak tıkacı takmak gibidir.
David Morrow

10
Bu aslında bazı örnekler için mükemmel bir anlam ifade ediyor, örneğin, ayarlanmış veya boş bir değişken oluştururken.
Frans

1
Bu, yalnızca yazarın henüz güncellemediği bir WordPress eklentisi gibi bir şeye sahip olduğunuzda ve soruna neyin neden olduğunu tam olarak bildiğinizde anlamlıdır. Bu bir yara bandı, düzeltme değil.
Zorunlu

Hem error_reporting () hem de '@' hoşuma gitti. Bunların hiçbirinin farkında değildim. Teşekkür ederim. Error_reporting (0) ile aynı işlevselliği sağladığı ve yazması daha kolay olduğu için '@' karakterini seviyorum. Sorun, "korkunç gıcırdama gürültüsünden" daha çok "egzozu tutan elbise askısı" gibiyse, projenin ilerlemesini sağlar. Vakit olduğunda bunları kolayca bulup düzeltebilirim. Bu, hatanın bir dosyadan okunan verilerden kaynaklandığı bir soruna yardımcı oldu, bu nedenle yazım hatası veya kitaplık sorunu yok.
Mark Longmire

1
Ne yaptığınızdan% 100 emin olduğunuz yere @ koyduğunuzdan emin olun.
Nick

1

Phpinfo () kullanın ve Configuration File (php.ini) Pathphp için hangi yapılandırma dosyası yolunun kullanıldığını görmek için arayın . PHP, çalıştığı ortama bağlı olarak birden fazla yapılandırma dosyasına sahip olabilir. Genellikle konsol için:

/etc/php5/cli/php.ini

ve apache tarafından çalıştırılan php için:

/etc/php5/apache2/php.ini

Ardından error_reportingihtiyacınız olan yolu ayarlayın :

http://www.phpknowhow.com/configuration/php-ini-error-settings/ http://www.zootemplate.com/news-updates/how-to-disable-notice-and-warning-in-phpini- dosya


1

Bazıları tarafından belirtildiği gibi ve kod yazarı sizseniz, tüm bu hataları, bildirimleri, vb. Düzeltmelisiniz çünkü uzun vadede bunları düzeltmemekten daha fazla soruna neden olacaktır (özellikle işletim sisteminizi yükselttiğinizde). Sunucunuz için, istemcinin ekranında değil, yalnızca günlüklerinizde görüntülenen hatalar olmalıdır.

Dolayısıyla, tarayıcınızdaki hataları önlemek için display_errorszaten bulduğunuz bayrağı kullanırsınız :

display_errors = Off

Şimdi asıl sorun, başka bir kod çalıştırdığınız zamandır. Bu durumda, kodu değiştirdiğinizde, o kodu her yükselttiğinizde büyük olasılıkla üzerine yazılır. Bu kodu korumayı sıkıcı hale getiriyor.

Benim durumumda, betiğin arada bir çalıştırılması crontabiçin PHP ile wp-cron.phpçalıştırıyorum. E-postalarıma gönderilen hatalar alıyordum, bu da her 10 dakikada bir e-posta aldığınızda sıkıcı hale geliyor! Bu durumda, Wordpress sisteminde bir yapılandırma dosyası vardır WP_DEBUGve bunlar error_reporting()işlevi çağırır, böylece error_reportingkomut satırındaki değişkeni değiştirmeye çalışmak işe yaramaz. Bunun yerine wp-config.php, kök klasördeki dosyayı düzenlemeniz ve WP_DEBUGolarak ayarlandığından emin olmanız gerekir false. Aksi takdirde, tüm bu uyarıları ve bildirimleri her zaman alırsınız.


0

Şunu kullanarak sabitin önceden tanımlanmış olup olmadığını kontrol edebilirsiniz:

<?php
if (!defined('MYCONST'))
    define('MYCONST', 'Weeha!');
?>

0

Php.ini'de display_errors dışında yorum yapmanın işe yaramayacağına inanıyorum çünkü varsayılan değer Açık. Bunun yerine "Kapalı" olarak ayarlamalısınız.

Yapılandırma değişikliklerini uygulamak için Apache'yi yeniden başlatmayı unutmayın.

Ayrıca, çalışma zamanında display_errors ayarlayabilseniz de, burada değiştirmenin FATAL hataları etkilemediğini unutmayın.

Başkalarının da belirttiği gibi, ideal olarak geliştirme sırasında mümkün olan en yüksek düzeyde error_reporting ile çalıştırmalı ve display_errors etkinleştirilmiş olmalıdır. İlk başladığınızda can sıkıcı olsa da, bu hatalar, uyarılar, bildirimler ve katı kodlama önerileri bir araya gelerek daha iyi bir kodlayıcı olmanızı sağlar.


0

Çift tanımlı sabitler

Burada belirli bir hatayı düzeltmek için, onu tanımlamadan önce bir sabitin önceden tanımlanmış olup olmadığını kontrol edebilirsiniz:

if ( ! defined( 'DIR_FS_CATALOG' ) ) 
  define( 'DIR_FS_CATALOG', 'something...' );

Ben şahsen sabit için kod tabanında bir arama ile başlarım DIR_FS_CATALOG, ardından çift tanımı bununla değiştiririm.

PHP bildirimlerini tek tek sıralı olarak gizleme

PHP, @bildirimlere veya uyarılara neden olan belirli işlevleri yok saymak için kullanabileceğiniz hata kontrol operatörü sağlar .

Bunu kullanarak, kodunuzdaki bildirimleri ve uyarıları duruma göre göz ardı edebilir / devre dışı bırakabilirsiniz; bu, bir hata veya bildirimin kasıtlı, planlı veya sadece düpedüz sinir bozucu olduğu ve kaynakta çözülmesinin mümkün olmadığı durumlarda yararlı olabilir. . Bir koyun @en bildirimi neden ve yoksayılmasıdır fonksiyon ya var önce.

İşte bir örnek:

// Intentional file error
$missing_file = @file( 'non_existent_file' );

Bununla ilgili daha fazla bilgi PHP'nin Hata Kontrol Operatörleri belgelerinde bulunabilir.

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.