Khóa hợp tác Locker

Locker là một loại khóa trong bộ nhớ, được sử dụng để đồng bộ hóa giữa các hợp tác, thường được sử dụng để xếp hàng truy cập vào một tài nguyên quan trọng nào đó, chẳng hạn như một thành phần cơ sở dữ liệu không có kết nối pool, thì có thể sử dụng Locker để xếp hàng sử dụng thành phần đó, tránh việc nhiều hợp tác cùng sử dụng một tài nguyên kết nối dẫn đến dị thường dữ liệu.

Ghi chú
Tính năng này yêu cầu workerman>=5.1.0

Lưu ý

  • Locker hỗ trợ Swoole/Swow/Fiber/Select/Event
  • Locker được sử dụng để xếp hàng truy cập độc quyền vào một tài nguyên giữa các hợp tác trong cùng một tiến trình, các tiến trình không ảnh hưởng lẫn nhau
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Coroutine\Locker;
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) {
    static $redis;
    if (!$redis) {
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
    }
    // Tránh nhiều hợp tác cùng sử dụng một kết nối, xảy ra lỗi tương tự như "Socket#10 has already been bound to another coroutine"
    Locker::lock('redis');
    $time = $redis->time();
    Locker::unlock('redis');
    $connection->send(json_encode($time));
};

Worker::runAll();

Giải thích giao diện

interface LockerInterface
{
    /**
     * Để khóa
     */
    public static function lock(string $key): bool

    /**
     * Để mở khóa
     */
    public static function unlock(string $key): bool
}