Locker โคอเรนล็อค

Locker เป็นล๊อคในหน่วยความจำที่ใช้สำหรับการซิงโครไนซ์ระหว่างโคอเรน ซึ่งมักจะใช้ในการจัดคิวเพื่อเข้าถึงทรัพยากรวิกฤตชนิดหนึ่ง เช่น หากมีส่วนประกอบฐานข้อมูลที่ไม่มีการทำคอนเนคชันพูล ก็สามารถใช้ Locker เพื่อจัดคิวสำหรับการใช้ส่วนประกอบนั้น เพื่อหลีกเลี่ยงข้อผิดพลาดของข้อมูลที่เกิดจากการใช้ทรัพยากรการเชื่อมต่อเดียวกันจากโคอเรนหลายตัวพร้อมกัน

คำแนะนำ
คุณสมบัตินี้ต้องการ workerman>=5.1.0

หมายเหตุ

  • Locker รองรับ Swoole/Swow/Fiber/Select/Event-driven
  • 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
}