मेमोरी लीक के बारे में
Webman एक स्थायी मेमोरी ढांचा है, इसलिए हमें मेमोरी लीक की स्थिति पर थोड़ी ध्यान देने की आवश्यकता है। हालांकि डेवलपर्स को बहुत चिंतित होने की ज़रूरत नहीं है, क्योंकि मेमोरी लीक बेहद चरम स्थितियों में होता है और इससे आसानी से बचा जा सकता है। Webman का विकास पारंपरिक ढांचों के विकास के अनुभव के समान है, और मेमोरी प्रबंधन के लिए अतिरिक्त ऑपरेशन की आवश्यकता नहीं होती है।
सूचना
Webman के साथ आने वाली monitor प्रक्रिया सभी प्रक्रियाओं की मेमोरी उपयोग की निगरानी करेगी, यदि प्रक्रिया का मेमोरी उपयोगphp.ini
में निर्धारितmemory_limit
के मूल्य के करीब जा रहा है, तो संबंधित प्रक्रिया को स्वचालित रूप से सुरक्षित रूप से पुनः शुरू किया जाएगा, जिससे मेमोरी को मुक्त किया जाएगा, इस दौरान व्यवसाय पर कोई प्रभाव नहीं होगा।
मेमोरी लीक की परिभाषा
जैसे-जैसे अनुरोधों की संख्या बढ़ती है, Webman द्वारा उपयोग की जाने वाली मेमोरी भी अनन्त रूप से बढ़ती है (ध्यान दें कि यह अनन्त वृद्धि है), जो कुछ सौ मेगाबाइट या उससे अधिक हो जाती है, यह मेमोरी लीक है। यदि मेमोरी में वृद्धि होती है, लेकिन उसके बाद और वृद्धि नहीं होती है, तो इसे मेमोरी लीक नहीं माना जाएगा।
आम तौर पर, प्रक्रियाएँ दर्जनों मेगाबाइट मेमोरी का उपयोग करती हैं, जो एक सामान्य स्थिति है। जब प्रक्रिया बहुत बड़े अनुरोध को संभालती है या ढेर सारे कनेक्शन बनाए रखती है, तब एकल प्रक्रिया का मेमोरी उपयोग सैकड़ों मेगाबाइट तक पहुंच सकता है। इस भाग की मेमोरी का उपयोग करने के बाद PHP संभवतः सभी मेमोरी को ऑपरेटिंग सिस्टम को वापस नहीं लौटाता है। बल्कि इसे पुनः उपयोग के लिए रखा जाता है, इसलिए एक बड़े अनुरोध को संभालने के बाद मेमोरी का उपयोग बढ़ने और मेमोरी को मुक्त न करने की स्थिति उत्पन्न हो सकती है, यह एक सामान्य घटना है। (पद्धति gc_mem_caches()
का उपयोग करके कुछ रिक्त मेमोरी को मुक्त किया जा सकता है)
मेमोरी लीक कैसे होता है
मेमोरी लीक होने के लिए निम्नलिखित दो शर्तों का होना आवश्यक है:
- एक लंबी अवधि के जीवन वाला ऐरे (ध्यान दें कि यह लंबी अवधि के जीवन वाला ऐरे है, सामान्य ऐरे का कोई मुद्दा नहीं है)
- और यह लंबी अवधि के जीवन वाला ऐरे अनंत रूप से विस्तार हो रहा है (व्यापार अनंत रूप से इसमें डेटा डालता है, डेटा को कभी साफ नहीं करता)
यदि शर्तें 1 और 2 साथ में पूरी होती हैं (ध्यान दें कि यह साथ में पूरी होती हैं), तो मेमोरी लीक उत्पन्न होगा। अन्यथा, यदि उपरोक्त शर्तें पूरी नहीं होती हैं या केवल एक शर्त पूरी होती है, तो यह मेमोरी लीक नहीं होगा।
लंबी अवधि के जीवन वाला ऐरे
Webman में लंबी अवधि के जीवन वाले ऐरे में शामिल हैं:
- static कुंजी वाले ऐरे
- एकलton ऐरे गुण
- global कुंजी वाले ऐरे
ध्यान दें
Webman में लंबी अवधि के जीवन वाले डेटा का उपयोग करने की अनुमति है, लेकिन यह सुनिश्चित करना आवश्यक है कि डेटा में डेटा सीमित है, तत्वों की संख्या अनंत रूप से नहीं बढ़ेगी।
नीचे अलग-अलग उदाहरण दिए गए हैं
अनंत रूप से बढ़ता static ऐरे
class Foo
{
public static $data = [];
public function index(Request $request)
{
self::$data[] = time();
return response('hello');
}
}
static
कुंजी से परिभाषित \$data
ऐरे एक लंबी अवधि के जीवन वाला ऐरे है, और उदाहरण में \$data
ऐरे अनुरोधों के साथ लगातार बढ़ता है जिससे मेमोरी लीक हो जाता है।
अनंत रूप से बढ़ता एकलton ऐरे गुण
class Cache
{
protected static $instance;
public $data = [];
public function instance()
{
if (!self::$instance) {
self::$instance = new self;
}
return self::$instance;
}
public function set($key, $value)
{
$this->data[$key] = $value;
}
}
कॉलिंग कोड
class Foo
{
public function index(Request $request)
{
Cache::instance()->set(time(), time());
return response('hello');
}
}
Cache::instance()
एक Cache एकलton लौटाता है, यह एक लंबी अवधि के जीवन वाला कक्षा उदाहरण है, हालाँकि इसका \$data
गुण static
कुंजी का उपयोग नहीं कर रहा है, लेकिन चूंकि कक्षा स्वयं एक लंबी अवधि के जीवन वाली है, इसलिए \$data
भी एक लंबी अवधि के जीवन वाला ऐरे है। विभिन्न कुंजी के डेटा को \$data
ऐरे में जोड़ते समय, प्रोग्राम का मेमोरी उपयोग भी बढ़ता है, जिससे मेमोरी लीक होता है।
ध्यान दें
यदिCache::instance()->set(key, value)
में जोड़ा गया कुंजी सीमित संख्या में है, तो मेमोरी लीक नहीं होगा क्योंकि\$data
ऐरे अनंत रूप से नहीं बढ़ रहा है।
अनंत रूप से बढ़ता global ऐरे
class Index
{
public function index(Request $request)
{
global $data;
$data[] = time();
return response($foo->sayHello());
}
}
global कुंजी से परिभाषित ऐरे कार्य या कक्षा विधि के पूरा होने के बाद पुनः प्राप्त नहीं होता है, इसलिए यह एक लंबी अवधि के जीवन वाला ऐरे है, ऊपर दिया गया कोड अनुरोधों के साथ लगातार बढ़ने पर मेमोरी लीक उत्पन्न करेगा। इसी प्रकार, किसी कार्य या विधि के भीतर static
कुंजी से परिभाषित ऐरे भी एक लंबी अवधि के जीवन वाला ऐरे है, यदि ऐरे अनंत रूप से बढ़ता है, तो भी मेमोरी लीक होगा, जैसे कि:
class Index
{
public function index(Request $request)
{
static $data = [];
$data[] = time();
return response($foo->sayHello());
}
}
सुझाव
डेवलपर्स को मेमोरी लीक के लिए विशेष रूप से चिंता करने की सलाह नहीं दी जाती है, क्योंकि यह बहुत कम होता है। यदि दुर्भाग्यवश यह होता है, तो हम लोड परीक्षण के माध्यम से पहचान सकते हैं कि कौन सा कोड लीक उत्पन्न कर रहा है, जिससे समस्या को पहचानने में मदद मिलेगी। भले ही डेवलपर लीक बिंदु को पहचानने में असमर्थ हो, Webman के साथ आने वाली monitor सेवा समय पर सुरक्षित रूप से पुनः प्रारंभ करेगी, जिससे मेमोरी मुक्त हो जाएगी।
यदि आप वास्तव में मेमोरी लीक से बचने के लिए प्रयासरत हैं, तो निम्नलिखित सुझावों का पालन करें।
global
औरstatic
कुंजी वाले ऐरे का उपयोग न करें, यदि उपयोग करें तो सुनिश्चित करें कि यह अनंत रूप से नहीं बढ़ता है।- अनजान कक्षाओं के लिए, एकलton का उपयोग करने से बचें,
new
कुंजी से प्रारंभ करें। यदि एकलton की आवश्यकता है, तो देखें कि क्या इसके पास अनंत रूप से बढ़ने वाला ऐरे गुण है।