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




debugging error-handling (19)

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

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

तो, क्या जावा को उपयोगी त्रुटि संदेश उत्पन्न करने के लिए PHP प्राप्त करने का कोई तरीका है? क्या कोई अच्छी PHP डीबगिंग टिप्स, टूल्स और तकनीकों की सिफारिश कर सकता है?


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 प्रविष्टि के अंतर्गत पा सकते हैं।


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


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

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

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

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;
}

आप 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');

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

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

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


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

error_reporting = E_ALL | E_STRICT

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

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

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

यह भी सुनिश्चित करें कि php.ini में display_errors सक्षम है। यदि आपका PHP संस्करण 5.2.4 से बड़ा है, तो इसे On :

display_errors = "On"

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

display_errors = "stderr"

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

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

असम्बद्ध पंक्ति को इसमें बदलें:

display_errors = stdout

उपरोक्त बहुत से उत्कृष्ट उत्तरों के अतिरिक्त आप अपनी परियोजनाओं में निम्नलिखित दो कार्यों को भी कार्यान्वित कर सकते हैं। वे एप्लिकेशन / स्क्रिप्ट निकास से पहले प्रत्येक गैर-वाक्यविन्यास त्रुटि को पकड़ लेंगे। फ़ंक्शंस के अंदर आप बैकट्रैक कर सकते हैं और जनता के लिए एक सुखद 'साइट रखरखाव' संदेश भेज सकते हैं या प्रस्तुत कर सकते हैं।

घातक त्रुटियां:

register_shutdown_function

http://php.net/manual/en/function.register-shutdown-function.php

त्रुटियाँ:

set_error_handler

http://php.net/manual/en/function.set-error-handler.php

Backtracing:

debug_backtrace

http://php.net/manual/en/function.debug-backtrace.php


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

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

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

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

विचार करने के लिए अगली बातें:

  • Xdebug इंस्टॉल करें और अपने आईडीई के साथ रिमोट-डीबगिंग सक्षम करें।

साथ ही देखें:


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

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

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

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

अपने आईडीई में Xdebug जैसे डीबगर टूल का उपयोग करने का एक और तरीका।



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

error_reporting(E_ALL);

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

ini_set('display_errors', '1');

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


मेरी सामान्य समस्या "छोटी, बेवकूफ" पार्सर त्रुटियां हैं जो दुर्भाग्य से दिखाई नहीं देती हैं।

हालांकि, जब एक पीएचपी-फ़ाइल में एक फ़ाइल शामिल होती है जिसमें पार्सर-त्रुटियां होती हैं, तो वे दिखाए जाते हैं! इसलिए मुझे थोड़ा "निष्पादक-स्क्रिप्ट" लिखने का विचार था जिसे बग्गी फ़ाइल के नाम से तर्क के रूप में लॉन्च किया गया है, यानी example.com/sx.php?sc=buggy.php

यह मुझे पहले से ही बहुत सारे सिरदर्द से बचा चुका था, शायद यह किसी और के लिए सहायक होगा :)

sx.php

$sc = $_GET["sc"];
if ((!isset($_GET["sc"]) && empty($_GET["sc"]))) {
    echo "Please select file to execute using ?sc= (you may omit the .PHP-extension)";
} else {
    $sc = $_GET["sc"];
    if (false==stripos('.php',$sc)) $sc.='.php';  // adjust this if your preferred extension is php5!
    require($sc);
}
?>

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


यदि आप बहुत अच्छे हैं, तो आप कोशिश कर सकते हैं:

$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% त्रुटियों के लिए जो मैं करता हूं, यह कोई मुद्दा नहीं है।


वाक्यविन्यास त्रुटियों के लिए, आपको 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 (जैसा कि गम्बो द्वारा उल्लिखित) के मान का उपयोग करने पर विचार करना चाह सकते हैं। और जानकारी

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

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

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

कार्टमैन का link भी बहुत अच्छा है: link


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


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

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


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




error-handling