Join 4,000+ others and never miss out on new tips, tutorials, and more.
Latest version:
pecl install openswoole-25.2.0 | composer require openswoole/core:22.1.5
Atomic can be used for inter-process variable synchronization.
The integer variable defined with Atomic allows multiple processes access and update it. It is implemented based on CPU atomic instructions. You can use it to implement a high performance counter service with multiple Worker.
The underlayer implementation is CAS: Compare-and-swap (CAS) is an atomic instruction used in multi-threading to achieve synchronization. It compares the contents of a memory location with a given value and, only if they are the same, modifies the contents of that memory location to a new given value.
OpenSwoole\Atomic->__constructOpenSwoole\Atomic\addOpenSwoole\Atomic\subOpenSwoole\Atomic\getOpenSwoole\Atomic\setOpenSwoole\Atomic\waitOpenSwoole\Atomic\wakeupOpenSwoole\Atomic\cmpsetOpenSwoole\Atomic\Long->__constructOpenSwoole\Atomic\Long\addOpenSwoole\Atomic\Long\subOpenSwoole\Atomic\Long\getOpenSwoole\Atomic\Long\setOpenSwoole\Atomic\Long\cmpsetAtomic variables have to created before Swoole\Server->start. Then you can access and update it within Worker.Atomic within server callbacks like request, receive etc.new OpenSwoole\Atomic\Long to create Int64 type.wait and wakeup method is not supported for OpenSwoole\Atomic\Long<?php
$counter = new OpenSwoole\Atomic(123);
echo $counter->add(12)."\n";
echo $counter->sub(11)."\n";
echo $counter->cmpset(122, 999)."\n";
echo $counter->cmpset(124, 999)."\n";
echo $counter->get()."\n";
<?php
$counter = new OpenSwoole\Atomic();
$server = new OpenSwoole\Server('127.0.0.1', '9501');
$server->set([
'worker_num' => 1,
'log_file' => '/dev/null'
]);
$server->on("start", function ($server) use ($counter) {
if ($counter->add() == 10) {
$server->shutdown();
}
});
$server->on("receive", function () use ($counter) {
$counter->add();
});
$server->start();