33554432 बाइट्स की अनुमत मेमोरी का आकार php में (43148176 बाइट्स आवंटित करने की कोशिश की गई)


279

यह त्रुटि संदेश प्रस्तुत किया जा रहा है, कोई सुझाव?

33554432 बाइट्स की अनुमत मेमोरी का आकार php में (43148176 बाइट्स आवंटित करने की कोशिश की गई)


5
अपनी php.ini फ़ाइल में अपनी अधिकतम मेमोरी सीमा बढ़ाकर 64MB करें। Google खोज लेकिन क्या मैं पूछ सकता हूं कि आप उस मेमोरी को आवंटित करने का प्रयास क्यों कर रहे हैं? किस कोड की यह कोड विफल रहता है?

1
असफल होने पर स्क्रिप्ट क्या कर रही है? क्या आप कोड पोस्ट कर सकते हैं?
नील ऐटनके

3
बहुत बड़ी txt फ़ाइल लगती है।
मैकबर्डी

10
परंपरागत रूप से, आप ऐसी फ़ाइलों को पढ़ते हैं जो एक समय में संभावित रूप से बड़ी या मनमाने आकार की एक पंक्ति होती हैं, पिछली पंक्ति की मेमोरी को अपनी लाइन पढ़ने के साथ ओवर-राइट करना। या आप केवल नवीनतम प्रविष्टियाँ प्राप्त करने के लिए फ़ाइल को टेल या हेड करना चाह सकते हैं। फ़ाइल बढ़ने पर अपनी मेमोरी आवंटन को छोड़ना उत्तर नहीं है।
एकरनर

जवाबों:


318

आखिर में मुझे जवाब मिला:

अपनी फ़ाइल में त्रुटि होने से पहले बस इस पंक्ति को नीचे जोड़ें

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

यह सर्वर का असीमित मेमोरी उपयोग करेगा, यह ठीक काम कर रहा है।

सुझाव मित्र देने के लिए धन्यवाद।


125
आपको अभी भी जांचना चाहिए कि मेमोरी क्यों समाप्त हो गई है। हो सकता है कि आपको पूरी फ़ाइल पढ़ने की ज़रूरत न हो, हो सकता है कि इसे क्रमिक रूप से पढ़ा जाए।
मैक्बर्डी

8
- @panidarapu और @ डॉन जोन्स: मेमोरी की मात्रा के आधार पर, और इस स्क्रिप्ट का उपयोग कैसे किया जाता है, यह इस तरह से मेमोरी के उपयोग में परिवर्तन की अनुमति देना खतरनाक हो सकता है। डॉन, आपके मामले में, आप फ़ीड को छोटे विखंडू में तोड़ सकते हैं और पार्स कर सकते हैं जो आपको चाहिए। खुशी है कि यह काम करता है, लेकिन सावधान रहें।
बेनामी कायर

5
इस सुझाव ने मेरे लिए काम किया। स्क्रिप्ट में डायनामिक रूप से बढ़ती मेमोरी लिमिट फ़ंक्शन ini_set (): ini_set ('memory_limit', '128M') के माध्यम से की जाती है;
mente

37
दोस्तों, कृपया इस त्वरित सुधार के लिए मत जाओ। यह आपको लंबे समय में नुकसान पहुंचा सकता है। एक अच्छे प्रोग्रामर के रूप में, आपको इस मेमोरी खपत के पीछे के कारण का पता लगाना चाहिए और इसे रखने के बजाय आवश्यकता के अनुसार बढ़ाना चाहिए UNLIMITED
सूमोआनंद

113
वाह, यह बड़े पैमाने पर उत्कीर्ण जवाब मुझे वास्तव में बुरा अभ्यास की तरह लगता है। -1!
अंबाइडेक्स

59

साझा होस्टिंग पर सीमा बढ़ाने के लिए यहां दो सरल तरीके दिए गए हैं:

  1. यदि आपकी PHP.ini फ़ाइल तक पहुँच है, तो लाइन को PHP.ini में बदलें। यदि आपकी लाइन 32M 64M आज़माती है: memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)

  2. यदि आपके पास PHP.ini तक पहुंच नहीं है, तो इसे एक .htaccess फ़ाइल में जोड़ने का प्रयास करें: php_value memory_limit 64M


47

आपकी स्क्रिप्ट बहुत अधिक मेमोरी का उपयोग कर रही है। यह अक्सर PHP में हो सकता है यदि आपके पास एक लूप है जो नियंत्रण से बाहर चला गया है और आप लूप के प्रत्येक पास पर ऑब्जेक्ट बना रहे हैं या सरणियों को जोड़ रहे हैं।

अनंत छोरों के लिए जाँच करें।

यदि यह समस्या नहीं है, तो कोशिश करें और PHP को उन वस्तुओं को नष्ट करके मदद करें, जिन्हें आप उन्हें समाप्त करने के साथ समाप्त कर रहे हैं। जैसे।$OldVar = null;

कोड की जाँच करें जहाँ त्रुटि वास्तव में भी होती है। क्या आप उम्मीद करेंगे कि स्मृति को भारी मात्रा में आवंटन किया जाए? यदि नहीं, तो कोशिश करें और पता करें कि क्या गलत हुआ है ...


3
मुझे यह सटीक समस्या थी - पता चला कि मैंने अनजाने में एक पुनरावर्ती कार्य बनाया था - और इस प्रकार यह कोड निष्पादन के दौरान किसी भी यादृच्छिक समय में मेमोरी से बाहर चला गया। यह मेरे साथ उल्टा था, जिसमें दुनिया का सबसे मेमोरी कुशल कोड था, जो एक मेमोरी लीक के लिए शिकार में बनाया गया था।
क्रि सेल्बेक

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

39

करते हुए :

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

कभी अच्छा नहीं होता। यदि आप एक बहुत बड़ी फ़ाइल पढ़ना चाहते हैं, तो इसे थोड़ा-थोड़ा करके कॉपी करना सबसे अच्छा अभ्यास है। सर्वोत्तम अभ्यास के लिए निम्न कोड का प्रयास करें।

$path = 'path_to_file_.txt';

$file = fopen($path, 'r');
$len = 1024; // 1MB is reasonable for me. You can choose anything though, but do not make it too big
$output = fread( $file, $len );

while (!feof($file)) {
    $output .= fread( $file, $len );
}

fclose($file);

echo 'Output is: ' . $output;

6
विश्वास नहीं कर सकते हैं कि ये सभी लोग memory_limit को -1 पर सेट करने की सिफारिश कर रहे हैं ... उत्पादन सर्वर पर करने के लिए पागल बात। एक बहुत क्लीनर समाधान के लिए धन्यवाद।
जॉनवुल्फ

2
"सर्वोत्तम अभ्यास" के दौरान, whileलूप के बाद फाइल हैंडलर को बंद करना अच्छा है :fclose($file)
kodeart

2
@assetCorp यह कैसे मदद करता है, बशर्ते कि फ़ाइल में 100MiB उदाहरण के लिए है और PHP मेमोरी सीमा अभी भी 32 MiB पर सेट है। आप इसे 1MiB के सुरक्षित चंक्स द्वारा पढ़ते हैं, लेकिन फिर इसे एक चर में जोड़ते हैं जो लूप 31 तक पहुंचने पर सभी उपलब्ध मेमोरी का उपयोग करने वाला होता है। यह कैसे बेहतर है? केवल एक ही चर में उन सभी को संग्रहीत करने की आवश्यकता नहीं करने के लिए इसी तरह विखंडू को आउटपुट करने से समस्या को हल करने में मदद मिलेगी।
हेल्वे

17

दुर्भाग्य से PHP में प्रोग्राम करना एक तरह से आसान है जो आपको एहसास की तुलना में तेजी से मेमोरी की खपत करता है। संदर्भों का उपयोग करने के बजाय तार, सरणियों और वस्तुओं की नकल करना, हालांकि PHP 5 की तुलना में PHP 5 स्वचालित रूप से ऐसा करने वाला है, लेकिन सबसे छोटी तार्किक इकाई को संसाधित करने की तुलना में कई चरणों में आपके डेटा को संपूर्णता में सेट करना भी बेकार है। समय पर। क्लासिक उदाहरण एक डेटाबेस से बड़े परिणाम के साथ काम कर रहा है: अधिकांश प्रोग्रामर पूरे परिणाम को एक सरणी में लाते हैं और फिर इसके साथ एक या अधिक बार लूप करते हैं foreach()while()एक बार में एक पंक्ति लाने और संसाधित करने के लिए लूप का उपयोग करना बहुत अधिक मेमोरी कुशल है । यही बात किसी फ़ाइल को संसाधित करने पर लागू होती है।


यह बहुत संभावना है कि यह वही करता है लगता है।
Kzqai

13

यदि आप बड़ी फ़ाइलों को पढ़ना चाहते हैं, तो आपको उन्हें एक साथ पढ़ने के बजाय थोड़ा सा पढ़ना चाहिए।
यह सरल गणित है: यदि आप एक बार में 1 एमबी बड़ी फ़ाइल पढ़ते हैं, तो डेटा को रखने के लिए कम से कम 1 एमबी मेमोरी की आवश्यकता होती है।

तो आप उन्हें बिट का उपयोग करके थोड़ा पढ़ना चाहिए fopen& fread


1
इसका उपयोग करके इसे हल किया:$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
काई नैक

12

मुझे एक ही समस्या का सामना करना पड़ा है php7.2 में लार्वा 5.6 है। मैं memory_limit = 128Mअपने अनुप्रयोगों की मांग के अनुसार php.ini में केवल चर की मात्रा बढ़ाता हूं। यह 256M / 512M / 1048M हो सकता है ..... अब यह ठीक काम करता है।


6

मुझे भी यही समस्या हो रही थी, phpinfo.ini, php.ini या .htaccess फाइल्स को कोई फायदा नहीं हुआ। अंत में मैंने कुछ php फाइलों को देखा है, उन्हें खोला और मेमोरी के लिए अंदर कोड्स की जाँच की। अंत में यह समाधान वही था जो मैं बाहर आया था और इसने मेरे लिए काम किया। मैं वर्डप्रेस का उपयोग कर रहा था, इसलिए यह समाधान केवल वर्डप्रेस मेमोरी साइज लिमिट समस्या के लिए काम कर सकता है। मेरा समाधान, डिफ़ॉल्ट / constants.php फ़ाइल को / public_html / wp- folder में खोलें । कोड संपादक के साथ उस फ़ाइल को खोलें, और wp_initial_constantsस्कोप के तहत मेमोरी सेटिंग्स ढूंढें , या "मेमोरी" शब्द खोजने के लिए इसे Ctrl + F करें। वहाँ तुम आओगे WP_MEMORY_LIMITऔर WP_MAX_MEMORY_LIMIT। बस इसे बढ़ाएं, यह 64 एमबी था मेरे मामले में, मैंने इसे बढ़ाकर 128 एमबी और फिर 200 एमबी कर दिया।

// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MEMORY_LIMIT', $current_limit );
    } elseif ( is_multisite() ) {
        define( 'WP_MEMORY_LIMIT', '200M' );
    } else {
        define( 'WP_MEMORY_LIMIT', '128M' );
    }
}

if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } else {
        define( 'WP_MAX_MEMORY_LIMIT', '256M' );
    }
}

Btw, कृपया निम्न कोड न करें, क्योंकि यह बुरा अभ्यास है:

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

1
वर्डप्रेस वेबसाइटों के लिए काम करता है, जहाँ .htaccess और php.ini फ़ाइलों के लिए पहुँच उपलब्ध नहीं है। +1
मुस्तफा साबिर

मैं कहूंगा कि 'कोर' वर्डप्रेस फ़ाइल पर उन सीमाओं को बदलना वास्तव में एक अच्छा विचार नहीं है; आप बहुत आसानी से wp-config.phpइसके बजाय उन सीमाओं को जोड़ सकते हैं , जहां वे भविष्य के वर्डप्रेस अपडेट द्वारा अधिलेखित नहीं होंगे। इसके अलावा, कुछ सुरक्षा प्लगइन्स (जैसे WordFence, उदाहरण के लिए) शिकायत करेंगे कि क्या 'कोर' वर्डप्रेस फ़ाइलों को बदल दिया गया है ...
Gwyneth Llewelyn

1
@GwynethLlewelyn मुझे नहीं पता कि यह कैसे करना है, क्या आप इसे विस्तृत कर सकते हैं, कृपया?
१chy

1
ओह ... बस संपादित करें wp-config.php। और (वहाँ दो लाइनें जोड़ने मैं करें.ई. define( 'WP_MEMORY_LIMIT', '200M' );और define( 'WP_MAX_MEMORY_LIMIT', '256M' );। 'कोर' WP (यानी, के अंतर्गत सब कुछ पर फ़ाइलों के विपरीत wp-includes) है, जो WP उन्नयन द्वारा ओवरराइट हो जाएगा, wp-config.phpनहीं होगा - यह बिल्कुल के लिए है WP स्थिरांक को ओवरराइड करने का सटीक उद्देश्य!
ग्वेनेथ लेलेवेनलन

1
"बुरा अभ्यास" स्थितिजन्य है। -1कम-चलने वाली प्रक्रियाओं के लिए ठीक है। उदाहरण के लिए एक php बिल्डर कंटेनर जो इकाई परीक्षण या कंपोजर इंस्टॉल / आदि को चलाने के लिए उपयोग किया जाता है। बस अपनी उत्पादन साइट को इस तरह से सेट न करें।
एम्मी

5

आप स्क्रिप्ट में सभी कोड के ऊपर निम्न पंक्ति को निष्पादित करके php स्क्रिप्ट को दी गई मेमोरी बढ़ा सकते हैं:

ini_set('memory_limit','-1'); // enabled the full memory available.

और स्क्रिप्ट में अवांछित चरों को भी आबंटित करता है।

इस php लाइब्रेरी की जाँच करें: PHP के साथ मुफ्त मेमोरी



3

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

यह उल्लेख किया जाना चाहिए कि ini_set('memory_limit', '-1');(कोई सीमा नहीं) सर्वर अस्थिरता का कारण बन सकता है 0 bytes free = bad things। इसके बजाय, आपकी स्क्रिप्ट क्या करने की कोशिश कर रही है और एक मशीन पर उपलब्ध मेमोरी की मात्रा से एक उचित संतुलन खोजें।

एक बेहतर दृष्टिकोण: यदि आप स्क्रिप्ट के लेखक हैं (या महत्वाकांक्षी) तो आप ऐसे मेमोरी मुद्दों को xdebug के साथ डीबग कर सकते हैं । नवीनतम संस्करण (2.6.0 - 2018-01-29 को जारी किया गया) मेमोरी प्रोफाइलिंग को वापस लाया गया जो आपको दिखाता है कि फ़ंक्शन कॉल क्या बड़ी मात्रा में मेमोरी का उपभोग कर रहे हैं। यह स्क्रिप्ट में उन मुद्दों को उजागर करता है जो अन्यथा खोजना मुश्किल है। आमतौर पर, अक्षमताएं एक लूप में होती हैं जो उस मात्रा की अपेक्षा नहीं कर रही है जो उसे प्राप्त हो रही है, लेकिन प्रत्येक मामले को पाठक को अभ्यास के रूप में छोड़ दिया जाएगा :)

Xdebug प्रलेखन उपयोगी है, लेकिन यह 3 चरणों करने पर निर्भर करता:

  1. इसे स्थापित करें - के माध्यम से उपलब्ध है apt-getऔर yumआदि
  2. यह कॉन्फ़िगर - xdebug.ini: xdebug.profiler_enable = 1,xdebug.profiler_output_dir = /where/ever/
  3. QCacheGrind , KCacheGrind जैसे टूल में प्रोफ़ाइल देखें

2

यदि आप किसी फ़ाइल को पढ़ने की कोशिश कर रहे हैं, तो यह PHP में मेमोरी लेगा। उदाहरण के लिए, यदि आप एक एमपी 3 फ़ाइल को खोलने और पढ़ने की कोशिश कर रहे हैं (जैसे, कहते हैं, $ डेटा = फ़ाइल (" http://mydomain.com/path/sample.mp3 ") तो यह सब स्मृति में खींच जा रहा है ।

जैसा कि नेल्सन सुझाव देते हैं, आप अपनी अधिकतम मेमोरी सीमा को बढ़ाने के लिए काम कर सकते हैं यदि आपको वास्तव में इस मेमोरी का उपयोग करने की आवश्यकता है।


2

हमारे पास एक समान स्थिति थी और हमने जवाब ini_set ('memory_limit', '-1') के शीर्ष पर दिया था; और सब कुछ ठीक काम किया, संकुचित चित्र फ़ाइलों को KB से 1MB से अधिक।



1

मुझे Wordpress में एक नए विषय पर स्विच करने के बाद एक ही त्रुटि संदेश प्राप्त हो रहा था। PHP संस्करण 5.3 चला रहा था इसलिए मैंने 7.2 पर स्विच किया। यह मुद्दा तय हो गया।


1

यदि आप साझा होस्टिंग का उपयोग कर रहे हैं, तो आप php आकार सीमा में वेतन वृद्धि लागू नहीं कर पाएंगे।

बस अपने cpanel में जाएं और अपने php वर्जन को 7.1 और उससे अधिक पर अपग्रेड करें फिर आप जाने के लिए अच्छे हैं।


0

वर्डप्रेस उपयोगकर्ता लाइन जोड़ते हैं:

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

wp-settings.php में जो आप वर्डप्रेस इनस्टॉल रूट फोल्डर में पा सकते हैं


0

मैंने अपनी होस्टिंग को नवीनीकृत नहीं किया था और डेटाबेस केवल-पढ़ने के लिए था। जूमला को सत्र लिखने की जरूरत थी और वह ऐसा नहीं कर सका।


0

मैं एक ही मुद्दा था जो कमांड लाइन में php चल रहा था। हाल ही में, मैंने php.ini फ़ाइल में परिवर्तन किया था और php.ini को बदलते समय एक गलती की थी

यह php7.0 के लिए है

php.ini के लिए रास्ता जहाँ मैंने गलती की: /etc/php/7.0/cli/php.ini

मैं निर्धारित किया था memory_limit = 256(जो साधन 256 bytes)
के बजाय memory_limit = 256M(जो साधन 256 Mega bytes)।

; एक स्क्रिप्ट में अधिकतम मात्रा में मेमोरी (128 एमबी) की खपत हो सकती है
; http://php.net/memory-limit
memory_limit = 128M

एक बार जब मैंने इसे ठीक कर लिया, तो मेरी प्रक्रिया ठीक चलने लगी।



-1

यदि आप लार्वा का उपयोग कर रहे हैं तो इस तरीके का उपयोग करें

public function getClientsListApi(Request $request){ print_r($request->all()); //for all request print_r($request->name); //for all name }

के बजाय

public function getClientsListApi(Request $request){ print_r($request); // it show error as above mention }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.