2012-10-12 16 views
20

PHP में, मुझे अक्सर स्मृति सीमा समस्या का सामना करना पड़ रहा है। विशेष रूप से अत्यधिक साथ Drupal की तरह एकीकृत प्रणाली संसाधन, आदिPHP memory_limit के लिए बेहतर है?

क्या मैं यहाँ जानना चाहते है:

  • यह 2GB की तरह बहुत ही उच्च php स्मृति सीमा है के लिए अच्छा है?
  • क्या कोई बड़ी कमी है?

संपादित:

एक परिदृश्य के रूप में, Drupal में उदाहरण के लिए, यह इतना स्मृति की आवश्यकता है, जबकि हम साफ वेब कक्ष के माध्यम से कैश (Drush या किसी स्क्रिप्ट के द्वारा नहीं)। तो के लिए भी इस मामले में, मुझे निश्चित रूप से वर्तमान में 512 एमबी के आसपास उच्च सीमा की आवश्यकता है।

+4

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

+1

आपको 100 समवर्ती अनुरोधों की सेवा करने की कितनी मेमोरी की आवश्यकता होगी? 200GB? – JvdBerg

+5

@JvdBerg स्मृति सीमा परिभाषित नहीं करती है कि कितनी मेमोरी _actually_ उपयोग की जाती है। यह केवल एक ही प्रक्रिया है जिसे उपयोग करने की अनुमति है। – KingCrunch

उत्तर

27

सुनहरा नियम: केवल PHP को PHP को क्या काम करने की आवश्यकता है, और कुछ भी नहीं।

यह उन परिस्थितियों जब आपके सिस्टम बेकार पीएचपी प्रक्रिया पर डालते हैं पाएगा, और यह भी कीड़े खोजने में मदद करेंगे (एक स्क्रिप्ट है कि स्मृति के 1GB लेता असामान्य है, और एक स्मृति के 2GB सीमा दे रही है कि छुपा देगा) ।


असाधारण मामलों, जहाँ आप जानते हैं एक भी स्क्रिप्ट फ़ाइल बहुत स्मृति भारी है के लिए, आप ini_set() का उपयोग रन-टाइम में स्मृति सीमा के निर्देश को बदलने के लिए कर सकते हैं। this और this देखें।

+0

'कृपया मेरे प्रश्न को संपादित करें।' तो हे भगवान! अब मेरी प्रणाली उस सीमा के कारण धीमा हो रही है ??? (केवल कैश प्रक्रिया साफ़ करने के लिए) @ _ @ –

+1

@ 4lvin: मेरा जवाब संपादित किया। –

+0

धन्यवाद। आपने दो समस्याओं को भी हल किया है;) –

0

यदि आपके पास स्क्रिप्ट हैं कि को बड़ी मात्रा में स्मृति की आवश्यकता होती है तो यह सीमा पूरी तरह से सुरक्षित करने के लिए पूरी तरह से सुरक्षित और आवश्यक है। यदि स्मृति की उपलब्ध मात्रा और अन्य चल रहे अनुप्रयोगों के संबंध में सिस्टम के लिए सीमा उच्च पर सेट की गई है तो समस्याएं हो सकती हैं।

यह भी ध्यान रखें कि एक असीमित स्क्रिप्ट जो अनंत लूप प्रसंस्करण में समाप्त हो सकती है, कुछ डेटा अक्सर 64 एमबी या कुछ ऐसा होने पर बहुत तेजी से बंद हो जाता है। इस परिदृश्य में 4 जीबी पर मेमोरी सीमा होने से आपको एक अनंत लूप में पूर्ण झुकाव पर चलने वाली प्रणाली के साथ लंबे समय तक चलने वाली प्रणाली मिल जाएगी और आपकी पूरी प्रणाली अप्रतिबंधित हो सकती है।

लेकिन मेरे पास 4-8 जीबी मेमोरी वाले सिस्टम पर किसी भी मुद्दे के बिना लगभग 2-4 जीबी की स्मृति सीमा के साथ बड़े डेटा क्रंचिंग अनुप्रयोग हैं। ध्यान दें, जैसा कि अन्य उपयोगकर्ताओं द्वारा बताया गया है, ये अनुप्रयोग एक उदाहरण थे। यदि आपके पास ऐसे एप्लिकेशन हैं जो आपकी स्क्रिप्ट के कई उदाहरण चलाते हैं (जैसे अधिकांश वेब-एप्लिकेशन करते हैं) तो आप प्रत्येक इंस्टेंस में बहुत मेमोरी का उपयोग करके बड़ी समस्याओं में भाग लेंगे। आप स्मृति से बाहर हो जाएंगे और आगे के ग्राहक आपके आवेदन का उपयोग करने में सक्षम नहीं होंगे जब तक कि स्मृति मुक्त नहीं हो जाती।

लेकिन मुद्दों को छिपाने के लिए स्मृति सीमा को न केवल रैंप करें। निरीक्षण करें कि आपके एप्लिकेशन को इतनी मेमोरी क्यों चाहिए और देखें कि क्या आप इसे पहले सुधार सकते हैं।

5

नहीं, अधिक बेहतर नहीं है। यह स्मृति की मात्रा एकल स्क्रिप्ट का उपभोग करने की अनुमति है। यदि आपके सर्वर में, 4 जीबी मेमोरी है, तो केवल दो स्क्रिप्ट एक ही मेमोरी खा सकती हैं।

सामान्य रूप से, PHP स्क्रिप्ट को कम स्मृति का उपयोग करना चाहिए। आम तौर पर सभी स्मृति एक स्क्रिप्ट रिजर्व को समाप्त होने पर मुक्त कर दिया जाता है, लेकिन आप स्पष्ट रूप से unset टिंग वैरिएबल द्वारा स्मृति को साफ़ कर सकते हैं जिन्हें निष्पादन के दौरान अब आवश्यक नहीं है। इस तरह, आप अपनी स्क्रिप्ट को अधिक मेमोरी-कुशल बना सकते हैं।

+0

'अनसेट()' आमतौर पर तब तक आवश्यक नहीं है जब तक कि आप हर समय वैश्विक चर का उपयोग नहीं करेंगे। – KingCrunch

+0

@ किंग कंचन भी इससे कोई फर्क नहीं पड़ता है? 'वैश्विक' अभी भी स्क्रिप्ट निष्पादन की सीमा के भीतर ही वैश्विक है, वे अनुरोधों के बीच जारी नहीं रहते हैं। ध्यान दें कि 'अनसेट() 'गारंटी नहीं देता है कि स्मृति तुरंत मुक्त हो जाएगी, आपको' gc_collect_cycles() 'के साथ-साथ – DaveRandom

+0

' मेरे प्रश्न को संपादित किया गया है। 'तो हे भगवान !!! अब मेरी प्रणाली उस सीमा के कारण धीमा हो रही है ??? (केवल स्पष्ट रूप से कैश प्रक्रिया को साफ़ करने के लिए) @ _ @ –