PHP 5 vô hiệu hóa lỗi tiêu chuẩn nghiêm ngặt


175

Tôi cần thiết lập tập lệnh PHP của mình ở đầu để tắt báo cáo lỗi cho các tiêu chuẩn nghiêm ngặt.

Ai có thể giúp đỡ?


8
@ 451F: Tôi nghĩ những từ khóa ở đây là "tiêu chuẩn nghiêm ngặt". Tôi không biết về các phiên bản trước nhưng với PHP 5.4.0, bạn nên đặt báo cáo lỗi thành E_ALL & ~E_DEPRECATED & ~E_STRICTsản xuất. Lưu ý rằng họ đề nghị bạn vô hiệu hóa các tiêu chuẩn nghiêm ngặt.
Mã giả Monkey Rashid

Đồng thời xác định vị trí tệp php.ini của bạn và sao chép tệp vào / usr / local / php5 / lib /
yadhu

Câu trả lời:


185

Bạn có muốn tắt báo cáo lỗi hay chỉ ngăn người dùng nhìn thấy nó? Nó thường là một ý tưởng tốt để ghi lại lỗi, ngay cả trên một trang web sản xuất.

# in your PHP code:
ini_set('display_errors', '0');     # don't show any errors...
error_reporting(E_ALL | E_STRICT);  # ...but do log them

Chúng sẽ được ghi vào nhật ký hệ thống tiêu chuẩn của bạn hoặc sử dụng error_logchỉ thị để chỉ định chính xác nơi bạn muốn xảy ra lỗi.


11
Chỉ cần nói rõ ràng rõ ràng: Tất nhiên bạn cũng có thể đặt những thứ này trong php.initệp của mình , ví dụ nếu bạn không thể sửa đổi mã PHP.
sschuberth

1
Ghi nhật ký lỗi nghiêm ngặt trong sản xuất cũng là một thực tế xấu, tuy nhiên. Vì bạn sẽ điền vào nhật ký của mình những thông báo có khả năng không quan trọng, gây ra một hoặc cả hai vấn đề sau: serverAdmin sẽ bỏ qua / bỏ qua lỗi và thư mục nhật ký sẽ tiêu tốn toàn bộ dung lượng máy chủ tại một số điểm.
Lance

4
Điều này không hiệu quả với tôi - đã phải sử dụng E_ALL & ~ E_STRICT từ Fake Code Monkey Rashid nhận xét từ câu trả lời bên dưới
bao vây

1
Làm thế nào điều này hoạt động cùng với những điều sau đây tôi tìm thấy trong php.ini log_errors = On Vs ini_set ('display_errors', '0'); Là một bộ cuối cùng là chiến thắng?
hạ cánh

@nate khi bạn đăng một số mã xin vui lòng cho chúng tôi biết nơi chúng tôi có thể dán nó. Tôi không biết được nơi để đặt nó: vào php.inihoặc .htaccesshoặc nơi nào đó trong mã PHP của tôi.
Đã được đăng

89

Không có lỗi.

error_reporting(0);

hoặc không nghiêm ngặt

error_reporting(E_ALL ^ E_STRICT);

và nếu bạn muốn hiển thị lại tất cả các lỗi, hãy sử dụng

error_reporting(-1);


56
+1: Tôi tin rằng ^chỉ tốt khi bỏ qua một loại lỗi. Nếu bạn muốn tắt các loại bổ sung, bạn nên sử dụng E_ALL & ~E_DEPRECATED & ~E_STRICTđịnh dạng. Hoặc có lẽ là (E_ALL & ~(E_DEPRECATED | E_STRICT))định dạng.
Mã giả Monkey Rashid

10
Lưu ý: E_STRICT chỉ là một phần của E_ALL kể từ php 5.4
Fred Haslam

@FakeCodeMonkeyRashid Tôi tự hỏi tại sao vậy? có lẽ bởi vì sau đó thứ tự trốn là quan trọng?
mã hóa

Loại bỏ báo cáo về các lỗi STRICT trong PHP <5.4 ini_set('error_reporting', E_ALL&~E_STRICT); Báo cáo loại bỏ các lỗi STRICT trong PHP> = 5.4ini_set('error_reporting', E_ALL^E_STRICT);
Mel_T

Tôi muốn chỉ ra rằng sử dụng ^("xor") chứ không phải & ~("và không") là một ý tưởng tồi ! ^phụ thuộc vào giả định rằng ví dụ E_STRICT là một phần của E_ALL và luôn luôn là một phần của nó. Điều này là xấu vì E_ALL đã thay đổi trong quá khứ (E_STRICT không phải là quá khứ của nó, nhưng bây giờ là từ PHP 5.4). Nếu một ngày giả định thất bại, ^nó sẽ không chỉ phá vỡ mà còn thực sự ngược lại với những gì nó phải làm: Nó sẽ kích hoạt E_STRICT do cách XOR ( ^) hoạt động. & ~tuy nhiên sẽ luôn vô hiệu hóa E_STRICT, bất kể giá trị hiện tại của E_ALL. Do đó & ~nên được sử dụng.
Jay

31

Tất cả các giải pháp trên là chính xác. Nhưng, khi chúng ta đang nói về một ứng dụng PHP bình thường, chúng phải được đưa vào mỗi trang mà nó yêu cầu. Một cách để giải quyết điều này, là thông qua .htaccessthư mục gốc. Chỉ để che giấu lỗi. [Đặt một trong các dòng tiếp theo trong tệp]

php_flag display_errors off

Hoặc là

php_value display_errors 0

Tiếp theo, để đặt báo cáo lỗi

php_value error_reporting 30719

Nếu bạn đang tự hỏi làm thế nào giá trị 30719đến, E_ALL (32767), E_STRICT (2048) thực sự là hằng số giữ giá trị số và ( 32767 - 2048 = 30719)


2
Cảm ơn rất nhiều - điều này đã tạo ra mánh khóe (giải pháp .htaccess) trong PHP 5.4.7 - không có gì khác - thậm chí sửa đổi .ini - đang thực hiện thủ thuật.

Tôi đã sử dụng php_admin_value error_reportingđể làm việc này (trong cấu hình vhost).
Lou Terrailloune

@Seza, Sửa lỗi rồi.
Starx

1
Không phải về trang, phương pháp này được ưa thích vì hầu hết các lỗi E_STRICT là thời gian biên dịch và không thể ghi đè trong thời gian chạy
AbiusX

2
Xin chào chỉ để làm cho nó dễ dàng hơn, đối với những người đang sử dụng wamp, bạn có thể vô hiệu hóa lỗi bằng cách nhấp vào php> php settings >> lỗi hiển thị. Nếu nó được kiểm tra thì bỏ chọn nó.
Hemang Rami

9

Giá trị mặc định của error_reporting cờ là E_ALL & ~ E_NOTICE nếu không được thiết lập trong php.ini. Nhưng trong một số cài đặt (đặc biệt là cài đặt nhắm mục tiêu môi trường phát triển) có E_ALL | E_STRICT được đặt làm giá trị của cờ này (đây là giá trị được đề xuất trong quá trình phát triển ). Trong một số trường hợp, đặc biệt khi bạn muốn chạy một số dự án nguồn mở, được phát triển trước thời đại PHP 5.3 và chưa được cập nhật với các thực tiễn tốt nhất được định nghĩa bởi PHP 5.3, trong môi trường phát triển của bạn, có thể bạn sẽ gặp phải một số tin nhắn như bạn đang nhận được. Cách tốt nhất để đối phó với tình huống này, là chỉ đặt E_ALL làm giá trị của cờ error_Vporting , trong hoặcphp.ini hoặc trong (có thể trong bộ điều khiển phía trước như index.php trong web-root như sau:

if(defined('E_STRICT')){
    error_reporting(E_ALL);
}

8

Trong tập tin php.ini:

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

4

WordPress

Nếu bạn làm việc trong môi trường wordpress, Wordpress sẽ đặt mức lỗi trong tệp wp-gộp / load.php trong hàm wp_debug_mode(). Vì vậy, bạn phải thay đổi cấp độ SAU KHI chức năng này đã được gọi (trong tệp không được kiểm tra trong git để chỉ phát triển) hoặc sửa đổi trực tiếp error_reporting()cuộc gọi


Điều này thực sự hữu ích, tôi đã bật chế độ gỡ lỗi cho một lần cài đặt Wordpress và không nhận ra nó đã làm điều này. Cảm ơn vì thông tin!
Tim

2

Tôi không thấy câu trả lời rõ ràng và phù hợp với phần mềm sẵn sàng sản xuất, vì vậy đây là:

/*
 * Get current error_reporting value,
 * so that we don't lose preferences set in php.ini and .htaccess
 * and accidently reenable message types disabled in those.
 *
 * If you want to disable e.g. E_STRICT on a global level,
 * use php.ini (or .htaccess for folder-level)
 */
$old_error_reporting = error_reporting();

/*
 * Disable E_STRICT on top of current error_reporting.
 *
 * Note: do NOT use ^ for disabling error message types,
 * as ^ will re-ENABLE the message type if it happens to be disabled already!
 */
error_reporting($old_error_reporting & ~E_STRICT);


// code that should not emit E_STRICT messages goes here


/*
 * Optional, depending on if/what code comes after.
 * Restore old settings.
 */
error_reporting($old_error_reporting);
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.