दोस्तों, आज हम उस चीज़ के बारे में बात करेंगे जो किसी और के PHP कोड में खोजबीन करने वाले हर किसी को पागल कर देती है। आप एक वेबसाइट खोलते हैं, और वहाँ कुछ नहीं होता। एक खाली स्क्रीन। कोई त्रुटि नहीं, कोई सुराग नहीं कि क्या गलत हुआ।
यह परिचित लगता है?
यह PHP घातक त्रुटि का क्लासिक मामला है जो केवल स्क्रिप्ट को मार देती है और बिना कुछ कहे गायब हो जाती है। आज, हम सीखेंगे कि PHP को कैसे बोलना है, लॉग्स को सक्षम करना है, और उन घातक त्रुटियों को ढूंढना है जो "मौत की सफेद स्क्रीन" के पीछे छिपी होती हैं।
PHP चुप क्यों रहती है: थोड़ा सिद्धांत
सबसे पहले, आइए समझें कि PHP सामान्य रूप से त्रुटियों को कैसे संभालती है। यह केवल "त्रुटि -> लॉग" नहीं है। एक पूरा पदानुक्रम है।
PHP 7+ में, जो कुछ भी गलत हो सकता है वह Throwable इंटरफ़ेस को लागू करता है। इसके दो मुख्य उत्तराधिकारी हैं: - Error — PHP आंतरिक त्रुटियाँ (घातक, पार्स, प्रकार त्रुटियाँ) - Exception — अपवाद जिन्हें try-catch से पकड़ा जा सकता है
घातक त्रुटियाँ (E_ERROR, E_PARSE, E_CORE_ERROR) किसी भी डेवलपर के लिए सबसे बुरा सपना होती हैं। वे स्क्रिप्ट को तुरंत मार देती हैं, और set_error_handler() के माध्यम से मानक हैंडलर उन्हें नहीं पकड़ पाते हैं । घातक त्रुटि को पकड़ने का एकमात्र तरीका register_shutdown_function() का उपयोग करना है।
लेकिन चलिए कदम से कदम मिलाकर चलते हैं। पहले, हमें लॉगिंग सक्षम करने की आवश्यकता है ताकि त्रुटियाँ वास्तव में कहीं लिखी जाएँ।
चरण 1: php.ini के माध्यम से लॉगिंग सक्षम करना
लॉग्स कॉन्फ़िगर करने का सबसे सही तरीका PHP कॉन्फ़िगरेशन फ़ाइल को संपादित करना है। यह कहाँ स्थित है, यह आपके सिस्टम पर निर्भर करता है :
| सिस्टम | php.ini का पथ |
|---------|---------------|
| Ubuntu/Debian (Apache) | /etc/php/7.x/apache2/php.ini |
| Ubuntu/Debian (CLI) | /etc/php/7.x/cli/php.ini |
| Ubuntu/Debian (PHP-FPM) | /etc/php/7.x/fpm/php.ini |
| CentOS/RHEL | /etc/php.ini या /etc/php.d/ |
| Windows (XAMPP) | C:\xampp\php\php.ini |
| Windows (WAMP) | C:\wamp\bin\php\phpX.X.X\php.ini |
इस फ़ाइल में, हम निम्नलिखित निर्देशों में रुचि रखते हैं :
```ini ; लॉग फ़ाइल में त्रुटियाँ लिखना सक्षम करें (अनिवार्य!) log_errors = On
; लॉग फ़ाइल का पथ निर्दिष्ट करें error_log = /var/log/php_errors.log
; स्क्रीन पर त्रुटियाँ प्रदर्शित करना अक्षम करें (उत्पादन के लिए!) display_errors = Off
; विकास के लिए, आप इसे सक्षम कर सकते हैं, लेकिन बाद में इसे निष्क्रिय कर दें display_startup_errors = Off
; त्रुटि रिपोर्टिंग स्तर — सभी त्रुटियाँ error_reporting = E_ALL ```
महत्वपूर्ण: कमांड-लाइन इंटरफ़ेस (CLI) अपनी स्वयं की php.ini का उपयोग करता है, और लॉग एक अलग स्थान पर लिखे जा सकते हैं । यदि आप कंसोल में किसी स्क्रिप्ट का परीक्षण कर रहे हैं, तो अलग से जाँच करें।
परिवर्तन करने के बाद, आपको वेब सर्वर को पुनरारंभ करना होगा :
bash
sudo systemctl restart apache2 # Apache के लिए
sudo systemctl restart php7.4-fpm # PHP-FPM के लिए
इन सेटिंग्स का क्या अर्थ है
- log_errors = On — त्रुटियों को फ़ाइल में लिखना सक्षम करता है। इसके बिना, PHP कब्र की तरह चुप रहेगी ।
- error_log — उस फ़ाइल का पथ जहाँ सब कुछ लिखा जाएगा। यह महत्वपूर्ण है कि वेब सर्वर उपयोगकर्ता (आमतौर पर
www-dataयाapache) के पास इस फ़ाइल और इसकी निर्देशिका के लिए लिखने की अनुमति हो । - display_errors = Off — उत्पादन में उपयोगकर्ताओं को विवरण उजागर करने से बचने के लिए इसे निश्चित रूप से बंद करें ।
- error_reporting = E_ALL — सभी प्रकार की त्रुटियों को लॉग करें। उत्पादन के लिए, आप इसे सीमित कर सकते हैं, लेकिन डिबगिंग के लिए सब कुछ देखना बेहतर है।
चरण 2: विकल्प: सीधे कोड में लॉगिंग सक्षम करना
यदि आपके पास php.ini तक पहुंच नहीं है (उदाहरण के लिए, साझा होस्टिंग पर), तो आप ini_set() फ़ंक्शन का उपयोग करके सीधे अपनी स्क्रिप्ट में लॉगिंग सक्षम करने का प्रयास कर सकते हैं।
समस्याग्रस्त फ़ाइल की शुरुआत में यह डालें:
```php
/dev/null ``` या `phpinfo();` के साथ एक PHP फ़ाइल बनाएँ और **error_log** अनुभाग देखें। ## चरण 4: लॉग पढ़ना: उपकरण और तकनीकें एक बार जब लॉग लिखे जा रहे हों, तो आपको यह जानना होगा कि उन्हें जल्दी से कैसे देखा और फ़िल्टर किया जाए। ### tail — नवीनतम घटनाओं को देखना ```bash # अंतिम 50 पंक्तियाँ tail -n 50 /var/log/php_errors.log # वास्तविक समय में अनुसरण करें (जैसे docker logs -f) tail -f /var/log/php_errors.log ``` ### grep — विशिष्ट त्रुटियों की खोज करना ```bash # केवल घातक त्रुटियाँ grep "Fatal error" /var/log/php_errors.log # पार्स त्रुटियाँ (सिंटैक्स त्रुटियाँ) grep "Parse error" /var/log/php_errors.log # केस अनदेखा करें (बड़े-छोटे अक्षर) grep -i "warning" /var/log/php_errors.log ``` ### less — नेविगेशन के साथ सुविधाजनक दृश्य ```bash less /var/log/php_errors.log ``` less के अंदर, आप खोजने के लिए `/` दबा सकते हैं और एक शब्द टाइप कर सकते हैं, अगले मिलान के लिए `n`, पिछले के लिए `N`। ### संयोजन — एक शक्तिशाली पाइपलाइन ```bash # अंतिम 100 पंक्तियाँ दिखाएँ और त्रुटियाँ खोजें tail -n 100 /var/log/php_errors.log | grep -i fatal # वास्तविक समय में अनुसरण करें और फ़िल्टर करें tail -f /var/log/php_errors.log | grep --line-buffered "error" # त्रुटियों को प्रकार के अनुसार गिनें grep -o "PHP [A-Za-z]* error" /var/log/php_errors.log | sort | uniq -c ``` ## चरण 5: त्रुटियों को समझना: क्या है क्या एक विशिष्ट लॉग प्रविष्टि इस तरह दिखती है : ``` [2026-03-04 14:35:22 UTC] PHP Fatal error: Uncaught Error: Call to undefined function foo() in /var/www/html/index.php on line 10 ``` आइए इसे समझें: - **तिथि और समय** — यह कब हुआ - **PHP Fatal error** — त्रुटि स्तर - **Uncaught Error: Call to undefined function foo()** — संदेश - **/var/www/html/index.php:10** — फ़ाइल और पंक्ति संख्या मुख्य त्रुटि स्तर : | स्तर | अर्थ | उदाहरण | |------|------|---------| | **E_ERROR** / **Fatal error** | घातक त्रुटि, स्क्रिप्ट मर जाती है | गैर-मौजूद फ़ंक्शन को कॉल करना, मेमोरी अपर्याप्त | | **E_WARNING** / **Warning** | चेतावनी, लेकिन स्क्रिप्ट जारी है | गैर-मौजूद फ़ाइल का `include` | | **E_PARSE** / **Parse error** | सिंटैक्स त्रुटि, स्क्रिप्ट नहीं चलेगी | लापता अर्धविराम | | **E_NOTICE** / **Notice** | नोटिस, आमतौर पर गंभीर नहीं | अपरिभाषित चर तक पहुँचना | | **E_DEPRECATED** | अप्रचलित निर्माण | `mysql_connect()` का उपयोग करना | ## चरण 6: घातक त्रुटियों को पकड़ना (दिलचस्प हिस्सा) घातक त्रुटियाँ वे हैं जिन्हें मानक `set_error_handler()` द्वारा नहीं पकड़ा जा सकता है। वे स्क्रिप्ट को तुरंत मार देती हैं, और डिफ़ॉल्ट हैंडलर के पास निष्पादित होने का समय नहीं होता है । लेकिन एक रास्ता है! `register_shutdown_function()` का उपयोग करें — यह फ़ंक्शन किसी भी स्थिति में कॉल किया जाता है, यहाँ तक कि घातक त्रुटि पर भी । ### सरल घातक त्रुटि हैंडलर ```php getMessage()." | ".$e->getFile().":".$e->getLine()." | $url\n"; file_put_contents($logFile, $msg, FILE_APPEND); }); // घातक त्रुटियों के लिए हैंडलर register_shutdown_function(function() use ($logFile) { $error = error_get_last(); if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) { $url = ($_SERVER['HTTP_HOST'] ?? 'CLI') . ($_SERVER['REQUEST_URI'] ?? ''); $msg = "[".date('Y-m-d H:i:s')."] [FATAL] ".$error['message']." | ".$error['file'].":".$error['line']." | $url\n"; file_put_contents($logFile, $msg, FILE_APPEND); } }); ``` आप इस कोड को अपनी मुख्य फ़ाइल (उदाहरण के लिए, `index.php` या `header.php`) की शुरुआत में डाल सकते हैं, और यह बिल्कुल सब कुछ पकड़ लेगा । ## चरण 7: लोकप्रिय फ्रेमवर्क में लॉग यदि आप आधुनिक फ्रेमवर्क का उपयोग कर रहे हैं, तो लॉगिंग पहले से ही सेट अप है, लेकिन लॉग के पथ अलग हैं। ### Laravel लॉग्स `storage/logs/laravel.log` में संग्रहीत होते हैं। डिफ़ॉल्ट रूप से, यह Monolog का उपयोग करता है; प्रारूप पाठ या JSON हो सकता है। त्रुटियाँ देखने के लिए: ```bash tail -f storage/logs/laravel.log ``` ### Symfony डिफ़ॉल्ट लॉग: `var/log/dev.log` और `var/log/prod.log`। Monolog का भी उपयोग करता है, अत्यधिक कॉन्फ़िगर करने योग्य। ### WordPress डिफ़ॉल्ट रूप से, WordPress लॉग नहीं लिखता है, लेकिन आप उन्हें `wp-config.php` में यह जोड़कर सक्षम कर सकते हैं: ```php define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false); ``` लॉग `/wp-content/debug.log` में होंगे। ## चरण 8: सामान्य समस्याएं और उनके समाधान ### समस्या: लॉग बिल्कुल नहीं लिखे जा रहे हैं क्या जाँच करें: 1. क्या `log_errors = On` निश्चित रूप से सेट है? 2. क्या फ़ाइल और उसकी निर्देशिका के लिए लिखने की अनुमतियाँ हैं? 3. क्या आपने सही php.ini संपादित किया है (`phpinfo()` से जाँच करें)? 4. क्या आपने परिवर्तनों के बाद वेब सर्वर को पुनरारंभ किया? ### समस्या: घातक त्रुटियाँ नहीं पकड़ी जा रही हैं लॉगिंग सक्षम होने पर भी, कभी-कभी घातक त्रुटियाँ नहीं लिखी जाती हैं यदि वे बहुत जल्दी होती हैं (उदाहरण के लिए, उसी फ़ाइल में एक पार्स त्रुटि जहाँ आप लॉगिंग सक्षम कर रहे हैं)। एकमात्र समाधान सही स्थान है — शुरुआत में, किसी भी चीज़ से पहले । ### समस्या: बहुत अधिक लॉग यदि उत्पादन में `E_ALL` सक्षम है, तो लॉग तेजी से बढ़ेंगे। `error_reporting` को समझदारी से कॉन्फ़िगर करें : ```ini error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE ``` ### समस्या: लॉग डिस्क भर रहे हैं `logrotate` के साथ लॉग रोटेशन सेट करें। PHP लॉग के लिए एक कॉन्फ़िगरेशन: ``` /var/log/php_errors.log { daily rotate 30 compress delaycompress missingok notifempty create 644 www-data www-data } ``` ## चरण 9: व्यावहारिक उदाहरण: एक खाली पृष्ठ की जांच करना एक स्थिति की कल्पना करें: आप एक वेबसाइट खोलते हैं और वह खाली है। कदम से कदम मिलाकर क्या करें? 1. **वेब सर्वर लॉग जांचें** (Apache/Nginx) — अक्सर उनमें एक सुराग होता है 2. **PHP लॉग जांचें** — पिछले कुछ मिनटों की प्रविष्टियाँ देखें ```bash tail -n 50 /var/log/php_errors.log | grep -A5 -B5 "$(date +%Y-%m-%d)" ``` 3. **त्रुटि ढूंढें** : ``` [2026-03-04 15:30:22] PHP Fatal error: Uncaught Error: Class 'DB' not found in /var/www/site/index.php on line 12 ``` 4. **फ़ाइल खोलें**, पंक्ति 12 जांचें — वास्तव में, आप क्लास को शामिल करना भूल गए। 5. **ठीक करें**, परीक्षण करें — साइट काम करती है! जादू! ## त्वरित संदर्भ: चीट शीट | क्रिया | कमांड / कोड | |--------|--------------| | php.ini में लॉगिंग सक्षम करें | `log_errors = On` + `error_log = /फ़ाइल/का/पथ` | | कोड में सक्षम करें | `ini_set('log_errors', 'On');` | | अंतिम पंक्तियाँ देखें | `tail -f /var/log/php_errors.log` | | घातक त्रुटियाँ खोजें | `grep "Fatal error" /var/log/php_errors.log` | | घातक त्रुटियाँ पकड़ें | `register_shutdown_function()` + `error_get_last()` | | Laravel लॉग कहाँ हैं? | `storage/logs/laravel.log` | | Symfony लॉग कहाँ हैं? | `var/log/dev.log` और `var/log/prod.log` | ## निष्कर्ष के बजाय PHP उतना डरावना नहीं है जितना इसे अक्सर बनाया जाता है। हाँ, मौत की सफेद स्क्रीन भयावह है, लेकिन इसके पीछे हमेशा एक विशिष्ट त्रुटि होती है जो बस बोलना नहीं चाहती। लॉग सक्षम करना सीखें, और PHP बोलना शुरू कर देगी। मुख्य नियम: - उत्पादन में, **हमेशा** `log_errors` सक्षम करें और `display_errors` अक्षम करें - लॉग को एक समर्पित फ़ाइल में लिखें, syslog में नहीं — खोजना आसान है - घातक त्रुटियों को पकड़ने के लिए `register_shutdown_function` का उपयोग करें - अपने लॉग नियमित रूप से जांचें — दिन में कम से कम एक बार और याद रखें: सही कोड त्रुटियाँ नहीं लिखता है। लेकिन यदि कोई त्रुटि होती है, तो कम से कम वह एक नोट छोड़ दे। ?>