Counter: lock-free atomic int

$counter->increment() wraps OpenSwoole\Atomic — lock-free, cross-worker, no syscall per bump. Click +1. Open this URL in another window/tab and click +1 there: every tab updates live via a WebSocket broadcast. Reset zeros the counter for everyone.

Live counter (shared across tabs)

0

value lives in shared memory; every worker + every tab sees the same number

connecting…

How it works

// route/learn.php — boot
$wsCounterDemo = new Counter(0);
Store::make('ws_counter_demo_clients', 4096, [...]);

// WebSocket endpoint — track open fds
$app->ws('/ws/counter-demo',
    onOpen: function ($server, $request) use ($wsCounterDemo) {
        Store::set('ws_counter_demo_clients', (string)$request->fd, [...]);
        $server->push($request->fd, json_encode(['value' => $wsCounterDemo->get()]));
    },
    /* ... onClose, onMessage ... */
);

// Bump endpoint — increment + broadcast to every connected fd
$app->route('/api/learn/demo/counter-bump', ['methods' => ['POST']], function () use ($wsCounterDemo) {
    $new = $wsCounterDemo->increment();
    ws_counter_demo_broadcast((int)$new);
    return ['value' => (int)$new];
});