$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.
value lives in shared memory; every worker + every tab sees the same number
// 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];
});