Khởi tạo kinh doanh

Đôi khi chúng ta cần thực hiện một số bước khởi tạo kinh doanh sau khi tiến trình khởi động, bước khởi tạo này chỉ được thực hiện một lần trong vòng đời của tiến trình, chẳng hạn như thiết lập một bộ định thời sau khi tiến trình khởi động, hoặc khởi tạo kết nối cơ sở dữ liệu, v.v. Dưới đây chúng tôi sẽ giải thích về điều này.

Nguyên lý

Theo mô tả trong quy trình thực thi, webman sẽ tải các lớp được thiết lập trong config/bootstrap.php (bao gồm config/plugin/*/*/bootstrap.php) và thực thi phương thức start của lớp sau khi tiến trình khởi động. Chúng ta có thể thêm mã kinh doanh vào phương thức start để hoàn thành các hoạt động khởi tạo kinh doanh sau khi tiến trình khởi động.

Quy trình

Giả sử chúng ta muốn tạo một bộ định thời, dùng để định kỳ báo cáo mức sử dụng bộ nhớ hiện tại của tiến trình, lớp này có tên là MemReport.

Thực thi lệnh

Thực thi lệnh php webman make:bootstrap MemReport để tạo tệp khởi tạo app/bootstrap/MemReport.php

Lưu ý
Nếu webman của bạn chưa cài đặt webman/console, hãy thực hiện lệnh composer require webman/console để cài đặt.

Chỉnh sửa tệp khởi tạo

Chỉnh sửa app/bootstrap/MemReport.php, nội dung tương tự như sau:

<?php

namespace app\bootstrap;

use Webman\Bootstrap;

class MemReport implements Bootstrap
{
    public static function start($worker)
    {
        // Có phải môi trường dòng lệnh không ?
        $is_console = !$worker;
        if ($is_console) {
            // Nếu bạn không muốn môi trường dòng lệnh thực hiện khởi tạo này, hãy trả về ở đây
            return;
        }

        // Thực hiện mỗi 10 giây một lần
        \Workerman\Timer::add(10, function () {
            // Để dễ dàng trình bày, chúng tôi sử dụng đầu ra thay cho quá trình báo cáo
            echo memory_get_usage() . "\n";
        });

    }

}

Lưu ý
Khi sử dụng dòng lệnh, khung cũng sẽ thực hiện phương thức start được cấu hình trong config/bootstrap.php, chúng ta có thể thông qua việc kiểm tra $worker có phải là null hay không để xác định liệu đó có phải là môi trường dòng lệnh hay không, từ đó quyết định xem có thực hiện mã khởi tạo kinh doanh hay không.

Cấu hình khi khởi động tiến trình

Mở config/bootstrap.php và thêm lớp MemReport vào các hạng mục khởi động.

return [
    // ...bỏ qua các cấu hình khác ở đây...

    app\bootstrap\MemReport::class,
];

Như vậy, chúng ta đã hoàn thành quy trình khởi tạo kinh doanh.

Giải thích bổ sung

Phương thức start được cấu hình trong config/bootstrap.php cũng sẽ được thực hiện sau khi tiến trình tùy chỉnh khởi động, chúng ta có thể sử dụng $worker->name để xác định tiến trình hiện tại là loại nào, và tiếp theo có thể sử dụng $worker->id để xác định tiến trình nào, từ đó quyết định xem có thực hiện mã khởi tạo kinh doanh của bạn trong tiến trình đó hay không, chẳng hạn như chúng ta chỉ cần thực hiện trong tiến trình 0 của webman, thì nội dung của MemReport.php sẽ như sau:

<?php

namespace app\bootstrap;

use Webman\Bootstrap;

class MemReport implements Bootstrap
{
    public static function start($worker)
    {
        // Có phải môi trường dòng lệnh không ?
        $is_console = !$worker;
        if ($is_console) {
            // Nếu bạn không muốn môi trường dòng lệnh thực hiện khởi tạo này, hãy trả về ở đây
            return;
        }

        // Chỉ thực hiện trong tiến trình 0 của webman
        if ($worker->name != 'webman' && $worker->id != 0) {
            return;
        }

        // Thực hiện mỗi 10 giây một lần
        \Workerman\Timer::add(10, function () {
            // Để dễ dàng trình bày, chúng tôi sử dụng đầu ra thay cho quá trình báo cáo
            echo memory_get_usage() . "\n";
        });

    }

}