মেমোরি লিক সম্পর্কে
Webman একটি স্থায়ী মেমরি ফ্রেমওয়ার্ক, তাই আমাদের মেমোরি লিকের দিকে একটু নজর দেওয়া প্রয়োজন। তবে ডেভেলপারদের বেশি চিন্তা করার দরকার নেই, কারণ মেমোরি লিক খুবই চরম পরিস্থিতিতে ঘটে এবং সহজেই এড়ানো যায়। Webman ডেভেলপমেন্ট ঐতিহ্যগত ফ্রেমওয়ার্ক ডেভেলপমেন্টের মতোই; অতিরিক্ত মেমরি ব্যবস্থাপনার অপারেশন করতে হয় না।
পরামর্শ
Webman-এর অন্তর্নির্মিত monitor প্রসেস সমস্ত প্রসেসের মেমরি ব্যবহার পর্যবেক্ষণ করে। কোনো প্রসেসের মেমোরি ব্যবহার php.ini-তেmemory_limitনির্ধারিত মানে পৌঁছালে, সংশ্লিষ্ট প্রসেস মেমোরি মুক্ত করতে স্বয়ংক্রিয়ভাবে নিরাপদে রিস্টার্ট হয়; অ্যাপ্লিকেশনে কোনো প্রভাব পড়ে না।
মেমোরি লিকের সংজ্ঞা
অনুরোধ বাড়ার সাথে webman-এর মেমোরি ব্যবহার বাড়া স্বাভাবিক। সাধারণভাবে, যখন কোনো প্রসেস নির্দিষ্ট অনুরোধ সংখ্যায় পৌঁছায় (সাধারণত মিলিয়ন পর্যায়ে), মেমোরি বাড়া বন্ধ হয়ে যায় বা মাঝে মাঝে সামান্য বাড়ে।
অধিকাংশ অ্যাপ্লিকেশনে একক প্রসেসের মেমোরি ব্যবহার শেষ পর্যন্ত 10M–100M-এর কাছাকাছি স্থিতিশীল হয়। একক প্রসেসের মেমোরি 100M অতিক্রম না করলে চিন্তার কিছু নেই।
উপরন্তু, বড় ফাইল, বড় অনুরোধ প্রক্রিয়াকরণ বা ডাটাবেস থেকে বড় পরিমাণ ডেটা পড়ার সময় PHP প্রচুর মেমোরি বরাদ্দ করে। PHP এই মেমোরির অংশ অপারেটিং সিস্টেমে ফেরত না দিয়ে পুনঃব্যবহারের জন্য রাখতে পারে; এতে মেমোরি ব্যবহার বেশি দেখায়। মেমোরি পুনঃব্যবহার হয় বলে চিন্তার কারণ নেই।
পরামর্শ
phar অথবা বাইনারি প্যাক করা প্রজেক্টে, যদি প্যাকেজের আকার বড় হয় তাহলে মেমোরি ব্যবহার 100M ছাড়ালে সেটা স্বাভাবিক।
মেমোরি লিক কিভাবে নিশ্চিত করবেন
যদি কোনো প্রসেস এক মিলিয়নের বেশি অনুরোধ প্রক্রিয়া করে, মেমোরি 100M ছাড়ায় এবং প্রতিটি অনুরোধের পরেও মেমোরি বাড়তে থাকে, তাহলে মেমোরি লিক হতে পারে।
মেমোরি লিক কিভাবে খুঁজে বের করবেন
সহজ পদ্ধতি হলো প্রতিটি API-তে স্ট্রেস টেস্ট চালিয়ে দেখা কোন API মিলিয়ন অনুরোধের পরেও মেমোরি ব্যবহার বাড়াতে থাকে।
সমস্যাযুক্ত API পাওয়ার পর বাইনারি সন্ধান পদ্ধতি ব্যবহার করুন: প্রতিবার ব্যবসায়িক কোডের অর্ধেক কমেন্ট আউট করুন যতক্ষণ না সমস্যাজনক কোড শনাক্ত হয়।
মেমোরি লিক কিভাবে হয়
মেমোরি লিক শুধুমাত্র নিচের দুটি শর্ত পূরণ হলে হয়:
- দীর্ঘ জীবনচক্রের অ্যারে বিদ্যমান (সাধারণ অ্যারে সমস্যা নয়)
- এবং এই দীর্ঘ জীবনচক্রের অ্যারেটি সীমাহীনভাবে বাড়ে (অ্যাপ্লিকেশন ক্রমাগত ডেটা ঢুকায়, কখনো পরিষ্কার করে না)
শুধুমাত্র উভয় শর্ত পূরণ হলে লিক হয়। উপরোক্ত শর্ত পূরণ না হলে বা শুধু একটা পূরণ হলে লিক নয়।
দীর্ঘ জীবনচক্রের অ্যারে
Webman-এ দীর্ঘ জীবনচক্রের অ্যারের মধ্যে রয়েছে:
- static কীওয়ার্ডের অ্যারে
- সিঙ্গলটনের অ্যারে প্রপার্টি
- global কীওয়ার্ডের অ্যারে
লক্ষ্য করুন
Webman-এ দীর্ঘ জীবনচক্রের ডেটা ব্যবহারের অনুমতি আছে, তবে ডেটা সীমাবদ্ধ এবং উপাদান সংখ্যা সীমাহীনভাবে বাড়বে না নিশ্চিত করতে হবে।
প্রতিটি ক্ষেত্রে উদাহরণ নিচে দেওয়া হলো।
সীমাহীনভাবে বাড়তে থাকা static অ্যারে
class Foo
{
public static $data = [];
public function index(Request $request)
{
self::$data[] = time();
return response('hello');
}
}
static কীওয়ার্ড দিয়ে সংজ্ঞায়িত $data অ্যারেটি দীর্ঘ জীবনচক্রের অ্যারে। উদাহরণে $data প্রতিটি অনুরোধের সাথে বাড়তে থাকে, ফলে মেমোরি লিক হয়।
সীমাহীনভাবে বাড়তে থাকা সিঙ্গলটন অ্যারে প্রপার্টি
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-এর একটি সিঙ্গলটন রিটার্ন করে যা দীর্ঘ জীবনচক্রের ক্লাস ইনস্ট্যান্স। $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কীওয়ার্ডের অ্যারে যতটা সম্ভব এড়িয়ে চলুন; ব্যবহার করলে সীমাহীনভাবে বাড়বে না নিশ্চিত করুন।- অপরিচিত ক্লাসের জন্য যতটা সম্ভব সিঙ্গলটন ব্যবহার এড়িয়ে
newকীওয়ার্ড দিয়ে ইনিশিয়ালাইজ করুন। সিঙ্গলটন লাগলে দেখুন সিঙ্গলটনে সীমাহীনভাবে বাড়তে থাকা অ্যারে প্রপার্টি আছে কিনা।