মেমরি লিক সম্পর্কে

webman একটি স্থায়ী মেমরি ফ্রেমওয়ার্ক, তাই আমাদের মেমরি লিকের পরিস্থিতি সম্পর্কে কিছুটা মনোযোগ দিতে হবে। তবে ডেভেলপারদের অত্যধিক চিন্তা করার প্রয়োজন নেই, কারণ মেমরি লিক অত্যন্ত চূড়ান্ত অবস্থায় ঘটে এবং খুব সহজেই এড়ানো যায়। webman এর উন্নয়ন এবং প্রচলিত ফ্রেমওয়ার্ক উন্নয়নের অভিজ্ঞতা মূলত একই, অতিরিক্ত অপারেশন মেমরি পরিচালনার জন্য করতে হবে না।

টিপ
webman এর অন্তর্নিহিত monitor প্রক্রিয়া সমস্ত প্রক্রিয়ার মেমরি ব্যবহার পরিস্থিতি পর্যবেক্ষণ করে, যদি একটি প্রক্রিয়া ব্যবহৃত মেমরি php.ini তে memory_limit দ্বারা নির্ধারিত মানে পৌঁছে যায়, তবে এটি স্বয়ংক্রিয়ভাবে সম্পর্কিত প্রক্রিয়াটি নিরাপদে পুনরায় চালু করবে, যাতে মেমরি মুক্ত হয়, এই সময় ব্যবসার উপর কোনো প্রভাব ফেলবে না।

মেমরি লিকের সংজ্ঞা

অনুরোধের সংখ্যা বৃদ্ধি পাওয়ার সাথে সাথে, webman এর মেমরি অসংখ্য বাড়তে থাকে (এটি অসংখ্য বাড়তে থাকে দৃষ্টি আকর্ষণ করেছে), কয়েকশো এমবিতে বা তারও বেশি পৌঁছায়, এটি মেমরি লিক। যদি মেমরি বৃদ্ধি পায় তবে পরে আর বৃদ্ধি না পায় তবে এটি মেমরি লিক নয়।

সাধারণত, প্রক্রিয়াগুলি কয়েকশো এমবির মেমরি ব্যবহার করা স্বাভাবিক একটি ঘটনা, যখন একটি প্রক্রিয়া অত্যন্ত বড় অনুরোধ পরিচালনা করে বা বিপুল সংখ্যক সংযোগ রক্ষণাবেক্ষণ করে, তখন একক প্রক্রিয়ার মেমরি ব্যবহার প্রায়শই শতাধিক এমবি হতে পারে। এই অংশের মেমরি ব্যবহার করার পরে php সিস্টেমে পুরোপুরি ফেরত দেবেনা। বরং এটি পুনঃব্যবহারের জন্য ধরে রেখে দেয়, তাই কোনো বৃহত্ অনুরোধের পরে মেমরি ব্যবহার বৃদ্ধি পায় কিন্তু মেমরি মুক্ত হয় না, এটি একটি স্বাভাবিক ঘটনা। (gc_mem_caches() ফাংশন কল করলে অংশিক খালি মেমরি মুক্ত করতে পারে)

মেমরি লিক কিভাবে ঘটে

মেমরি লিক ঘটানোর জন্য নিম্নলিখিত দুইটি শর্ত অবশ্যই পূরণ করতে হবে:

  1. একটি দীর্ঘ জীবনকালের অ্যারের উপস্থিতি (এটি দীর্ঘ জীবনকাল অ্যারের ব্যাপারে, সাধারণ অ্যারের সাথে কিছু হয় না)
  2. এবং এই দীর্ঘ জীবনকালের অ্যারেটি অসীমভাবে বর্ধিত হবে (ব্যবসা অসীমভাবে এতে ডেটা প্রবাহিত করে, কখনোই ডেটা পরিষ্কার করে না)

যদি ১ এবং ২ শর্তগুলো একসাথে পূরণ হয় (এটি একসাথে পূরণ হয় লক্ষ্য করুন), তাহলে মেমরি লিক সৃষ্টি হবে। এর বিপরীতে, যদি উপরের শর্তগুলো পূরণ না হয় বা শুধু একটির শর্ত পূরণ হয় তবে তা মেমরি লিক নয়।

দীর্ঘ জীবনের অ্যারে

webman এ দীর্ঘ জীবনকালের অ্যারে অন্তর্ভুক্ত:

  1. static কিওয়ার অ্যারে
  2. একক অবজেক্টের জন্য অ্যারে প্রপার্টি
  3. 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 পরিষেবা সময়মতো নিরাপদে পুনরায় চালু করবে মেমরি লিক ঘটিত প্রক্রিয়া, মেমরি মুক্ত করবে।

আপনি যদি সত্যিই মেমরি লিক এড়াতে চান তবে নিম্নলিখিত সুপারিশগুলি পরীক্ষা করুন।

  1. সম্ভাব্যভাবে global, static কিওয়ার অ্যারে ব্যবহার করবেন না, যদি ব্যবহার করেন তবে নিশ্চিত করুন যে এটি অসীমভাবে বাড়ছে না।
  2. যে ক্লাসগুলি পরিচিত নয়, সেগুলি জন্য সম্ভবত একক ব্যবহার করবেন না, new কিওয়ার মাধ্যমে প্রাথমিক মূল্যায়ন করুন। যদি একক প্রয়োজন হয় তবে দেখুন যে এটি অসীমভাবে বাড়ছে কিনা।