قفل 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
}