मुझे PHP में उपयोगी त्रुटि संदेश कैसे मिल सकते हैं?


583

काफी बार मैं कोशिश करूंगा कि PHP स्क्रिप्ट चलाऊं और बस एक खाली स्क्रीन वापस पा लूं। कोई त्रुटि संदेश नहीं; बस एक खाली स्क्रीन। कारण एक साधारण वाक्यविन्यास त्रुटि (गलत ब्रैकेट, लापता अर्धविराम), या एक असफल फ़ंक्शन कॉल, या पूरी तरह से कुछ और हो सकता है।

यह पता लगाना बहुत मुश्किल है कि क्या गलत हुआ। मैं अंत में हर जगह "गूंज" बयान दर्ज करने, आदि की समस्या को कम करने की कोशिश करते हुए, कोड को टिप्पणी करता हूं। लेकिन निश्चित रूप से एक बेहतर तरीका होना चाहिए, है ना?

क्या एक उपयोगी त्रुटि संदेश उत्पन्न करने के लिए PHP प्राप्त करने का एक तरीका है, जैसे जावा करता है?



2
इसके अलावा stackoverflow.com/q/1475297/632951
Pacerier

4
@JuannStrauss, यह समझ रहा है। और जब आप अंततः त्रुटियों को देखते हैं, तो यह कहता है T_PAAMAYIM_NEKUDOTAYIM। या हो सकता है "पूर्णांक का एक उदाहरण होना चाहिए, पूर्णांक दिया गया"
20

1
इस पर ट्यूटोरियल: code2real.blogspot.com/2015/06/…
Pupil

जवाबों:


498

सिंटैक्स त्रुटियों के लिए, आपको php.ini में त्रुटि प्रदर्शन को सक्षम करना होगा। डिफ़ॉल्ट रूप से इन्हें बंद कर दिया जाता है क्योंकि आप त्रुटि संदेश देखकर "ग्राहक" नहीं चाहते हैं। 2 निर्देशों पर जानकारी के लिए PHP दस्तावेज़ में इस पृष्ठ की जाँच करें : error_reportingऔर display_errorsdisplay_errorsशायद वह है जिसे आप बदलना चाहते हैं। यदि आप php.ini को संशोधित नहीं कर सकते हैं, तो आप एक .htaccess फ़ाइल में निम्न पंक्तियाँ भी जोड़ सकते हैं:

php_flag  display_errors        on
php_value error_reporting       2039

आप error_reportingसभी त्रुटियों को प्राप्त करने के लिए PHP के अपने संस्करण के लिए E_ALL (Gumbo द्वारा उल्लिखित) के मूल्य का उपयोग करने पर विचार करना चाह सकते हैं। और जानकारी

3 अन्य आइटम: (1) आप त्रुटि लॉग फ़ाइल की जांच कर सकते हैं क्योंकि इसमें सभी त्रुटियां होंगी (जब तक कि लॉगिंग को अक्षम नहीं किया गया है)। (2) निम्नलिखित 2 पंक्तियों को जोड़ने से आपको उन त्रुटियों को डीबग करने में मदद मिलेगी जो वाक्यविन्यास त्रुटियाँ नहीं हैं:

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

(3) एक अन्य विकल्प एक संपादक का उपयोग करना है जो आपके टाइप करते समय त्रुटियों की जांच करता है, जैसे कि PhpEd । PhpEd एक डिबगर के साथ भी आता है जो अधिक विस्तृत जानकारी प्रदान कर सकता है। (PhpEd डिबगर xdebug से बहुत मिलता-जुलता है और सीधे संपादक में एकीकृत होता है, इसलिए आप सब कुछ करने के लिए 1 का उपयोग करते हैं।)

कार्टमैन का लिंक भी बहुत अच्छा है: http://www.ibm.com/developerworks/library/os-debug/


25
2039 का मान है 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। देखें docs.php.net/manual/en/errorfunc.constants.php
Gumbo

मुझे .htaccess फ़ाइल का विकल्प पसंद है। यह मुझे ऐसे क्षेत्र में डिबग करने में मदद करता है जो सार्वजनिक वेबसाइट का हिस्सा नहीं है। इस टिप के लिए बहुत बहुत धन्यवाद!
jacekn

1
मैं उस लॉगिंग त्रुटियों को फ़ाइल में जोड़ दूंगा (और उन्हें वहां देख रहा हूं) सबसे अच्छा समाधान है। ऑन-पेज त्रुटियों को प्रदर्शित करने पर भरोसा न करें - वे इसे बर्बाद कर सकते हैं, आप उत्पादन साइट के लिए त्रुटि रिपोर्टिंग को चालू करने के लिए भूल सकते हैं और इससे आपको भविष्य में परेशानी होगी
इवान येरीच

455

निम्नलिखित सभी त्रुटियों को सक्षम करता है:

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

निम्न लिंक भी देखें


28
.Ini फ़ाइल स्तर पर ये परिवर्तन करने के लिए सबसे अच्छा है। स्क्रिप्ट के भीतर से त्रुटि रिपोर्टिंग चालू करना बेकार है, क्योंकि यह सिंटैक्स त्रुटियों या अन्य घातक त्रुटियों के साथ मदद नहीं करेगा जो संकलन चरण को मारते हैं। स्क्रिप्ट को मारना शुरू होने से पहले ही खत्म हो जाता है और रिपोर्टिंग ओवरराइड तक पहुँच जाती है।
मार्क बी

आप वास्तव में सही हैं। मैंने नहीं देखा कि यह चाल आपके अपने सर्वर की है।
एलजाकिम 19

6
सही php.ini फ़ाइल को खोजने के लिए phpinfo () चलाएँ। के लिए देखो लोडेड कॉन्फ़िगरेशन फ़ाइल लाइन।
०१ पर बोरूल

1
यदि आप संकलन चरण के दौरान होने वाली त्रुटियों की तलाश कर रहे हैं, तो अपने Apache लॉग को अक्सर /var/log/apache2/error.log
csi

1
सख्त टाइपिंग सक्षम होने पर यह उत्तर php7 पर विफल हो जाएगा, क्योंकि ini_setएक स्ट्रिंग का दूसरा पैरामीटर है।
PeeHaa

175

निम्नलिखित कोड को सभी त्रुटियों को प्रदर्शित करना चाहिए:

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

?>

इस कोड के साथ एक रिक्त पृष्ठ उत्पन्न करने का एकमात्र तरीका है जब आपके पास शटडाउन हैंडलर में कोई त्रुटि हो। मैंने इसे परीक्षण किए बिना अपने स्वयं के सेमी से कॉपी और पेस्ट किया, लेकिन मुझे यकीन है कि यह काम करता है।


4
मुझे उस कोड से एक खाली पृष्ठ मिलता है। "शटडाउन हैंडलर में आपको कोई त्रुटि है" से आपका क्या मतलब है और समस्या को हल करने के लिए मुझे क्या करना चाहिए?
पाओलो एम।

@PaoloM, वह ShutdownHandlerऊपर के फ़ंक्शन में त्रुटि कह रहा है। मूल रूप से यह उचित त्रुटि से निपटने के स्थान पर एक स्टॉपगैप हैक है।
पचेरियर

धन्यवाद, उपयोगी था, लेकिन मैं E_NOTICEइस फ़ंक्शन में त्रुटियों को कैसे अक्षम कर सकता हूं ?
माज़ी

यह सही समाधान है, लेकिन त्रुटि होने पर जानकारी बंद होने से सावधान रहें ... (उपयोगकर्ताओं को गूँजने के बजाय लॉगिंग पसंद करें)
सैम जेसन ब्रैडॉक

1
मैं इसका उपयोग कर रहा हूं जब सिम्फनी सही ढंग से घातक त्रुटियों को पकड़ नहीं सकती है।
कुंडल

61

त्रुटियों और चेतावनियों को आम तौर पर में दिखाई देते हैं ....\logs\php_error.logया ....\logs\apache_error.logअपने php.ini सेटिंग के आधार पर।

साथ ही उपयोगी त्रुटियां अक्सर ब्राउज़र को निर्देशित की जाती हैं, लेकिन जैसा कि वे मान्य HTML नहीं हैं उन्हें प्रदर्शित नहीं किया जाता है।

इसलिए "tail -f"अपनी लॉग फाइलें और जब आपको एक खाली स्क्रीन का उपयोग IE" दृश्य "->" स्रोत "मेनू विकल्प कच्चे आउटपुट को देखने के लिए होता है।


13
अफसोस की बात है, देखें पृष्ठ स्रोत कुछ भी प्रदर्शित नहीं करता है।
मैथ्यू शारले

2
अपाचे की त्रुटि लॉग में पार्स त्रुटियां दिखाई देनी चाहिए, भले ही आपके पास कहीं और क्या हो। यदि आपके पास सर्वर पर नियंत्रण नहीं है, तो अपाचे त्रुटि लॉग प्राप्त करना मुश्किल हो सकता है, लेकिन मेरा सुझाव है कि आप अपने प्रदाता से बात करें और त्रुटि लॉग को आपके सामने लाने के तरीके हैं। अन्य तो यह कि, मैं केवल सुझाव दे सकता हूं कि दूसरे के पास क्या है - उत्पादन करने के लिए तैनात करने से पहले अपने स्थानीय विकास सर्वर में त्रुटियों को पार्स करने के लिए अपना कोड। इसके अलावा, एक वैध आईडीई जैसे कि ग्रहण की पीडीटी से बहुत मदद मिल सकती है।
Guss

5
इस पर वापस आते हुए, मेरे पास हाल ही में एक स्टैक ओवरफ्लो मुद्दा था जो किसी भी त्रुटि को उत्पन्न नहीं कर रहा था, यहां तक ​​कि लॉग में भी और खुद को प्रकट नहीं किया था जब तक कि मैंने सर्वर में xdebug स्थापित नहीं किया था। गाह।
मैथ्यू शार्ले

यदि आप php.ini को संशोधित नहीं कर सकते हैं, तो php_flag display_errors 1उसमें .htaccess फ़ाइल बनाएँ ।
टॉम

59

आप उस फ़ाइल में निम्न पंक्तियों को शामिल कर सकते हैं जिसे आप डीबग करना चाहते हैं:

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

यह php.ini में डिफ़ॉल्ट सेटिंग्स को ओवरराइड करता है, जो सिर्फ PHP रिपोर्ट को लॉग में त्रुटियों को बनाते हैं।


2
यह सच है। इस मामले में मूल्यों को सीधे ini में सेट किया जाना चाहिए - शुद्ध विकास के माहौल के लिए यह वैसे भी बेहतर हो सकता है।
तोमलक

53

PHP विन्यास

Php.ini में 2 प्रविष्टियाँ त्रुटियों के आउटपुट को निर्धारित करती हैं:

  1. display_errors
  2. error_reporting

में उत्पादन , display_errorsआम तौर पर करने के लिए सेट कर दिया जाता Off(जो, एक अच्छी बात है क्योंकि उत्पादन साइटों में त्रुटि प्रदर्शन आम तौर पर वांछनीय नहीं है!)।

हालाँकि, विकास में , इसे सेट किया जाना चाहिए On, ताकि त्रुटियां प्रदर्शित हों। जाँच करें !

error_reporting(PHP 5.3 के रूप में) डिफ़ॉल्ट रूप से E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(अर्थ के लिए, सब कुछ नोटिस, सख्त मानकों और पदावनति नोटिस के अलावा) दिखाया गया है। जब संदेह हो, तो इसे सभी त्रुटियों E_ALLको प्रदर्शित करने के लिए सेट करें । जाँच करें !

वाह रे वाह! कोई जाँच नहीं! मैं अपना php.ini नहीं बदल सकता!

कि एक शर्म की बात है। आमतौर पर साझा किए गए होस्ट अपनी php.ini फ़ाइल को बदलने की अनुमति नहीं देते हैं, और इसलिए, यह विकल्प दुखद रूप से अनुपलब्ध है। लेकिन डर नहीं! हमारे पास अन्य विकल्प हैं !

रनटाइम कॉन्फ़िगरेशन

वांछित स्क्रिप्ट में, हम php.ini प्रविष्टियों को रनटाइम में बदल सकते हैं! मतलब, जब स्क्रिप्ट चलेगी तो यह चलेगा! मिठाई!

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

ये दोनों लाइनें php.ini प्रविष्टियों को ऊपर के रूप में बदलने के रूप में एक ही प्रभाव डालेंगी! बहुत बढ़िया!

मुझे अभी भी एक खाली पृष्ठ / 500 त्रुटि मिलती है!

इसका मतलब है कि स्क्रिप्ट भी नहीं चली थी! यह आमतौर पर तब होता है जब आपके पास एक सिंटैक्स त्रुटि होती है!

सिंटैक्स त्रुटियों के साथ, स्क्रिप्ट को रनटाइम तक भी नहीं मिलता है। यह संकलन के समय में विफल रहता है , जिसका अर्थ है कि यह php.ini में उन मूल्यों का उपयोग करेगा, जिन्हें यदि आपने नहीं बदला है, तो त्रुटियों के प्रदर्शन की अनुमति नहीं दी जा सकती है।

त्रुटि लॉग

इसके अलावा, डिफ़ॉल्ट रूप से PHP त्रुटि लॉग करता है। साझा होस्टिंग में, यह एक समर्पित फ़ोल्डर में हो सकता है या आपत्तिजनक स्क्रिप्ट के समान फ़ोल्डर में हो सकता है।

यदि आपके पास php.ini तक पहुंच है, तो आप इसे error_logप्रविष्टि के तहत पा सकते हैं ।


30

वास्तव में " xdebug " नामक एक उपयोगी एक्सटेंशन है जो आपकी रिपोर्ट को बहुत अच्छा बना देगा।


2
वास्तव में, यह एक बहुत ही उपयोगी डिबगिंग टूल है- त्रुटि संदेशों को और अधिक क्रिया करता है, जिसमें पूर्ण स्टैक निशान और चर डंप और सब कुछ होता है।
hbw

2
हाँ। और फिर अपने कोड के माध्यम से कदम रखने और यह पता लगाने के लिए कि क्या यह गलत हो जाता है, VimDebugger प्लगइन जैसे कुछ का उपयोग करें।
सैंडर मारेचल

1
यहाँ xdebug के साथ NetBeans। यह कमाल का है। मैं PHP (आमतौर पर ASP.NET) के लिए नया हूँ और इससे पहले गूंज वक्तव्य जारी कर रहा था।
कुछ कैन

30

मैं हमेशा php स्क्रिप्ट के शीर्ष पर इस वाक्यविन्यास का उपयोग कर रहा हूं।

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

3
मुझे खेद है, लेकिन पहले से पोस्ट किए गए अन्य उत्तरों को न पढ़ने के लिए -1। कई बार पहले ही बताए गए .htaccess में इस बात का ध्यान रखा जाता है।
मैथ्यू शार्ले

12
आम तौर पर "मुफ्त होस्टिंग" .htaccess को अनदेखा करता है
FDisk

27

त्वरित रूप से, समस्या निवारण के लिए, मैं आमतौर पर SO पर यहाँ सुझाव देता हूं:

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

उस स्क्रिप्ट की शुरुआत में रखा जाए, जो परेशानी में है। यह सही नहीं है, सही संस्करण यह है कि आप php.iniसिंटैक्स और स्टार्टअप त्रुटियों को पकड़ने के लिए PHP में त्रुटियों को लॉग इन करने के लिए भी सक्षम करते हैं।

यहां उल्लिखित सेटिंग्स सभी त्रुटियों, सूचनाओं और चेतावनियों को प्रदर्शित करती हैं, जिनमें सख्त भी शामिल हैं, चाहे जो भी PHP संस्करण हो।

अगली बातों पर विचार करें:

  • Xdebug स्थापित करें और अपने IDE के साथ दूरस्थ डिबगिंग सक्षम करें ।

साथ ही देखें:


27

अंतिम त्रुटि या चेतावनी को दृश्यमान बनाने के लिए हुक दर्ज करना संभव है।

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

register_shutdown_function('shutdown');

इस कोड को आप की शुरुआत में शामिल करके index.php आपको समस्याओं को डीबग करने में मदद करेगा।


1
यह उन लोगों के लिए शुद्ध सोना है, जो वेबहोस्ट में फंस गए हैं, जिसमें कोई त्रुटि नहीं है, लेकिन शून्य लॉग एक्सेस की अनुमति देता है
राफेल मेना बैरेटो

18

यह लोडेड बनाम रनटाइम कॉन्फ़िगरेशन की समस्या है

यह समझना महत्वपूर्ण है कि संकलित त्रुटि या पार्स त्रुटि संकलन या पार्सिंग चरण के दौरान होती है , जिसका अर्थ है कि PHP इससे पहले कि आपके किसी भी कोड को निष्पादित करने का मौका था, जमानत हो जाएगी। इसलिए यदि आप display_errorsरनटाइम के दौरान PHP के कॉन्फ़िगरेशन को संशोधित कर रहे हैं , (इसमें ini_setआपके कोड का उपयोग करने से लेकर .htaccess, जो कि रनटाइम कॉन्फ़िगरेशन फ़ाइल है) में कुछ भी शामिल है , तब केवल डिफ़ॉल्ट लोड कॉन्फ़िगरेशन सेटिंग्स ही चलन में हैं।

हमेशा विकास में WSOD से कैसे बचें

एक WSOD आप सुनिश्चित करें कि आपके बनाना चाहते से बचने के लिए लोड विन्यास फाइल है display_errorsपर और error_reportingकरने के लिए सेट -1( इस बराबर E_ALL क्योंकि यह सुनिश्चित सभी बिट्स पीएचपी का कौन सा संस्करण आप चला रहे हैं की परवाह किए बिना चालू हैं है )। E_ALL के निरंतर मूल्य को हार्डकोड न करें, क्योंकि यह मूल्य PHP के विभिन्न संस्करणों के बीच परिवर्तन के अधीन है।

लोडेड विन्यास या तो अपने लोड php.iniफ़ाइल या अपने apache.confया httpd.confया वर्चुअलहोस्ट फ़ाइल। वे फ़ाइलें केवल स्टार्टअप चरण के दौरान एक बार पढ़ी जाती हैं (जब आप पहली बार Apache httpd या php-fpm शुरू करते हैं, उदाहरण के लिए) और केवल रनटाइम कॉन्फ़िगरेशन परिवर्तन द्वारा ओवरराइड किया जाता है। यह सुनिश्चित करना कि display_errors = 1और error_reporting = -1आपकी भरी हुई विन्यास फाइल में यह सुनिश्चित किया गया है कि आप कभी भी WSOD को सिंटैक्स या पार्स त्रुटि की परवाह किए बिना नहीं देखेंगे, जो रनटाइम बदलने से पहले घटित हो सकता है ini_set('display_errors', 1);या error_reporting(E_ALL);हो सकता है।

आपकी (php.ini) लोड की गई कॉन्फ़िगरेशन फ़ाइलों को कैसे खोजें

अपनी भरी हुई कॉन्फ़िगरेशन फ़ाइल (एस) का पता लगाने के लिए केवल निम्नलिखित कोड के साथ एक नई PHP फ़ाइल बनाएं ...

<?php
phpinfo();

फिर अपने ब्राउज़र को वहां इंगित करें और लोड की गई कॉन्फ़िगरेशन फ़ाइल और अतिरिक्त .ini फ़ाइलों को देखें , जो आमतौर पर आपके सबसे ऊपर हैं और आपकी phpinfo()सभी भरी हुई कॉन्फ़िगरेशन फ़ाइलों में पूर्ण पथ शामिल करेंगी।

यदि आप (none)फ़ाइल के बजाय देखते हैं , तो इसका मतलब है कि आपके पास कॉन्फ़िगरेशन फ़ाइल (php.ini) पथ में php.ini नहीं है । तो आप यहां से PHP के साथ बंडल किए गए स्टॉक php.ini को डाउनलोड कर सकते हैं और इसे अपने कॉन्फ़िगरेशन फ़ाइल पथ में php.ini के रूप में कॉपी कर सकते हैं, फिर सुनिश्चित करें कि आपके php उपयोगकर्ता के पास उस फ़ाइल से पढ़ने के लिए पर्याप्त अनुमतियाँ हैं। आप पुनः आरंभ httpd या php-एफ पी एम में लोड करने के लिए की आवश्यकता होगी। याद रखें, यह है विकास पीएचपी स्रोत के साथ आता है कि php.ini फ़ाइल। तो कृपया इसे उत्पादन में उपयोग न करें!


उत्पादन में बस यह मत करो

यह वास्तव में विकास में एक WSOD से बचने का सबसे अच्छा तरीका है। किसी को भी सुझाव है कि आप डाल ini_set('display_errors', 1);या error_reporting(E_ALL);अपने PHP स्क्रिप्ट के शीर्ष पर या .htaccess का उपयोग कर की तरह तुम यहाँ किया था, मदद करने के लिए आप जब एक वाक्य रचना या पार्स त्रुटि (आपके मामले में की तरह यहाँ) होती है, तो अपने लोड विन्यास फाइल एक WSOD से बचने नहीं जा रहा है display_errorsबंद हो गया है।

कई लोग (और PHP के स्टॉक इंस्टॉलेशन) एक प्रोडक्शन-आईआई फाइल का उपयोग करेंगे display_errors, जो डिफ़ॉल्ट रूप से बंद हो गया है, जिसके परिणामस्वरूप आमतौर पर आपके द्वारा यहां अनुभव की गई इसी निराशा होती है। क्योंकि PHP पहले ही बंद हो गई है जब वह शुरू होता है, तो एक सिंटैक्स या पार्स त्रुटि का सामना करता है, और आउटपुट के बिना कुछ भी नहीं होता है। आप उम्मीद करते हैं कि आपके ini_set('display_errors',1);PHP स्क्रिप्ट के शीर्ष पर रहने से आपको बचना चाहिए था, लेकिन इससे कोई फर्क नहीं पड़ता कि क्या PHP आपके कोड को पार्स नहीं कर सकता क्योंकि यह रनटाइम तक कभी नहीं पहुंचेगा।


17

यदि आप सुपर कूल हैं, तो आप कोशिश कर सकते हैं:

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

यह केवल त्रुटियों को प्रदर्शित करेगा जब आप स्थानीय स्तर पर चल रहे हैं। यह आपको अन्य स्थानों में जहाँ उपयुक्त हो test_server चर का उपयोग करने के लिए देता है।

स्क्रिप्ट रन से पहले होने वाली कोई भी त्रुटि नहीं पकड़ी जाएगी, लेकिन 99% त्रुटियों के लिए, जो मैं करता हूं, यह एक मुद्दा नहीं है।


2
यदि आप स्थानीय और उत्पादन परिवेशों के बीच अंतर कर रहे हैं, तो आपको विश्व स्तर पर (अपने php.ini में) त्रुटियों को सक्षम या अक्षम करना चाहिए न कि उस कोड में जो उत्पादन कोड भी हो सकता है। यदि आपको किसी उत्पादन वेबसाइट को उसके उत्पादन परिवेश में डीबग करने की आवश्यकता है और केवल आप त्रुटियों को देखने में सक्षम होना चाहते हैं, $_SERVER['REMOTE_HOST']तो यह जांचने के लिए उपयोग करें कि क्या क्लाइंट, ठीक है, आप।
जाप हागमंस

17

पृष्ठ के शीर्ष पर एक पैरामीटर चुनें

error_reporting(E_ERROR | E_WARNING | E_PARSE);

16

इसे जारी रखने और इसे औपचारिक बनाने के लिए, आप अपनी php.ini फ़ाइल को संपादित कर सकते हैं। यह आमतौर पर में संग्रहित है /etc/php.iniया /etc/php/php.iniहै, लेकिन अधिक स्थानीय php.iniकी यह ओवरराइट कर सकता है, अपने होस्टिंग प्रदाता के सेटअप के दिशा-निर्देशों के आधार पर। शीर्ष पर एक phpinfo()फ़ाइल की जांच करें Loaded Configuration File, यह सुनिश्चित करने के लिए कि कौन अंतिम लोड हो रहा है।

उस फ़ाइल में display_errors खोजें। केवल 3 उदाहरण होने चाहिए, जिनमें से 2 पर टिप्पणी की गई है।

अधूरी रेखा को इसमें बदलें:

display_errors = stdout

16

डननो अगर यह मदद करेगा, लेकिन यहाँ php परियोजनाओं के लिए मेरे मानक विन्यास फ़ाइल का एक टुकड़ा है। मैं अपने स्वयं के सर्वर पर भी अपाचे कॉन्फ़िगरेशन पर बहुत अधिक निर्भर नहीं करता हूं।

मुझे कभी भी गायब होने की समस्या नहीं है, इसलिए शायद यहाँ कुछ आपको एक विचार देगा।

APPLICATON_LIVE दिखाने के लिए संपादित किया गया

/*
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>");
}

@ एली, यह एक रनटाइम ओवरहेड है, हालांकि, प्रति पेज अनुरोध
पेसियर

डिबग सेटिंग्स को अनदेखा करने वाली अवधारणा के लिए 1 अप हालांकि सर्वर को कॉन्फ़िगर किया गया है, जब आप तैनाती कर रहे हैं या बनाए रख रहे हैं तो अच्छा है (विकास के तहत)
justnajm

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

इसके अलावा, आप xdebug के साथ अधिक विस्तृत जानकारी प्राप्त कर सकते हैं ।


Xdebug को php.ini
jewelhuq

15

मैं PHP में त्रुटियों और अपवादों के बेहतर दृश्य के लिए नेट्टे ट्रेसी की सलाह देता हूं :

Nette ट्रेसी स्क्रीनशॉट


3
ट्रेसी सभी प्रदर्शन त्रुटियों की उचित सेटिंग के बारे में ध्यान रखती है और मूल पोस्ट में वर्णित स्थितियों में आउटपुट प्रदान करने के लिए त्रुटि रिपोर्टिंग विकल्प ... तो यह टूल विशेष रूप से आस्कर को संबोधित करने के लिए सहायक है "क्या कोई भी अच्छे PHP डिबगिंग टिप्स, टूल्स और तकनीकों की सिफारिश कर सकता है? "।
बजे जन ड्रबेक



9

आप PHP में अपना खुद का एरर हैंडलर रजिस्टर कर सकते हैं । फ़ाइल की सभी त्रुटियों को डंप करना आपको इन अस्पष्ट मामलों में मदद कर सकता है, उदाहरण के लिए। ध्यान दें कि आपके फ़ंक्शन को कॉल किया जाएगा, इससे कोई फर्क नहीं पड़ता कि आपकी वर्तमान error_reporting किस पर सेट है। बहुत बुनियादी उदाहरण:

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

पीएचपी से उपयोगी त्रुटियां प्राप्त करने के लिए आपको जिन दो प्रमुख लाइनों की आवश्यकता है, वे हैं:

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

जैसा कि अन्य योगदानकर्ताओं द्वारा बताया गया है, सुरक्षा कारणों से इन्हें डिफ़ॉल्ट रूप से बंद कर दिया जाता है। एक उपयोगी टिप के रूप में - जब आप अपनी साइट सेट कर रहे होते हैं तो अपने विभिन्न वातावरणों के लिए एक स्विच करना आसान होता है ताकि ये त्रुटियां आपके स्थानीय और विकास परिवेशों में डिफ़ॉल्ट रूप से चालू रहें। यह निम्नलिखित कोड के साथ प्राप्त किया जा सकता है (आदर्श रूप से आपके index.php या कॉन्फ़िगर फ़ाइल में तो यह शुरू से सक्रिय है):

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

FirePHP उपयोगी भी हो सकता है।


मुझे ध्यान देना चाहिए कि फ़ायरबग फ़ायरफ़ॉक्स कंसोल में एकीकृत होने के बाद से फायरहैप एक मृत परियोजना है। ChromePHP वहां का उत्तराधिकारी है, लेकिन पूरी तरह से नहीं।
मचाविटी

6

अपने php.ini को खोलें, सुनिश्चित करें कि यह इसके लिए सेट है:

display_errors = On

अपने सर्वर को पुनरारंभ करें।


6

आप अपने कोड संपादक के रूप में PHPStorm भी आज़माना चाह सकते हैं। जैसा कि आप संपादक में टाइप कर रहे हैं, यह कई PHP और अन्य वाक्यविन्यास त्रुटियों को सही पाएगा।


6

यदि आप एक ubuntu उपयोगकर्ता हैं, तो अपने टर्मिनल को गोटो और इस कमांड को चलाएं

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

जहां यह हाल की 50 त्रुटियों को प्रदर्शित करेगा। error.logApache2 के लिए एक त्रुटि फ़ाइल है जो सभी त्रुटियों को लॉग करती है।


5

पूर्ण त्रुटि रिपोर्टिंग चालू करने के लिए, इसे अपनी स्क्रिप्ट में जोड़ें:

error_reporting(E_ALL);

यह दिखाने के लिए भी कम से कम चेतावनी का कारण बनता है। और, बस मामले में:

ini_set('display_errors', '1');

त्रुटियों के प्रदर्शन को मजबूर करेगा। इसे उत्पादन सर्वरों में बंद कर दिया जाना चाहिए, लेकिन जब आप विकास कर रहे हों, तब नहीं।


टॉमालक के जवाब के साथ, यह सिंटैक्स त्रुटियों के लिए काम नहीं करता है।
डैरिल हेन

5

डेवलपर्स को उनकी गलतियों को जानने के लिए "ERRORS" सबसे उपयोगी चीजें हैं और सिस्टम को सही काम करने के लिए उन्हें हल किया।

PHP डेवलपर्स को यह जानने के लिए कुछ बेहतर तरीके प्रदान करता है कि उनके कोड को क्यों और कहां से त्रुटियां मिल रही हैं, इसलिए उन त्रुटियों को जानकर डेवलपर्स अपने कोड को कई तरीकों से बेहतर बना सकते हैं।

सभी त्रुटि संदेश प्राप्त करने के लिए स्क्रिप्ट के शीर्ष पर निम्नलिखित दो पंक्तियों को लिखने के सर्वोत्तम तरीके:

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

आपके IDE में xdebug जैसे डिबगर टूल का उपयोग करने का दूसरा तरीका ।


4

आप पूर्ण त्रुटि रिपोर्टिंग (नोटिस और सख्त संदेश सहित) सक्षम कर सकते हैं। कुछ लोगों को यह बहुत अधिक लगता है, लेकिन यह एक कोशिश के काबिल है। सेट error_reportingकरने के लिए E_ALL | E_STRICTअपने php.ini में।

error_reporting = E_ALL | E_STRICT

E_STRICT आपको पदावनत कार्यों के बारे में सूचित करेगा और आपको कुछ कार्य करने के सर्वोत्तम तरीकों के बारे में सिफारिशें देगा।

यदि आप नोटिस नहीं चाहते हैं, लेकिन आप अन्य संदेश प्रकार सहायक पाते हैं, तो नोटिस को छोड़कर प्रयास करें:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

यह भी सुनिश्चित करें कि display_errorsphp.ini में सक्षम है। यदि आपका PHP संस्करण 5.2.4 से अधिक पुराना है, तो इसे Onनिम्न पर सेट करें :

display_errors = "On"

यदि आपका संस्करण 5.2.4 या नया है, तो उपयोग करें:

display_errors = "stderr"

4

Error_reporting और display_errors ini सेटिंग के अलावा, आप अपने वेब सर्वर की लॉग फ़ाइलों से SYNTAX त्रुटियां प्राप्त कर सकते हैं। जब मैं PHP विकसित कर रहा हूं तो मैं अपने संपादक में अपने विकास प्रणाली के वेब सर्वर लॉग लोड करता हूं। जब भी मैं एक पृष्ठ का परीक्षण करता हूं और एक रिक्त स्क्रीन प्राप्त करता हूं, तो लॉग फ़ाइल बासी हो जाती है और मेरा संपादक पूछता है कि क्या मैं इसे फिर से लोड करना चाहता हूं। जब मैं करता हूं, तो मैं नीचे कूदता हूं और वाक्यविन्यास त्रुटि होती है। उदाहरण के लिए:

[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

उन लोगों के लिए जो नगीनेक्स का उपयोग करते हैं और फ़ाइल के साथ एक सफेद स्क्रीन भी रखते हैं <?php echo 123;। मेरे मामले में मेरे पास nginx config फाइल में PHP के लिए यह आवश्यक विकल्प नहीं था:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

यह विकल्प fastcgi_params फ़ाइल में नहीं था, इसलिए PHP काम नहीं करती थी और लॉग में कोई त्रुटि नहीं थी।


मुझे भी यही समस्या थी और इसकी वजह से उस लाइन में Nginx की डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइल गायब थी।
सलेम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.