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




debugging error-handling (23)

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

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

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


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

http://todell.com/debug भी उपयोगी हो सकता है। आप उत्पादन ऑब्जेक्ट में भी अपने ऑब्जेक्ट वैल्यू या दृश्य के पीछे डीबग त्रुटियों को फेंक सकते हैं।


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

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


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

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

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

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

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

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

साथ ही देखें:


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

इस प्रकार, मैं हमेशा एक फ़ाइल / प्रोग्राम (जिसे मैं आमतौर पर "genwrap.php" कहता हूं) बनाते हैं, जिसमें अनिवार्य रूप से एक ही कोड है जो लोकप्रिय समाधान (यानी त्रुटि रिपोर्टिंग चालू करें) के रूप में है और इसके बाद भी वह पृष्ठ भी शामिल है जिसे मैं वास्तव में चाहता हूं कहते हैं।

इस डीबगिंग को लागू करने के लिए 2 कदम हैं;

एक - genwrap.php बनाएं और इस कोड को इसमें रखें:

<?php
error_reporting(-1);
ini_set('display_errors', 'On');

include($_REQUEST['page']);
?>

दो - genwrap.php के माध्यम से जाने के लिए प्रोग्राम / पेज पर लिंक को डिबग करना चाहते हैं,

उदाहरण: परिवर्तन:

$.ajax('dir/pgm.php?param=val').done(function(data) { /* ... */

सेवा मेरे

$.ajax('dir/genwrap.php?page=pgm.php&param=val').done(function(data) { /* ... */

वाक्यविन्यास त्रुटियों के लिए, आपको 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


इसे जारी रखने और इसे 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


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

error_reporting(E_ALL);

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

ini_set('display_errors', '1');

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


error_reporting(E_ALL | E_STRICT);

और php.ini में प्रदर्शन त्रुटियों को चालू करें


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


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

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


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


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

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

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

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

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

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


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

error_reporting(E_ERROR | E_WARNING | E_PARSE);

किंट का प्रयोग करें। यह स्टेरॉयड पर डीबगिंग कमांड का संयोजन है। https://raveren.github.io/kint/ यह नेटटे ट्रेसी के समान है


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

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

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


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

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


आप अपने कोड संपादक के रूप में PHPStorm को भी आजमा सकते हैं। जब आप संपादक में टाइप कर रहे हों तो इसमें कई 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 प्रविष्टि के अंतर्गत पा सकते हैं।





error-handling