ช่วงชีวิต

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

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

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