Context Ngữ cảnh hợp tác

Ngữ cảnh được sử dụng để lưu trữ và truyền đạt thông tin ngữ cảnh trong các hợp tác, chẳng hạn như kết nối cơ sở dữ liệu, thông tin người dùng, v.v. Mỗi hợp tác có ngữ cảnh riêng của nó, ngữ cảnh giữa các hợp tác khác nhau là độc lập.

Lưu ý
Kiểu lái tự động nhận diện ở tầng dưới, chỉ hỗ trợ các lái Swoole/Swow/Fiber

Gợi ý
Tính năng này yêu cầu workerman>=5.1.0

<?php

use Workerman\Connection\TcpConnection;
use Workerman\Coroutine;
use Workerman\Coroutine\Context;
use Workerman\Events\Swoole;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:8001');

$worker->eventLoop = Swoole::class; // Hoặc Swow::class hoặc Fiber::class

$worker->onMessage = function (TcpConnection $connection, Request $request) {
    // Thiết lập dữ liệu ngữ cảnh trong hợp tác hiện tại
    Context::set('user_info', ['id' => 1, 'name' => 'name']);
    // Tạo mới một hợp tác
    Coroutine::create(function () use ($connection) {
        // Dữ liệu ngữ cảnh giữa các hợp tác là độc lập, vì vậy trong hợp tác mới sẽ lấy được giá trị null
        $userInfo = Context::get('user_info');
        var_dump($userInfo); // Xuất ra null
    });
    // Lấy dữ liệu ngữ cảnh của hợp tác hiện tại
    $userInfo = Context::get('user_info'); // Nhận được ['id' => 1, 'name' => 'name']
    $connection->send(json_encode($userInfo));
};

Worker::runAll();

Mô tả giao diện

interface ContextInterface
{
    /**
     * Lấy giá trị trong ngữ cảnh
     */
    public static function get(string $name, mixed $default = null): mixed;

    /**
     * Thiết lập giá trị trong ngữ cảnh
     */
    public static function set(string $name, mixed $value): void;

    /**
     * Kiểm tra xem một giá trị với tên chỉ định có tồn tại trong ngữ cảnh hay không
     */
    public static function has(string $name): bool;

    /**
     * Đặt lại ngữ cảnh của hợp tác hiện tại
     */
    public static function reset(?ArrayObject $data = null): void;

    /**
     * Hủy ngữ cảnh
     */
    public static function destroy(): void;

}