วงจรชีวิต
วงจรชีวิตของกระบวนการ
- แต่ละกระบวนการมีวงจรชีวิตที่ยาวนาน
- แต่ละกระบวนการทำงานอย่างอิสระและไม่รบกวนซึ่งกันและกัน
- แต่ละกระบวนการสามารถประมวลผลคำขอได้หลายคำขอภายในวงจรชีวิตของมัน
- กระบวนการจะออกจากระบบและสิ้นสุดวงจรชีวิตปัจจุบันเมื่อได้รับคำสั่ง
stopreloadหรือ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());
}
}
หากคุณต้องการให้อินสแตนซ์ของคลาสถูกนำกลับมาใช้ใหม่ คุณสามารถเก็บคลาสไว้ในคุณสมบัติแบบ static ของคลาส หรือในคุณสมบัติของอ็อบเจกต์ที่มีวงจรชีวิตยาว (เช่น คอนโทรลเลอร์) หรือใช้เมธอด get ของ Container เพื่อเริ่มต้นอินสแตนซ์ของคลาส เช่น:
<?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 ก็เพิ่มขึ้นเรื่อยๆ ส่งผลให้เกิดการรั่วไหลของหน่วยความจำ
สำหรับข้อมูลเพิ่มเติม โปรดดู การรั่วไหลของหน่วยความจำ