Làm cách nào để tắt Thông báo PHP?


126
Notice: Constant DIR_FS_CATALOG already defined

Tôi đã nhận xét ra display_errorstrong php.ini, nhưng không hoạt động.

Làm cách nào để tạo PHP để không xuất những thứ như vậy ra trình duyệt?

CẬP NHẬT

Tôi đặt display_errors = Offở đó nhưng nó vẫn báo cáo những thông báo như vậy,

Đây có phải là một vấn đề với PHP 5.3 không?

Báo cáo nhiều cuộc gọi Stack quá ..


3
Nếu bạn đang sử dụng Apache, bạn có thể phải khởi động lại máy chủ của mình! Nếu bạn đang sử dụng XAMPP, chỉ cần chọn "khởi động lại" trong ứng dụng trình quản lý.
st4wik

2
Tôi đề nghị chạy grep display_errors /path/to/php.iniđể xem nếu dòng của bạn bị ghi đè ở đâu đó xuống tệp. Đây là những gì đã xảy ra với tôi.

Error_Vporting là giải pháp
David Stienen

thử ini_set('display_errors',0)trong tập tin php của bạn. Khi bạn cài đặt không hoạt động, bạn nên kiểm tra xem có phpinfo()hiển thị giá trị mong muốn của bạn không. Nếu không, bạn đã thay đổi tập tin ini sai hoặc một cái gì đó ghi đè lên các giá trị của bạn từ php.ini
Radon8472

nó không phải là lỗi php 5.3. display_errors hoạt động từ php 4.0.3 cho đến các phiên bản mới nhất @see 3v4l.org/87gIl
Radon8472

Câu trả lời:


78

Bạn có thể thiết lập display_errorsđể 0hoặc sử dụng các error_reporting()chức năng.

Tuy nhiên, các thông báo gây phiền nhiễu (tôi có thể thông cảm một phần ) nhưng chúng phục vụ một mục đích. Bạn không nên xác định hằng số hai lần, lần thứ hai sẽ không hoạt động và hằng số sẽ không thay đổi!


4
+1: Tôi chấp nhận đề cập rằng anh ấy nên sửa lỗi, không tắt báo cáo. Và bạn đã làm điều đó một cách nhẹ nhàng hơn @Jonathan Kuhn :-)
Josh

1
Không, có vẻ như đây là một lỗi của php5.3, display_errorskhông hoạt động như mong đợi.
dùng198729

@user thử a phpinfo()để xem cài đặt có thực sự áp dụng hay không. Hãy tha thứ cho tôi, nhưng tôi cực kỳ nghi ngờ rằng bạn đã tìm thấy một lỗi trong PHP 5.3 - Tôi sẽ chỉ tin khi tôi nhìn thấy nó :)
Pekka

Lạ thật, local valuelà Bật, nhưng master valuetắt rồi, không biết chính xác nghĩa là gì ...
user198729

1
@user Tôi nghĩ rằng giá trị cục bộ có thể đến từ các ini_setchỉ thị hoặc php_ini_flagcài đặt trong .htaccesstệp.
Pekka

242

Từ tài liệu PHP ( error_Vporting ):

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

Các tùy chọn thú vị khác cho chức năng đó:

<?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);

?>

Rất hữu ích và đưa ra câu trả lời cho câu hỏi. Mặc dù tôi biết tốt hơn là nên sửa tất cả các thông báo. Đôi khi nó có thể hữu ích để hiển thị mọi thứ nhưng thông báo.
Timo002

3
Tắt thông báo chỉ không hoạt động đối với tôi bằng cách sử dụng ^ THÔNG BÁO như đã nêu trong bài viết trên. Đối với PHP v5.3, hãy sử dụng: E_ALL & ~ E_NOTICE
Chizzle

Nếu bạn có API REST trả về JSON hoặc XML hoặc bất cứ điều gì, bạn có thể muốn tắt chúng đi. Hoặc ít nhất là chuyển đổi chúng thành ngoại lệ và xử lý chúng cho phù hợp.
TheRealChx101

Xin chào. Đã làm cho tôi. Cảm ơn rât nhiều.
H. Farid

Display_errors kiểm soát nếu lỗi được gửi đến thiết bị xuất chuẩn. Nhưng khi bạn thay đổi error_Vporting thành 0, bạn hoàn toàn vô hiệu hóa tất cả các công cụ xử lý lỗi và xử lý lỗi .. bạn KHÔNG BAO GIỜ nên thực hiện error_Vporting (0).
Radon8472

30

Đối với dòng lệnh php, đặt

error_reporting = E_ALL & ~E_NOTICE

trong /etc/php5/cli/php.ini

phpthực hiện lệnh sau đó thông báo các thông báo.


Bằng cách thực hiện lỗi này numporting = E_ALL & ~ E_NOTICE & ~ E_WARNING trong php.ini. Nó vô hiệu hóa Thông báo PHP và Cảnh báo PHP. Vì vậy, không có thông báo php và cảnh báo php nào được nhìn thấy trong các trình duyệt
Deepak Lamichhane

Điều này đi cho các thiết lập php console. Nếu bạn đang sử dụng php để tạo các trang web qua tệp cấu hình máy chủ web apache2 là /etc/php5/apache2/php.ini Tốt nhất nên sử dụng phpinfo () để xem tệp cấu hình nào thực sự được sử dụng.
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);

?>

nguồn http://php.net/manual/en/feft.error-reporting.php


2
Đây không phải là một bản sao của câu trả lời hiện có được đăng cách đây nhiều năm sao?
Pang

Cả hai chúng tôi đã sao chép dán từ tài liệu php và cả hai câu trả lời đã đề cập đến các tài nguyên.
Gohishek Goel

@AbhishekGoel Kỳ lân là những con ngựa con ngụy trang, câu nói đó không liên quan, bạn vẫn sao chép câu trả lời đã tồn tại bốn năm sau đó.
Ricky Boyce

@RickyB Tôi không kiểm tra câu trả lời hiện có và tôi cũng không sao chép.
Abhishek Goel

12

Sử dụng dòng này trong mã của bạn

error_reporting(E_ALL ^ E_NOTICE);  

Tôi nghĩ rằng bản thân nó đầy đủ với bạn.


5

Bạn đang tìm kiếm:

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

2
Xin chào @Christian và chào mừng bạn đến với StackOverflow! Trong tương lai, sẽ thật tuyệt nếu bạn có thể thêm một chút giải thích / chi tiết vào câu trả lời của mình để khai sáng cho những người nhìn thấy nó về lý do tại sao / cách giải pháp hoạt động / khắc phục vấn đề. Cảm ơn rất nhiều và chúc mừng mã hóa :)
Zachary Kniebel

chính xác! Tôi sử dụng /usr/bin/php -d error_reporting="E_ERROR | E_WARNING | E_PARSE" -f /path/to/file.phpcho crontab của mình
vladkras

4

Tôi không thích đặt error_reporting mã bên trong của tôi. Nhưng trong một trường hợp, một sản phẩm kế thừa, có rất nhiều thông báo, chúng phải được ẩn đi.

Vì vậy, tôi đã sử dụng đoạn mã sau để đặt giá trị được định cấu hình cho máy chủ error_reportingnhưng trừ đi E_NOTICEs.

error_reporting(error_reporting() & ~E_NOTICE);

Bây giờ cài đặt báo cáo lỗi có thể được cấu hình thêm trong php.inihoặc .htaccess. Chỉ thông báo sẽ luôn luôn bị vô hiệu hóa.


3

Bạn có thể đặt ini_set('display_errors',0);trong tập lệnh của mình hoặc xác định lỗi nào bạn muốn hiển thị error_reporting().


Tôi cần sử dụng ini_setphương pháp được đề cập ở đây, error_reporting(0)phương pháp được đề cập ở nơi khác không có tác dụng.
pix

3

bằng cách không gây ra lỗi:

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

Nếu bạn thực sự phải làm như vậy, thì hãy thay đổi báo cáo lỗi bằng cách sử dụng error_Vporting () thành E_ALL ^ ​​E_NOTICE.


1
Nếu đó là một trang sản xuất, cho dù bạn có nghĩ rằng nó không có lỗi hay không, bạn vẫn không nên hiển thị lỗi nếu chúng phát sinh - vì vậy 'bằng cách không gây ra lỗi' có vẻ như là một câu trả lời táo tợn cho câu hỏi hợp lệ.
Cam

5
Kể từ khi nào có thể cho phép lỗi trong một trang web sản xuất? Tôi đồng ý rằng trên một trang web sản xuất bạn không nên hiển thị lỗi, đó không phải là điều tôi đang nói. Tôi đã nói rằng bạn nên kiểm tra xem hằng số có được xác định không và đặt nó nếu không (đó là lý do tại sao tôi đưa ra mẫu mã).
Jonathan Kuhn

Mặc dù câu trả lời của bạn không phải là "đẹp nhất" nhưng dường như câu trả lời của OP là đầy đủ nhất. +1 cho câu trả lời của bạn và / muốn nó được đánh dấu là câu trả lời, vì đó là câu trả lời đúng.
Nazca

@Nazca Yea, tôi đã thay đổi thái độ của mình và cố gắng thân thiện hơn nhiều. :)
Jonathan Kuhn

2

Đối với mã PHP:

<?php
error_reporting(E_ALL & ~E_NOTICE);

Đối với php.inicấu hình:

error_reporting = E_ALL & ~E_NOTICE

1

Tôi tìm thấy thủ thuật này gần đây. Whack một @ ở đầu một dòng có thể tạo ra một cảnh báo / lỗi.

Như thể bằng phép thuật, họ biến mất.


21
Đó thường là một ý tưởng tồi, nó giống như đặt nút tai vì xe của bạn đang tạo ra tiếng ồn khủng khiếp.
David Morrow

10
Điều này thực sự có ý nghĩa hoàn hảo đối với một số trường hợp, ví dụ như khi hiển thị một biến bất kể nó được đặt hay trống.
Frans

1
Điều này chỉ có ý nghĩa khi bạn có một cái gì đó giống như một plugin WordPress mà tác giả chưa cập nhật và bạn biết chính xác điều gì gây ra sự cố. Đó là một hỗ trợ ban nhạc, mặc dù không phải là một sửa chữa.
Bắt buộc

Tôi thích cả error_Vporting () và '@'. Tôi đã không nhận thức được một trong hai. Cảm ơn bạn. Tôi thích '@' vì điều này cung cấp cùng chức năng của error_Vporting (0) và dễ nhập hơn. Nếu vấn đề giống như "móc áo giữ ống xả" hơn là "tiếng ồn kinh khủng", thì nó cho phép dự án tiến lên. Tôi có thể dễ dàng tìm và sửa những thứ này khi có thời gian. Điều này giúp với một vấn đề trong đó lỗi là do dữ liệu đọc từ một tệp, do đó không có lỗi chính tả hoặc thư viện.
Đánh dấu Longmire

1
Chỉ cần chắc chắn rằng bạn đặt @ nơi bạn chắc chắn 100% những gì bạn đang làm.
Nick

1

Sử dụng phpinfo () và tìm kiếm Configuration File (php.ini) Pathđể xem đường dẫn tệp cấu hình nào cho php được sử dụng. PHP có thể có nhiều tệp cấu hình tùy thuộc vào môi trường mà nó đang chạy. Thông thường, đối với bàn điều khiển, đó là:

/etc/php5/cli/php.ini

và đối với php được chạy bởi apache, đó là:

/etc/php5/apache2/php.ini

Và sau đó đặt error_reportingtheo cách bạn cần:

http://www.phpknhow.com/configuration/php-ini-error-sinstall/ http://www.zootemplate.com/news-updates/how-to-disable-notice-and-warning-in-phpini- tập tin


1

Như một số người đã đề cập và nếu bạn là tác giả mã, bạn nên sửa tất cả các lỗi, thông báo, v.v. bởi vì nó sẽ gây ra nhiều vấn đề cho bạn về lâu dài hơn là không sửa chúng (đặc biệt là khi bạn nâng cấp HĐH). Đối với máy chủ của bạn, bạn chỉ nên có lỗi hiển thị trong nhật ký của mình chứ không phải màn hình của máy khách.

Vì vậy, để tránh các lỗi trong trình duyệt của bạn, bạn sử dụng display_errorscờ như bạn đã tìm thấy:

display_errors = Off

Bây giờ vấn đề thực sự là khi bạn đang chạy mã người khác. Trong trường hợp đó, sửa đổi mã có thể bị ghi đè mỗi khi bạn nâng cấp mã đó. Nó làm cho nó tẻ nhạt để duy trì mã đó.

Trong trường hợp của tôi, tôi đang chạy PHP crontabđể có wp-cron.phpkịch bản chạy một lần. Tôi đã nhận được lỗi gửi đến email của mình, điều này trở nên tẻ nhạt khi bạn nhận được một email cứ sau 10 phút! Tuy nhiên, trong trường hợp đó, hệ thống Wordpress có tệp cấu hình bao gồm a WP_DEBUGvà họ gọi error_reporting()hàm nên cố gắng thay đổi error_reportingbiến trên dòng lệnh sẽ không hoạt động. Thay vào đó, bạn phải chỉnh sửa wp-config.phptệp trong thư mục gốc và đảm bảo rằng tệp WP_DEBUGđược đặt thành false. Nếu không, bạn sẽ nhận được tất cả những cảnh báo và thông báo mọi lúc.


0

Bạn có thể kiểm tra xem hằng số đã được xác định chưa bằng cách sử dụng:

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

0

Tôi tin rằng việc bình luận display_errors trong php.ini sẽ không hoạt động vì mặc định là Bật. Thay vào đó, bạn phải đặt thành 'Tắt'.

Đừng quên khởi động lại Apache để áp dụng các thay đổi cấu hình.

Cũng lưu ý rằng mặc dù bạn có thể đặt display_errors khi chạy, nhưng việc thay đổi nó ở đây không ảnh hưởng đến các lỗi FATAL.

Như đã lưu ý bởi những người khác, lý tưởng nhất là trong quá trình phát triển, bạn nên chạy với error_Vporting ở mức cao nhất có thể và display_errors được bật. Mặc dù khó chịu khi bạn mới bắt đầu, những lỗi, cảnh báo, thông báo và lời khuyên mã hóa nghiêm ngặt này đều cộng lại và cho phép bạn trở thành một lập trình viên giỏi hơn.


0

Hằng số xác định kép

Để sửa lỗi cụ thể ở đây, bạn có thể kiểm tra xem một hằng số đã được xác định chưa trước khi xác định nó:

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

Cá nhân tôi bắt đầu với một tìm kiếm trong cơ sở mã cho hằng số DIR_FS_CATALOG, sau đó thay thế định nghĩa kép bằng định nghĩa này.

Ẩn PHP thông báo nội tuyến, từng trường hợp

PHP cung cấp @toán tử kiểm soát lỗi mà bạn có thể sử dụng để bỏ qua các chức năng cụ thể gây ra thông báo hoặc cảnh báo.

Sử dụng điều này, bạn có thể bỏ qua / vô hiệu hóa các thông báo và cảnh báo trên cơ sở từng trường hợp trong mã của mình, điều này có thể hữu ích cho các tình huống có lỗi hoặc thông báo là cố ý, có kế hoạch hoặc chỉ gây khó chịu và không thể giải quyết tại nguồn . Đặt một @trước hàm hoặc var gây ra thông báo và nó sẽ bị bỏ qua.

Đây là một ví dụ:

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

Thông tin thêm về điều này có thể được tìm thấy trong các tài liệu Toán tử kiểm soát lỗi của PHP .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.