ช่วงชีวิต
ช่วงชีวิตของกระบวนการ
- ทุกกระบวนการมีช่วงชีวิตที่ยาวนาน
- ทุกกระบวนการทำงานแยกจากกันไม่รบกวนกัน
- ทุกกระบวนการสามารถจัดการกับหลายคำขอในช่วงชีวิตของมัน
- กระบวนการจะออกจากช่วงชีวิตนี้เมื่อได้รับคำสั่ง
stop
reload
restart
คำแนะนำ
ทุกกระบวนการเป็นอิสระจากกัน ซึ่งหมายความว่าทุกกระบวนการจะดูแลทรัพยากร ตัวแปร และอ instance ของคลาสของตนเอง ซึ่งแสดงให้เห็นว่าแต่ละกระบวนการจะมีการเชื่อมต่อฐานข้อมูลของตนเอง และบาง singleton จะถูกสร้างขึ้นเพียงครั้งเดียวในแต่ละกระบวนการ ดังนั้นหลายกระบวนการจึงถูกสร้างขึ้นหลายครั้ง
ช่วงชีวิตของคำขอ
- ทุกคำขอจะสร้างอ็อบเจ็กต์
$request
- อ็อบเจ็กต์
$request
จะถูกเก็บคืนเมื่อการจัดการคำขอเสร็จสิ้น
ช่วงชีวิตของตัวควบคุม
- ทุกตัวควบคุมในแต่ละกระบวนการจะถูกสร้างขึ้นเพียงครั้งเดียว แต่หลายกระบวนการจะถูกสร้างขึ้นหลายครั้ง (ยกเว้นการใช้งานตัวควบคุมซ้ำ ดูเพิ่มเติมที่ ช่วงชีวิตของตัวควบคุม)
- อ instance ของตัวควบคุมจะถูกแชร์ระหว่างคำขอหลายรายการในกระบวนการปัจจุบัน (ยกเว้นการใช้งานตัวควบคุมซ้ำ)
- ช่วงชีวิตของตัวควบคุมจะสิ้นสุดเมื่อกระบวนการออกจากระบบ (ยกเว้นการใช้งานตัวควบคุมซ้ำ)
เกี่ยวกับช่วงชีวิตของตัวแปร
webman พัฒนาขึ้นบน PHP ดังนั้นจึงปฏิบัติตามกลไกการคืนตัวแปรของ PHP อย่างสมบูรณ์ ตัวแปรชั่วคราวที่สร้างขึ้นในตรรกะธุรกิจรวมถึงการสร้างอ instance ของคลาสด้วยคีย์เวิร์ด new จะถูกเก็บคืนอัตโนมัติเมื่อฟังก์ชันหรือวิธีสิ้นสุดลง ไม่จำเป็นต้องใช้ unset
เพื่อปล่อย จากที่กล่าวมา ประสบการณ์การพัฒนาใน webman จะเหมือนกับการพัฒนาในเฟรมเวิร์กแบบดั้งเดิม ตัวอย่างเช่น ในกรณีของตัวอย่างด้านล่าง instance ของ $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());
}
}
หากคุณต้องการให้ instance ของคลาสถูกใช้งานซ้ำ คุณสามารถจัดเก็บคลาสในคุณสมบัติสถิตของคลาสหรือคุณสมบัติของวัตถุที่มีช่วงชีวิตยาว (เช่น ตัวควบคุม) ก็ได้ นอกจากนี้ยังสามารถใช้วิธี get ของ Container เพื่อเริ่มต้น instance ของคลาส เช่น:
<?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()
ใช้สำหรับสร้างและบันทึก instance ของคลาส เมื่อเรียกใช้ด้วยพารามิเตอร์เดียวกันอีกครั้งจะคืนค่า instance ของคลาสที่สร้างไว้ก่อนหน้า
หมายเหตุ
Container::get()
สามารถเริ่มต้น instance ที่ไม่มีตัวแปรในตัวสร้างได้เท่านั้นContainer::make()
สามารถสร้าง instance ที่มีพารามิเตอร์ตัวสร้าง แต่แตกต่างจากContainer::get()
คือContainer::make()
จะไม่ใช้ instance ซ้ำ กล่าวคือแม้ว่าจะมีพารามิเตอร์เดียวกันContainer::make()
จะให้แค่ instance ใหม่เสมอ
เกี่ยวกับการรั่วไหลของหน่วยความจำ
ในกรณีส่วนใหญ่ โค้ดธุรกิจของเราจะไม่มีการรั่วไหลของหน่วยความจำ (มีเพียงเล็กน้อยที่ผู้ใช้ให้ข้อเสนอแนะแต่อาจเกิดการรั่วไหล) สิ่งที่เราต้องระวังคือการจัดการกับข้อมูลในอาร์เรย์ที่มีช่วงชีวิตยาวไม่ให้ขยายออกไปไม่สิ้นสุด โปรดดูโค้ดด้านล่าง:
<?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
ก็จะเพิ่มขึ้นอย่างต่อเนื่องทำให้เกิดการรั่วไหลของหน่วยความจำ
สำหรับข้อมูลเพิ่มเติม โปรดดูที่ การรั่วไหลของหน่วยความจำ