วงจรชีวิต

วงจรชีวิตของกระบวนการ

  • แต่ละกระบวนการมีวงจรชีวิตที่ยาวนาน
  • แต่ละกระบวนการทำงานอย่างอิสระและไม่รบกวนซึ่งกันและกัน
  • แต่ละกระบวนการสามารถประมวลผลคำขอได้หลายคำขอภายในวงจรชีวิตของมัน
  • กระบวนการจะออกจากระบบและสิ้นสุดวงจรชีวิตปัจจุบันเมื่อได้รับคำสั่ง 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());
    }
}

หากคุณต้องการให้อินสแตนซ์ของคลาสถูกนำกลับมาใช้ใหม่ คุณสามารถเก็บคลาสไว้ในคุณสมบัติแบบ 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 ก็เพิ่มขึ้นเรื่อยๆ ส่งผลให้เกิดการรั่วไหลของหน่วยความจำ

สำหรับข้อมูลเพิ่มเติม โปรดดู การรั่วไหลของหน่วยความจำ