घातक त्रुटि: 134217728 बाइट्स की अनुमत मेमोरी का आकार समाप्त (CodeIgniter + XML-RPC)


617

मेरे पास क्लाइंट पॉइंट ऑफ़ सेल (POS) सिस्टम है, जो समय-समय पर नए बिक्री डेटा को एक केंद्रीकृत डेटाबेस में भेजता है, जो रिपोर्ट जनरेशन के लिए डेटा को एक बड़े डेटाबेस में संग्रहीत करता है।

क्लाइंट पीओएस PHPPOS पर आधारित है, और मैंने एक मॉड्यूल लागू किया है जो सेवा के लिए बिक्री डेटा भेजने के लिए मानक XML-RPC लाइब्रेरी का उपयोग करता है। सर्वर सिस्टम CodeIgniter पर बनाया गया है, और webservice घटक के लिए XML-RPC और XML-RPCS पुस्तकालयों का उपयोग करता है। जब भी मैं बहुत अधिक बिक्री डेटा (बिक्री तालिका से 50 पंक्तियाँ, और बिक्री के भीतर प्रत्येक आइटम से संबंधित व्यक्तिगत पंक्तियों से बहुत कम पंक्तियाँ भेजता हूँ) तो मुझे निम्न त्रुटि मिलती है:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54 bytes)

128M डिफ़ॉल्ट मान है php.ini, लेकिन मुझे लगता है कि तोड़ने के लिए एक बड़ी संख्या है। वास्तव में, मैंने इस मान को 1024M पर सेट करने की भी कोशिश की है, और यह सब करने में त्रुटि के लिए अधिक समय लगता है।

मेरे द्वारा उठाए गए कदमों के लिए, मैंने सर्वर-साइड पर सभी प्रसंस्करण को अक्षम करने का प्रयास किया है, और इनपुट की परवाह किए बिना डिब्बाबंद प्रतिक्रिया को वापस करने के लिए इसे कठोर किया है। हालाँकि, मेरा मानना ​​है कि समस्या डेटा के वास्तविक भेजने में निहित है। मैंने PHP के लिए अधिकतम स्क्रिप्ट निष्पादन समय को अक्षम करने का भी प्रयास किया है, और यह अभी भी त्रुटी है।


5
मैं थोड़ा उलझन में हूँ ... ग्राहक या सर्वर में त्रुटि कहाँ होती है? और किस स्टेज पर ... क्लाइंट भेजने, सर्वर प्राप्त करने, सर्वर प्रोसेसिंग, सर्वर भेजने, क्लाइंट प्राप्त करने या क्लाइंट प्रसंस्करण?
ग्रेग

2
त्रुटि क्लाइंट भेजने के दौरान या सर्वर को प्राप्त करने के दौरान होती है। मैंने सभी सर्वरसाइड प्रसंस्करण को अक्षम करने की कोशिश की है, और इसे भेजे गए डेटा की परवाह किए बिना डिब्बाबंद प्रतिक्रिया भेजने के लिए हेराफेरी की है। यदि मैं एक निश्चित मात्रा में डेटा भेजता हूं तो त्रुटि होती है। मैं PHP.ini सेटिंग बदल रहा हूं।
आर्कटिकजेरो

42
मेमोरी लिमिट 128MB है, इसे डबल करें:ini_set('memory_limit', '256M');

9
सारांश ने सभी "बस लीक को नजरअंदाज" जवाबों को नकार दिया, जो लोग ड्रुपल के साथ कोडइग्निटर को भ्रमित करते थे और वे लोग जो अंक प्राप्त करने के लिए अन्य लोगों के उत्तरों को कॉपी और पेस्ट करते हैं। इस एक में जवाब की गुणवत्ता abysmal है।
मत्ती विर्ककुनेन

जवाबों:


697

बदलने memory_limitसे ini_set('memory_limit', '-1');है नहीं एक उचित समाधान। कृपया ऐसा मत करो।

आपके PHP कोड में कहीं स्मृति रिसाव हो सकता है और आप सर्वर से कह रहे हैं कि वह केवल सभी मेमोरी का उपयोग करें जो वह चाहता है। आपने समस्या को बिल्कुल ठीक नहीं किया होगा। यदि आप अपने सर्वर की निगरानी करते हैं, तो आप देखेंगे कि यह अब ज्यादातर रैम का उपयोग कर रहा है और यहां तक ​​कि डिस्क पर स्वैप भी कर रहा है।

आपको संभवतः अपने कोड में अपमानजनक कोड को ट्रैक करने और इसे ठीक करने का प्रयास करना चाहिए।


173
@ ठीक है, आप शायद समय का 95% सही हैं। हालांकि, ऐसे समय होते हैं जब आपको वास्तव में अधिक मेमोरी की आवश्यकता होती है। उदाहरण के लिए, मान लें कि आपका ऐप प्रोसेसिंग के लिए मेमोरी में भारी मात्रा में डेटा लोड कर रहा है (15k घटकों के साथ सामग्री का बिल)। यह हमेशा ऐसा नहीं होता है कि कोड छोटी गाड़ी है, कभी-कभी आपको बस थोड़ी अधिक मेमोरी (उदाहरण के लिए 128M के बजाय 256M) की आवश्यकता होती है। हालाँकि मैं मानता हूं कि इसे -1 पर सेट करना बहुत बुरा है। लेकिन रन-टाइम पर उचित परिस्थितियों के लिए मेमोरी की सीमा को समायोजित करना पूरी तरह से स्वीकार्य है।
पाइराइट

24
); @pyrite हाँ तुम सही है कि कभी कभी एक प्रक्रिया को और अधिक स्मृति की आवश्यकता है, लेकिन आप के रूप में आप ने कहा 256MB की तरह कुछ तार्किक राशि के लिए स्मृति सीमा को बढ़ाने चाहिए या 512MB क्यों नहीं बल्कि नहीं -1 हैं
लुकास Lukac

9
@ जेफ मैं पूरी तरह से सहमत हूं, एक मूल्य केवल उद्देश्य परीक्षण के लिए देव वातावरण में -1उपयोगी हो सकता है।
एसोलिटोस

4
@ शेष 5% के लिए आपके द्वारा नामित मामलों में डेटा को चंक्स में पढ़ें और अधिक मेमोरी का उपयोग करने के बजाय इसे संसाधित करने के लिए किसी कार्यकर्ता का उपयोग करें। यह समाधान उस समय के साथ-साथ आपके सुझाव पर काम करेगा जब डेटा बढ़ने पर आपके सर्वर में अधिक से अधिक मेमोरी रखने के अलावा आपका काम नहीं होगा।
बुर्जुम

2
सबसे आम तरीके से ओआरएम में यह परेशानी जब आप डेटा को लाने की कोशिश करते हैं, तो बहुत अधिक php मेमोरी लिमिट होती है। उदाहरण के लिए जब आप मासिक रिपोर्ट बनाने की कोशिश करते हैं।
Stepchik

213

ini_set('memory_limit', '-1');डिफ़ॉल्ट PHP मेमोरी लिमिट को ओवरराइड करता है


16
@williamcarswell; -1एक मूल्य है जिसे PHP इस संदर्भ में असीमित समझता है।
एलिक्स एक्सल

7
@ Arseniusz Arozicki - यह उन संसाधनों का भी उपभोग करेगा जो सर्वर नहीं छोड़ सकता।
केन विलियम्स

124
शर्म आती है कि यह बहुत सारे अपवित्र हो जाते हैं। Php.ini संपादन या ini_set के साथ इसे एक सटीक मान पर सेट करना, एक पूरी तरह से वैध समाधान है जब लोगों को अधिक मेमोरी की आवश्यकता होती है। इसे असीमित पर सेट करना एक खतरनाक हैक है :(
जेफ डेविस

24
@ user1767586 फिर इसे एक साने वैल्यू पर सेट करें। आप स्क्रिप्ट को 1024M पर सेट करके त्रुटि को फेंकने से रोक सकते हैं। यदि इस उत्तर ने ini_set ('memory_limit', '1024M') कहा; आप कॉपी-पेस्ट कर सकते हैं और ठीक भी हो सकते हैं। इसे -1 पर सेट करके आप अपने आप को एक स्क्रिप्ट के लिए सेट कर रहे हैं जो सभी मेमोरी का उपभोग करता है। खासकर यदि आप इसे नियमित रूप से करते हैं। उद्धरण में "खतरनाक" डालना किसी भी कम खतरनाक नहीं बनाता है। तुम सच में अपने मेजबान सर्वर नली सकता है। शायद डेटा को नष्ट करना शुरू करें। मुझे नहीं पता, शायद आपकी नौकरी छूट जाए? मेरे लिए बहुत खतरनाक लगता है। : |
जेफ डेविस

3
देखने के लिए कि 161 वोट और -3 वोट के लिए इस सवाल का जवाब एक ही :( है दु: खी
akarthik10

130

अपनी php.iniफ़ाइल को संपादित करने का सही तरीका है । संपादित करेंmemory_limitअपने इच्छा मूल्य को ।

आपके प्रश्न के अनुसार, 128M (जो कि डिफ़ॉल्ट सीमा है) पार हो गई है, इसलिए आपके कोड में कुछ गंभीर रूप से गलत है क्योंकि इसे उतना नहीं करना चाहिए।

यदि आप जानते हैं कि यह इतना क्यों लेता है और आप इसे सेट memory_limit = 512Mया उच्चतर करने की अनुमति देना चाहते हैं और आपको अच्छा होना चाहिए।


7
ईमानदारी से, यदि आपका डेटा कुछ गंभीर मात्रा में कैशिंग करता है, तो यह सही उत्तर है। 128M कुछ स्क्रिप्ट के लिए पर्याप्त नहीं है। 512M या 1024M अक्सर पर्याप्त होगा, लेकिन आपको केस द्वारा केस तय करना होगा।
जेफ डेविस

2
हां, हालांकि, विशाल मेमोरी के उपयोग से बचने की कोशिश करें, यदि उपयोगकर्ताओं की संख्या अधिक होने वाली है
बसव

2
memory_limit = -1; php.ini में सेट करें

2
@YumYumYum जो मेमोरी_लिमिट को हटा देता है, जिसे आप केवल तभी चाहते हैं जब आप मेमोरी के उपयोग को किसी अन्य तरीके से मॉनिटर कर रहे हों। अगर यह किसी भी तरह से स्मृति की एक बड़ी राशि ले रहा है तो ओएस प्रक्रिया को मार देगा।
फ्लिम्ड

इसलिए यदि आप एक ऐसी स्क्रिप्ट चला रहे हैं, जिसमें बहुत सारी मेमोरी का उपयोग किया गया है, लेकिन आपको केवल एक बार इसे चलाने की आवश्यकता है, तो क्या आप निष्पादन के समय प्रक्रिया के लिए मेमोरी की सीमा बढ़ा सकते हैं, फिर अपने एक बार के बाद फिर से अपनी मेमोरी की सीमा को कम कर सकते हैं स्क्रिप्ट चलती है?
क्रोमक्रिस

95

PHP के लिए मेमोरी आवंटन को स्थायी या अस्थायी रूप से समायोजित किया जा सकता है।

स्थायी रूप से

आप PHP मेमोरी आवंटन को दो तरीकों से स्थायी रूप से बदल सकते हैं।

यदि आपके पास आपकी php.iniफ़ाइल तक पहुँच है , तो आप memory_limitअपनी इच्छा के लिए मान को संपादित कर सकते हैं ।

यदि आपके पास आपकी php.iniफ़ाइल तक पहुंच नहीं है (और आपका वेबहोस्ट इसकी अनुमति देता है), तो आप अपनी .htaccessफ़ाइल के माध्यम से मेमोरी आवंटन को ओवरराइड कर सकते हैं । जोड़ें php_value memory_limit 128M(या जो भी आपका वांछित आवंटन है)।

अस्थायी

आप PHP फ़ाइल के भीतर से मक्खी पर मेमोरी आवंटन समायोजित कर सकते हैं। आपके पास बस कोड है ini_set('memory_limit', '128M');(या जो भी आपका वांछित आवंटन है)। आप मान को "-1" पर सेट करके स्मृति सीमा (हालांकि मशीन या इंस्टेंस सीमाएँ अभी भी लागू हो सकती हैं) को हटा सकते हैं।


2
धन्यवाद, मैंने यह जांचने के लिए नहीं सोचा कि क्या किसी ने .htaccess में मान सेट किया है जो php.ini को ओवरराइड कर रहा था और मैं यह पता नहीं लगा सका कि क्यों +1
HostMyBus

61

PHP स्क्रिप्ट में मेमोरी लीक्स प्राप्त करना बहुत आसान है - खासकर अगर आप एक ORM जैसे अमूर्त का उपयोग करते हैं। अपनी स्क्रिप्ट को प्रोफाइल करने के लिए Xdebug का उपयोग करने का प्रयास करें और पता करें कि वह सारी मेमोरी कहां गई।


1
मैं कोशिश करूँगा Xdebug। मैंने पहले कभी इसका इस्तेमाल नहीं किया है, इसलिए मुझे इस पर पढ़ना होगा। जवाब देने के लिए धन्यवाद! आशा है कि मुझे इसका उत्तर जल्द ही मिल जाएगा ...
आर्कटिकजेरो

34
याद रखें कि PHP स्मृति के प्रबंधन के लिए संदर्भ गिनती का उपयोग करता है। इसलिए यदि आपके पास परिपत्र संदर्भ, या वैश्विक चर हैं, तो उन वस्तुओं को पुनर्नवीनीकरण नहीं किया जाएगा। यह आमतौर पर PHP में मेमोरी लीक की जड़ है।
troelskn

Xdebug से पता चलता है कि CI की Xmlrpc.php लाइब्रेरी मेरी मेमोरी लीक के लिए जिम्मेदार है। किसी भी संयोग से, क्या CodeIgniter की XML-RPC लाइब्रेरी के साथ कोई समस्या होगी जिसके बारे में मुझे पता होना चाहिए? मैंने सभी प्रोसेसिंग सर्वर-साइड को अक्षम करने की कोशिश की है, और यदि मैं इसे पर्याप्त डेटा खिलाता हूं, तो यह अभी भी मेमोरी से बाहर है।
आर्कटिकजेरो

1
मुझे CI का उपयोग / पता नहीं है, इसलिए मुझे नहीं पता। लेकिन आपको संभवतः एक ऐसी वस्तु को खोजने की कोशिश करनी चाहिए जो उपयोग के बाद मुक्त नहीं हुई है - चक्रीय संदर्भ के कारण सबसे अधिक संभावना है। यह जासूसी-काम है।
troelskn

1
यहां केवल यही एक उत्तर है जो वास्तव में समस्या को संबोधित करने की सलाह देता है। अन्य जवाब एक लक्षण पर पट्टी बांधने और बीमारी को नजरअंदाज करने के लिए मेमोरी को क्रैंक करते हैं
क्रिस बेकर

56

Array_push के साथ एक सरणी में 22.5 मिलियन रिकॉर्ड जोड़ते समय मैंने 4Gफ़ाइल php.ini में मेमोरी सीमा के रूप में उपयोग करते हुए लगभग 20M रिकॉर्ड में "मेमोरी समाप्त" घातक त्रुटियां प्राप्त कीं । इसे ठीक करने के लिए, मैंने बयान जोड़ा

$old = ini_set('memory_limit', '8192M');

फ़ाइल के शीर्ष पर। अब सब कुछ ठीक चल रहा है। मुझे नहीं पता कि PHP में मेमोरी लीक है या नहीं। यह मेरा काम नहीं है, और न ही मुझे परवाह है। मुझे बस अपना काम करना है, और यह काम किया है।

कार्यक्रम बहुत सरल है:

$fh = fopen($myfile);
while (!feof($fh)) {
    array_push($file, stripslashes(fgets($fh)));
}
fclose($fh);

घातक त्रुटि 3 पंक्ति की ओर इशारा करती है जब तक कि मैंने मेमोरी सीमा को बढ़ाया नहीं, जिससे त्रुटि समाप्त हो गई।


10
तुम्हारा मतलब है ini_set('memory_limit', '8192M');?
गोगोल

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

45

मैं यह त्रुटि प्राप्त करता रहा, यहां तक ​​कि memory_limitसेट-इन php.iniऔर मूल्य पढ़ने के साथ सही ढंग से phpinfo()

इसे इस से बदलकर:

memory_limit=4G

इसके लिए:

memory_limit=4096M

इससे PHP 7 में समस्या ठीक हो गई।


23

जब आप उपरोक्त त्रुटि देखते हैं - विशेष रूप से यदि (tried to allocate __ bytes)एक कम मूल्य है, तो यह एक अनंत लूप का संकेतक हो सकता है, एक फ़ंक्शन की तरह जो खुद को बिना किसी तरीके से कॉल करता है:

function exhaustYourBytes()
{
    return exhaustYourBytes();
}

19

इन दो लाइनों को सक्षम करने के बाद, इसने काम करना शुरू कर दिया:

; Determines the size of the realpath cache to be used by PHP. This value should
; be increased on systems where PHP opens many files to reflect the quantity of
; the file operations performed.
; http://php.net/realpath-cache-size
realpath_cache_size = 16k

; Duration of time, in seconds for which to cache realpath information for a given
; file or directory. For systems with rarely changing files, consider increasing this
; value.
; http://php.net/realpath-cache-ttl
realpath_cache_ttl = 120


19

आप इसे memory_limitfastcgi / fpm पर बदलकर ठीक से ठीक कर सकते हैं :

$vim /etc/php5/fpm/php.ini

मेमोरी बदलें, जैसे 128 से 512, नीचे देखें

; Maximum amount of memory a script may consume (128 MB)
; http://php.net/memory-limit
memory_limit = 128M

सेवा

; Maximum amount of memory a script may consume (128 MB)
; http://php.net/memory-limit
memory_limit = 512M

18

आपकी साइट की मूल निर्देशिका:

ini_set('memory_limit', '1024M');

1
यह मेरे लिए काम किया। एक लाइन समाधान प्यार करता हूँ। सादगी के लिए +1
स्टीव सी

14

Php.ini फ़ाइल में मेमोरी लिमिट बदलें और अपाचे को पुनरारंभ करें। पुनः आरंभ करने के बाद, phpinfo () चलाएं ; memory_limitपरिवर्तन की पुष्टि के लिए किसी भी PHP फ़ाइल से कार्य करें ।

memory_limit = -1

मेमोरी लिमिट -1 का मतलब है कि कोई मेमोरी लिमिट सेट नहीं है। अब यह अधिकतम पर है।


13

Drupal उपयोगकर्ताओं के लिए, इस क्रिस लेन का जवाब:

ini_set('memory_limit', '-1');

काम करता है लेकिन हमें इसे खोलने के बाद ही डालने की जरूरत है

<?php

अपनी साइट के रूट डायरेक्टरी में index.php फ़ाइल में टैग करें।


13

Drupal 7 में, आप अपनी साइटों / डिफ़ॉल्ट फ़ोल्डर में स्थित settings.php फ़ाइल में मेमोरी लिमिट को संशोधित कर सकते हैं। लगभग 260 की संख्या में, आप इसे देखेंगे:

ini_set('memory_limit', '128M');

यहां तक ​​कि अगर आपकी php.ini सेटिंग्स काफी अधिक हैं, तो आप अपने Drupal settings.php फ़ाइल में सेट नहीं होने पर 128 एमबी से अधिक का उपभोग नहीं कर पाएंगे।


1
Drupal7 में नहीं सेटिंग्स में कोड की ऐसी कोई स्ट्रिंग नहीं है। एफपी
FLY

सेटिंग्स में भी कोई स्ट्रिंग नहीं है।
ड्रुपल

12

memory_limitअपनी php.iniफ़ाइल में मान बदलने के बजाय , यदि आपके कोड का एक हिस्सा है जो बहुत अधिक मेमोरी का उपयोग कर सकता है, तो आप memory_limitउस अनुभाग को चलाने से पहले हटा सकते हैं , और उसके बाद इसे बदल सकते हैं।

$limit = ini_get('memory_limit');
ini_set('memory_limit', -1);
// ... do heavy stuff
ini_set('memory_limit', $limit);

7

PHP 5.3+ आपको फ़ोल्डर .user.iniमें फ़ाइल रखकर मेमोरी सीमा को बदलने की अनुमति देता है public_html। बस उपरोक्त फ़ाइल बनाएँ और उसमें निम्न पंक्ति टाइप करें:

memory_limit = 64M

कुछ cPanel होस्ट केवल इस पद्धति को स्वीकार करते हैं।


7

क्रैश पेज?

यहां छवि विवरण दर्ज करें

(यह तब होता है जब MySQL को बड़ी पंक्तियों को क्वेरी करना होता है। डिफ़ॉल्ट रूप से, memory_limitछोटे पर सेट होता है, जो हार्डवेयर के लिए अधिक सुरक्षित था।)

बढ़ाने से पहले आप अपने सिस्टम की मौजूदा मेमोरी स्थिति की जांच कर सकते हैं php.ini:

# free -m
             total       used       free     shared    buffers     cached
Mem:         64457      63791        666          0       1118      18273
-/+ buffers/cache:      44398      20058
Swap:         1021          0       1021

यहाँ मैंने इसे निम्नलिखित के रूप में बढ़ाया है और फिर service httpd restartक्रैश पेज समस्या को ठीक करने के लिए किया है।

# grep memory_limit /etc/php.ini
memory_limit = 512M

कौन सी संख्या (पंक्ति और स्तंभ?) free -mको एक नई मेमोरी_लिमिट पर निर्णय लेने के लिए कमांड चलाने के बाद देखना चाहिए ?
कीरादोटी

7

बस ini_set('memory_limit', '-1');अपने वेब पेज के शीर्ष पर एक पंक्ति जोड़ें ।

और आप अपनी मेमोरी को अपनी जरूरत के अनुसार -1, टू 16M, आदि के स्थान पर सेट कर सकते हैं ।


6
यह कई मौजूदा जवाबों के समान ही प्रतीत होता है। केवल एक लोकप्रिय प्रश्न का उत्तर जोड़ना सबसे अच्छा है, अगर नई सामग्री कुछ उपन्यास प्रदान करती है।
19

6

उन लोगों के लिए जो अपने सिर को खरोंच कर रहे हैं, यह पता लगाने के लिए कि पृथ्वी पर इस छोटे से कार्य के कारण स्मृति रिसाव का कारण होना चाहिए, कभी-कभी थोड़ी सी गलती से, एक फ़ंक्शन अपने आप को हमेशा के लिए कॉल करना शुरू कर देता है।

उदाहरण के लिए, एक प्रॉक्सी वर्ग जिसमें ऑब्जेक्ट के एक फ़ंक्शन के लिए एक ही नाम है जो इसे प्रॉक्सी करने जा रहा है।

class Proxy {

    private $actualObject;

    public function doSomething() {

        return $this->actualObjec->doSomething();
    }
}

कभी-कभी आप उस छोटे वास्तविक सदस्य को लाना भूल सकते हैं और क्योंकि प्रॉक्सी में वास्तव में वह doSomethingविधि है, PHP आपको कोई त्रुटि नहीं देगा और एक बड़ी कक्षा के लिए, यह कुछ मिनटों के लिए आंखों से छिपाया जा सकता है ताकि यह पता लगाया जा सके कि यह क्यों है स्मृति लीक है।


और एक और टिप: आप die('here')अपने कोड में डाल सकते हैं और उस स्टेटमेंट को चारों ओर घुमा सकते हैं, यह देखने के लिए कि पुनरावृत्ति कहाँ से शुरू होती है।
टोडरमो

6

पहले काम कर चुके छोटे से डेटासेट पर चलते समय मुझे नीचे त्रुटि हुई।

घातक त्रुटि: 134217728 बाइट्स की अनुमत मेमोरी का आकार समाप्त हो गया (सी में 4096 बाइट्स आवंटित करने का प्रयास किया गया): लाइन 173 पर \ वर्कस्पेस \ image_management.php

जैसा कि गलती की खोज मुझे यहां ले आई, मैंने सोचा कि मैं उल्लेख करूंगा कि यह हमेशा पिछले उत्तर में तकनीकी समाधान नहीं है, लेकिन कुछ और अधिक सरल है। मेरे मामले में यह फ़ायरफ़ॉक्स था। इससे पहले कि मैं कार्यक्रम चलाता, यह पहले से ही 1,157 एमबी का उपयोग कर रहा था।

यह पता चला है कि मैं 50 मिनट के वीडियो को कुछ दिनों के अंतराल पर देख रहा हूं और इससे चीजें गड़बड़ हो गई हैं। यह ठीक है कि विशेषज्ञ इसके बारे में सोचे बिना भी सही करते हैं, लेकिन मेरी पसंद के लिए यह ध्यान रखने योग्य है।


मैंने आज Google Chrome पर एक समान घटना की थी। मैं इस जवाब से बेहद उलझन में था ... हालाँकि, यह पता चला कि मेरी बाइट थकावट गायब हो गई जब मैंने एक गुप्त खिड़की खोली और फिर से उसी स्क्रिप्ट को निकाल दिया! शोध जारी है।
मिकमैकुसा

2

इस तरह से स्क्रिप्ट चलाना (उदाहरण के लिए क्रोन केस): php5 /pathToScript/info.phpएक ही त्रुटि पैदा करता है।

सही तरीका: php5 -cli /pathToScript/info.php


2

यदि आप एक WHM- संचालित VPS (वर्चुअल प्राइवेट सर्वर) चला रहे हैं, तो आप पा सकते हैं कि आपके पास सीधे PHP.INI को संपादित करने की अनुमति नहीं है; सिस्टम को यह करना चाहिए। WHM होस्ट कंट्रोल पैनल में, सेवा कॉन्फ़िगरेशनPHP कॉन्फ़िगरेशन एडिटर पर जाएं और संशोधित करें memory_limit:

WHM 11.48.4 पर memory_limit अपडेट करना


2

मुझे यह तब उपयोगी लगता है जब इसमें शामिल या आवश्यकता होती है _dbconnection.php_और _functions.phpहेडर में शामिल होने के बजाय वास्तव में संसाधित होने वाली फ़ाइलों में होती है । जो अपने आप में सम्‍मिलित है।

इसलिए यदि आपका हेडर और पाद शामिल है, तो हेडर को शामिल करने से पहले अपनी सभी कार्यात्मक फाइलें शामिल करें।


2

उपयोग करना yieldएक समाधान भी हो सकता है। जेनरेटर सिंटैक्स देखें ।

PHP.iniफ़ाइल को बड़े मेमोरी स्टोरेज के लिए बदलने के बजाय , कभी-कभी yieldलूप के अंदर लागू करने से समस्या ठीक हो सकती है। सभी डेटा को एक बार में डंप करने के बजाए क्या पैदावार करता है, यह एक-एक करके पढ़ता है, जिससे बहुत सारे मेमोरी का उपयोग होता है।


2
PHP.ini? है ना php.ini?
पीटर मोर्टेंसन

1

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

इन मामलों में, जो मेरे लिए कई बार हुए हैं, set_time_limit विफल रहता है, और ब्राउज़र पीएचपी आउटपुट को लोड करने की कोशिश करता रहता है, या तो एक अनंत लूप के साथ या घातक त्रुटि संदेश के साथ जो इस प्रश्न का विषय है।

जोड़कर अनुमत आवंटन आकार को कम करके

ini_set('memory_limit','1M');

अपने कोड की शुरुआत के पास आपको घातक त्रुटि को रोकने में सक्षम होना चाहिए।

तब आपको एक ऐसे प्रोग्राम के साथ छोड़ा जा सकता है जो समाप्त हो जाता है, लेकिन डिबग करना अभी भी मुश्किल है।

इस बिंदु पर डालें BreakLoop() नियंत्रण प्राप्त करने के लिए अपने प्रोग्राम के अंदर कॉल और पता करें कि आपके प्रोग्राम में क्या लूप या पुनरावृत्ति समस्या पैदा कर रहा है।

ब्रेकलोप की परिभाषा इस प्रकार है:

function BreakLoop($MaxRepetitions=500,$LoopSite="unspecified")
    {
    static $Sites=[];
    if (!@$Sites[$LoopSite] || !$MaxRepetitions)
        $Sites[$LoopSite]=['n'=>0, 'if'=>0];
    if (!$MaxRepetitions)
        return;
    if (++$Sites[$LoopSite]['n'] >= $MaxRepetitions)
        {
        $S=debug_backtrace(); // array_reverse
        $info=$S[0];
        $File=$info['file'];
        $Line=$info['line'];
        exit("*** Loop for site $LoopSite was interrupted after $MaxRepetitions repetitions. In file $File at line $Line.");
        }
    } // BreakLoop

$ लूपसाइट तर्क आपके कोड में एक फ़ंक्शन का नाम हो सकता है। यह वास्तव में आवश्यक नहीं है, क्योंकि आपको प्राप्त होने वाला त्रुटि संदेश आपको ब्रेकलूप () कॉल वाली रेखा पर इंगित करेगा।


-1

मेरे मामले में यह एक संक्षिप्त मुद्दा था जिस तरह से एक समारोह लिखा गया था। किसी फ़ंक्शन के इनपुट वैरिएबल को एक नया मान असाइन करने के कारण स्मृति रिसाव हो सकता है, जैसे:

/**
* Memory leak function that illustrates unintentional bad code
* @param $variable - input function that will be assigned a new value
* @return null
**/
function doSomehting($variable){
    $variable = 'set value';
    // Or
    $variable .= 'set value';
}

-6

जब मैंने अपने कोड से निम्नलिखित पंक्तियों को हटा दिया, तो सभी ने ठीक काम किया!

set_include_path(get_include_path() . get_include_path() . '/phpseclib');
include_once('Net/SSH2.php');
include_once('Net/SFTP.php');

ये लाइनें मेरे द्वारा चलाए जा रहे हर फ़ाइल में शामिल थीं। एक-एक करके फाइलें चलाते समय, सभी ने ठीक काम किया, लेकिन सभी फाइलों को एक साथ चलाने पर मुझे मेमोरी लीक का मुद्दा मिला। किसी भी तरह "शामिल_नहीं" एक बार चीजों में शामिल नहीं है, या मैं कुछ गलत कर रहा हूं ...


set_include_path(get_include_path() . get_include_path().'/phpseclib'); यह प्रत्येक फ़ाइल के लिए एक बार '/ phpseclib' पथ जोड़ देगा जिसमें लाइन है ... इसलिए यह इसे कई बार जोड़ सकता है! मैं इसे एक सेटिंग फ़ाइल और सेटिंग फ़ाइल में डालने का सुझाव दूंगा include_once
फ़ारोप्रैमनिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.