परिचय: आपकी PHP स्क्रिप्ट क्यों «फट» रही है?
\n\nक्या आपने कभी स्क्रीन पर एक सफेद पृष्ठ देखा है जिस पर भयावह संदेश लिखा हो «Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted»? यदि हाँ — तो आप अकेले नहीं हैं। यह प्रश्न Stack Overflow पर हजारों बार देखा जा चुका है, और लगभग हर दूसरे PHP डेवलपर को अपने जीवन में कम से कम एक बार इसका सामना करना पड़ता है।
\n\nसंख्या 134217728 बाइट्स बिल्कुल 128 मेगाबाइट है (कई होस्टिंग के लिए मानक सीमा)। जब आपकी स्क्रिप्ट इससे अधिक लेने की कोशिश करती है — PHP «रुको» कहता है और एक घातक त्रुटि फेंकता है। लेकिन घबराने की जल्दी न करें! इस लेख में, हम समझेंगे कि ऐसा क्यों होता है, इसे कैसे ठीक करें और — सबसे महत्वपूर्ण — प्रदर्शन को कैसे अनुकूलित करें ताकि मेमोरी त्रुटि आपको फिर से परेशान न करे।
\n\nयह लेख शैक्षिक वेबसाइट PythonLib के लिए लिखा गया है, लेकिन सभी कोड और उदाहरण PHP में हैं। चलिए शुरू करते हैं!
\n\nmemory_limit क्या है और «134217728» कहाँ से आता है?
\n\nPHP में एक निर्देश memory_limit है, जो एक स्क्रिप्ट के लिए उपलब्ध अधिकतम मेमोरी निर्धारित करता है। डिफ़ॉल्ट रूप से, कई कॉन्फ़िगरेशन (विशेषकर शेयर्ड होस्टिंग पर) में मान 128M (या 134217728 बाइट्स) होता है।
वर्तमान सीमा इस प्रकार जाँची जा सकती है:
\n\n<?php\necho ini_get('memory_limit'); // उदाहरण के लिए, "128M" प्रदर्शित करेगा\n?>\n\nजब आपकी स्क्रिप्ट इस सीमा को पार करती है — PHP तुरंत एक घातक त्रुटि के साथ निष्पादन समाप्त कर देता है। कारण अलग-अलग हो सकते हैं: अकुशल कोड से लेकर मेमोरी में विशाल फ़ाइलें लोड करने तक।
\n\nत्रुटि उत्पन्न करने वाले सामान्य परिदृश्य
\n\n- \n
- बड़े ऐरे के साथ काम करना — उदाहरण के लिए, CSV फ़ाइल को पूरी तरह से मेमोरी में पढ़ना। \n
- लीक वाले लूप — वेरिएबल को मुक्त करना भूल गए या ग्लोबल ऐरे का उपयोग कर रहे हैं। \n
- इमेज प्रोसेसिंग लाइब्रेरी — उच्च-रिज़ॉल्यूशन फ़ोटो के साथ काम करते समय GD या Imagick। \n
- रिकर्सिव फ़ंक्शन — बिना आधार शर्त के अनंत में चले जाते हैं और स्टैक खा जाते हैं। \n
- ORM और कैशिंग — कुछ ORM (जैसे, Doctrine) पूरी तालिका को मेमोरी में लोड कर सकते हैं। \n
त्रुटि कैसे ठीक करें: 3 सिद्ध तरीके
\n\n1. ini_set() के माध्यम से अस्थायी रूप से सीमा बढ़ाना
\n\nसबसे तेज़ तरीका — सीधे स्क्रिप्ट में सीमा बढ़ाना:
\n\n<?php\nini_set('memory_limit', '256M');\n// अब स्क्रिप्ट 256 MB तक उपयोग कर सकती है\n?>\n\nमहत्वपूर्ण: यह तभी काम करेगा जब आपकी होस्टिंग निर्देश को ओवरराइड करने की अनुमति देती है। कुछ होस्टिंग पर, memory_limit के लिए ini_set() अवरुद्ध है।
\n\n2. php.ini या .htaccess बदलना
\n\nयदि आपके पास सर्वर तक पहुँच है, तो php.ini संपादित करें:
memory_limit = 256M\n\nया .htaccess के माध्यम से (Apache पर):
php_value memory_limit 256M\n\nपरिवर्तनों के बाद, वेब सर्वर या PHP-FPM को पुनरारंभ करें।
\n\n3. कोड ऑप्टिमाइज़ेशन — सबसे अच्छा तरीका
\n\nसीमा बढ़ाना एक पट्टी है। असली समाधान कुशल कोड लिखना है। आइए उदाहरण देखें।
\n\nवास्तविक उदाहरण: बड़ी CSV फ़ाइल को प्रोसेस करना
\n\nमान लीजिए, आपके पास 500,000 पंक्तियों वाली CSV फ़ाइल है। भोला कोड इस तरह दिख सकता है:
\n\n<?php\n$rows = file('data.csv'); // पूरी फ़ाइल को मेमोरी में लोड करता है!\nforeach ($rows as $row) {\n // प्रोसेसिंग\n}\n?>\n\n200 MB फ़ाइल आकार के साथ — स्क्रिप्ट मेमोरी त्रुटि के साथ क्रैश हो जाएगी।
\n\nऑप्टिमाइज़ेशन: पंक्ति-दर-पंक्ति पढ़ना
\n\n<?php\n$handle = fopen('data.csv', 'r');\nif ($handle) {\n while (($row = fgetcsv($handle)) !== false) {\n // एक बार में एक पंक्ति प्रोसेस करें\n // मेमोरी लगभग नहीं बढ़ती\n }\n fclose($handle);\n}\n?>\n\nअब स्क्रिप्ट फ़ाइल आकार की परवाह किए बिना केवल कुछ मेगाबाइट का उपयोग करती है।
\n\n<