Locker কোঅপারেটর লক

Locker একটি মেমরি লক, যা কোঅপারেটরের মধ্যে একইসূত্রে সমন্বয়ের জন্য ব্যবহৃত হয়, যা সাধারণত কোঅপারেটরগুলির মধ্যে কোনও ক্রিটিকাল রিসোর্স অ্যাক্সেসের জন্য লাইনওয়ার্ক করার জন্য ব্যবহৃত হয়, যেমন যদি কোনও ডাটাবেস কম্পোনেন্ট সংযোগ পুল না করে, তাহলে Locker ব্যবহার করে সেই কম্পোনেন্টে অ্যাক্সেস করতে লাইনওয়ার্ক করা যেতে পারে, যাতে একাধিক কোঅপারেটরের একই সংযোজক সম্পদ ব্যবহার করার ফলে তথ্যের অস্বাভাবিকতা এড়ানো যায়।

টিপস
এই বৈশিষ্ট্যটির জন্য workerman>=5.1.0 প্রয়োজন

লক্ষ্য

  • Locker Swoole/Swow/Fiber/Select/Event-চালিত সমর্থন করে
  • Locker একই প্রক্রিয়ার বিভিন্ন কোঅপারেটরের মধ্যে লাইনওয়ার্ককে মিউটেক্স অ্যাক্সেস করার জন্য ব্যবহৃত হয়, প্রক্রিয়া এবং প্রক্রিয়ার মধ্যে পারস্পরিক প্রভাব নেই
<?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; // অথবা Swow::class অথবা Fiber::class

$worker->onMessage = function (TcpConnection $connection, Request $request) {
    static $redis;
    if (!$redis) {
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
    }
    // একাধিক কোঅপারেটরের একই সংযোগ ব্যবহার এড়াতে, যেমন "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();

ইন্টারফেস বর্ণনা

interface LockerInterface
{
    /**
     * লক করা
     */
    public static function lock(string $key): bool

    /**
     * আনলক করা
     */
    public static function unlock(string $key): bool
}