Channel Kênh Hợp tác

Channel là một cơ chế giao tiếp giữa các hợp tác viên. Một hợp tác viên có thể đưa dữ liệu vào kênh, trong khi một hợp tác viên khác có thể rút dữ liệu từ đó, từ đó đạt được đồng bộ và chia sẻ dữ liệu giữa các hợp tác viên.

Mẹo
Tính năng này yêu cầu workerman>=5.1.0

Lưu ý

  • Tự động hỗ trợ Swoole/Swow/Fiber/Select/Event ở lớp dưới
  • Khi sử dụng Select/Event, không hỗ trợ tham số timeout cho pop/push
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Coroutine\Channel;
use Workerman\Coroutine;
use Workerman\Events\Swoole;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';

// Http Server
$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) {
    $channel = new Channel(2);
    Coroutine::create(function () use ($channel) {
        $channel->push('Nhiệm vụ 1 đã hoàn thành');
    });
    Coroutine::create(function () use ($channel) {
        $channel->push('Nhiệm vụ 2 đã hoàn thành');
    });
    $result = [];
    for ($i = 0; $i < 2; $i++) {
        $result[] = $channel->pop();
    }
    $connection->send(json_encode($result)); // Phản hồi: ["Nhiệm vụ 1 đã hoàn thành","Nhiệm vụ 2 đã hoàn thành"]
};
Worker::runAll();

Giải thích giao diện

interface ChannelInterface
{
    /**
     * Đưa dữ liệu vào kênh, hỗ trợ timeout (đơn vị giây), timeout trả về false
     */
    public function push(mixed $data, float $timeout = -1): bool;

    /**
     * Rút dữ liệu từ kênh, hỗ trợ timeout (timeout đơn vị giây), timeout trả về false
     */
    public function pop(float $timeout = -1): mixed;

    /**
     * Lấy chiều dài dữ liệu trong kênh
     */
    public function length(): int;

    /**
     * Lấy dung lượng của kênh
     */
    public function getCapacity(): int;

    /**
     * Có tiêu thụ hay không, tức là có hợp tác viên nào đang chờ pop dữ liệu
     */
    public function hasConsumers(): bool;

    /**
     * Có sản xuất hay không, tức là có hợp tác viên nào đang chờ push dữ liệu vào kênh
     */
    public function hasProducers(): bool;

    /**
     * Đóng kênh
     */
    public function close(): void;

}