জীবনচক্র
প্রসেস জীবনচক্র
- প্রতিটি প্রসেসের দীর্ঘ জীবনচক্র রয়েছে
- প্রতিটি প্রসেস স্বাধীনভাবে চলমান এবং পরস্পরের সাথে হস্তক্ষেপ করে না
- প্রতিটি প্রসেস তার জীবনচক্রের মধ্যে একাধিক অনুরোধ প্রক্রিয়া করতে পারে
- প্রসেস
stop,reload,restartকমান্ড পাওয়ার পর প্রস্থান করবে এবং বর্তমান জীবনচক্র শেষ করবে
পরামর্শ
প্রতিটি প্রসেস স্বাধীন এবং পরস্পরের সাথে হস্তক্ষেপ করে না, এর অর্থ প্রতিটি প্রসেস তার নিজস্ব সম্পদ, ভেরিয়েবল এবং ক্লাস ইনস্ট্যান্স সংরক্ষণ করে। এটি প্রতিফলিত হয় প্রতিটি প্রসেসের নিজস্ব ডাটাবেস সংযোগে, কিছু সিঙ্গলটন প্রতিটি প্রসেসে একবার ইনিশিয়ালাইজ হয়, ফলে একাধিক প্রসেস একাধিকবার ইনিশিয়ালাইজ হয়।
অনুরোধ জীবনচক্র
- প্রতিটি অনুরোধ একটি
$requestঅবজেক্ট উৎপন্ন করে - অনুরোধ প্রক্রিয়াকরণ শেষে
$requestঅবজেক্ট রিসাইকেল করা হয়
কন্ট্রোলার জীবনচক্র
- প্রতিটি কন্ট্রোলার প্রতিটি প্রসেসে শুধুমাত্র একবার ইনস্ট্যান্স করা হয়, একাধিক প্রসেসে একাধিকবার (কন্ট্রোলার পুনঃব্যবহার বন্ধ করা ছাড়া, কন্ট্রোলার জীবনচক্র দেখুন)
- কন্ট্রোলার ইনস্ট্যান্স বর্তমান প্রসেসের মধ্যে একাধিক অনুরোধ দ্বারা ভাগ করা হয় (কন্ট্রোলার পুনঃব্যবহার বন্ধ করা ছাড়া)
- প্রসেস প্রস্থানের পর কন্ট্রোলার জীবনচক্র শেষ হয় (কন্ট্রোলার পুনঃব্যবহার বন্ধ করা ছাড়া)
ভেরিয়েবল জীবনচক্র সম্পর্কে
webman PHP-এর উপর ভিত্তি করে বিকশিত, তাই এটি সম্পূর্ণভাবে PHP-এর ভেরিয়েবল রিসাইকেল মেকানিজম অনুসরণ করে। ব্যবসায়িক লজিকে তৈরি সাময়িক ভেরিয়েবল, new কীওয়ার্ড দিয়ে তৈরি ক্লাসের ইনস্ট্যান্স সহ, ফাংশন বা মেথড শেষ হওয়ার পর স্বয়ংক্রিয়ভাবে রিসাইকেল হয়, ম্যানুয়ালি unset করার প্রয়োজন নেই। অর্থাৎ webman ডেভলপমেন্ট এবং ঐতিহ্যগত ফ্রেমওয়ার্ক ডেভেলপমেন্ট অভিজ্ঞতা প্রায় একই। উদাহরণস্বরূপ, নিচের উদাহরণে $foo ইনস্ট্যান্স index মেথড নির্বাহ সমাপ্তির সাথে স্বয়ংক্রিয়ভাবে মুক্তি পায়:
<?php
namespace app\controller;
use app\service\Foo;
use support\Request;
class IndexController
{
public function index(Request $request)
{
$foo = new Foo(); // ধরে নিন এখানে একটি Foo ক্লাস আছে
return response($foo->sayHello());
}
}
যদি আপনি চান যে কোনও ক্লাসের ইনস্ট্যান্স পুনঃব্যবহৃত হোক, তাহলে ক্লাসটিকে ক্লাসের স্ট্যাটিক প্রপার্টিতে বা দীর্ঘ জীবনচক্রের অবজেক্টের (যেমন কন্ট্রোলার) প্রপার্টিতে সংরক্ষণ করতে পারেন, অথবা Container-এর get মেথড ব্যবহার করে ক্লাসের ইনস্ট্যান্স ইনিশিয়ালাইজ করতে পারেন, উদাহরণস্বরূপ:
<?php
namespace app\controller;
use app\service\Foo;
use support\Container;
use support\Request;
class IndexController
{
public function index(Request $request)
{
$foo = Container::get(Foo::class);
return response($foo->sayHello());
}
}
Container::get() মেথড ক্লাসের ইনস্ট্যান্স তৈরি এবং সংরক্ষণের জন্য ব্যবহৃত হয়, একই প্যারামিটার দিয়ে আবার কল করলে পূর্বে তৈরি ইনস্ট্যান্স ফিরে আসবে।
দ্রষ্টব্য
Container::get()শুধুমাত্র কনস্ট্রাক্টর প্যারামিটারবিহীন ইনস্ট্যান্স ইনিশিয়ালাইজ করতে পারে।Container::make()কনস্ট্রাক্টর প্যারামিটারসহ ইনস্ট্যান্স তৈরি করতে পারে, তবেContainer::get()থেকে ভিন্ন,Container::make()ইনস্ট্যান্স পুনঃব্যবহার করে না, অর্থাৎ একই প্যারামিটার দিয়ে হলেওContainer::make()সর্বদা নতুন ইনস্ট্যান্স ফিরায়।
মেমরি লিক সম্পর্কে
অধিকাংশ ক্ষেত্রে, আমাদের ব্যবসায়িক কোড মেমরি লিক ঘটায় না (অতি অল্প ব্যবহারকারী মেমরি লিকের প্রতিক্রিয়া দেন), আমাদের শুধু দীর্ঘ জীবনচক্রের অ্যারে ডেটা অসীমভাবে প্রসারিত না হতে সতর্ক থাকতে হবে। নিচের কোড দেখুন:
<?php
namespace app\controller;
use support\Request;
class FooController
{
// অ্যারে প্রপার্টি
public $data = [];
public function index(Request $request)
{
$this->data[] = time();
return response('hello index');
}
public function hello(Request $request)
{
return response('hello webman');
}
}
কন্ট্রোলার ডিফল্টভাবে দীর্ঘ জীবনচক্রের (কন্ট্রোলার পুনঃব্যবহার বন্ধ করা ছাড়া), একইভাবে কন্ট্রোলারের $data অ্যারে প্রপার্টিও দীর্ঘ জীবনের। foo/index অনুরোধ বাড়তে থাকলে $data অ্যারের উপাদান বাড়তে থাকায় মেমরি লিক ঘটে।
আরও তথ্যের জন্য মেমরি লিক দেখুন।