Vòng đời

Vòng đời tiến trình

  • Mỗi tiến trình có một vòng đời dài
  • Mỗi tiến trình hoạt động độc lập và không ảnh hưởng lẫn nhau
  • Mỗi tiến trình có thể xử lý nhiều yêu cầu trong suốt vòng đời của nó
  • Khi tiến trình nhận lệnh stop reload restart, nó sẽ thực thi thoát, kết thúc vòng đời hiện tại

Mẹo
Mỗi tiến trình đều độc lập không ảnh hưởng lẫn nhau, điều này có nghĩa là mỗi tiến trình duy trì tài nguyên, biến và thể hiện của lớp riêng của nó, điều này được thể hiện ở việc mỗi tiến trình đều có kết nối cơ sở dữ liệu riêng của mình, một số singleton chỉ được khởi tạo một lần trong mỗi tiến trình, vì vậy nhiều tiến trình sẽ khởi tạo nhiều lần.

Vòng đời yêu cầu

  • Mỗi yêu cầu sẽ tạo ra một đối tượng $request
  • Đối tượng $request sẽ được thu hồi sau khi việc xử lý yêu cầu hoàn tất

Vòng đời bộ điều khiển

  • Mỗi bộ điều khiển chỉ được khởi tạo một lần trong mỗi tiến trình, nhưng sẽ được khởi tạo nhiều lần trong nhiều tiến trình (trừ khi kiểm soát việc tái sử dụng bộ điều khiển, tham khảo vòng đời bộ điều khiển)
  • Thể hiện của bộ điều khiển sẽ được chia sẻ bởi nhiều yêu cầu trong cùng một tiến trình (trừ khi kiểm soát việc tái sử dụng bộ điều khiển)
  • Vòng đời của bộ điều khiển sẽ kết thúc khi tiến trình thoát (trừ khi kiểm soát việc tái sử dụng bộ điều khiển)

Về vòng đời của biến

webman được phát triển dựa trên PHP, vì vậy nó hoàn toàn tuân theo cơ chế thu hồi biến của PHP. Các biến tạm thời được sinh ra trong logic nghiệp vụ bao gồm các thể hiện của lớp được tạo ra bằng từ khóa new, sẽ tự động được thu hồi sau khi hàm hoặc phương thức kết thúc, không cần phải unset để giải phóng thủ công. Nói cách khác, trải nghiệm phát triển webman tương tự như phát triển với các framework truyền thống. Ví dụ, trong ví dụ dưới đây, thể hiện $foo sẽ tự động được giải phóng khi phương thức index kết thúc thực thi:

<?php

namespace app\controller;

use app\service\Foo;
use support\Request;

class IndexController
{
    public function index(Request $request)
    {
        $foo = new Foo(); // Ở đây giả sử có một lớp Foo
        return response($foo->sayHello());
    }
}

Nếu bạn muốn một thể hiện của lớp được tái sử dụng, bạn có thể lưu lớp vào thuộc tính tĩnh của lớp hoặc thuộc tính của đối tượng có vòng đời dài (như bộ điều khiển), hoặc cũng có thể sử dụng phương thức get của Container để khởi tạo thể hiện của lớp, ví dụ:

<?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());
    }
}

Phương thức Container::get() được sử dụng để tạo và lưu trữ thể hiện của lớp, lần gọi tiếp theo với cùng một tham số sẽ trả về thể hiện lớp đã được tạo trước đó.

Lưu ý
Container::get() chỉ có thể khởi tạo các thể hiện không có tham số khởi tạo. Container::make() có thể tạo ra các thể hiện với tham số hàm khởi tạo, nhưng khác với Container::get(), Container::make() sẽ không tái sử dụng thể hiện, nghĩa là ngay cả với cùng một tham số, Container::make() vẫn luôn trả về một thể hiện mới.

Về rò rỉ bộ nhớ

Trong hầu hết các trường hợp, mã nghiệp vụ của chúng tôi sẽ không xảy ra rò rỉ bộ nhớ (rất ít người dùng phản hồi về việc xảy ra rò rỉ bộ nhớ), chúng tôi chỉ cần chú ý một chút để không để dữ liệu mảng có vòng đời dài không mở rộng vô hạn. Vui lòng tham khảo mã sau:

<?php
namespace app\controller;

use support\Request;

class FooController
{
    // Thuộc tính mảng
    public $data = [];

    public function index(Request $request)
    {
        $this->data[] = time();
        return response('hello index');
    }

    public function hello(Request $request)
    {
        return response('hello webman');
    }
}

Bộ điều khiển mặc định có vòng đời dài (trừ khi kiểm soát việc tái sử dụng bộ điều khiển), cũng như thuộc tính mảng $data của bộ điều khiển cũng có vòng đời dài, với các yêu cầu foo/index gia tăng liên tục, số lượng phần tử trong mảng $data ngày càng nhiều dẫn đến rò rỉ bộ nhớ.

Thông tin liên quan thêm xin vui lòng tham khảo Rò rỉ bộ nhớ