Files
CRM-IKZ/ws-server.php
2026-07-14 08:19:56 +04:00

73 lines
1.7 KiB
PHP

<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use Workerman\Timer;
use Workerman\Worker;
$wsWorker = new Worker('websocket://0.0.0.0:2346');
$wsWorker->count = 1;
$connections = [];
$queueFile = __DIR__ . '/storage/ws/events.log';
$offsetFile = __DIR__ . '/storage/ws/events.offset';
$wsWorker->onConnect = function ($connection) use (&$connections) {
$connections[$connection->id] = $connection;
};
$wsWorker->onClose = function ($connection) use (&$connections) {
unset($connections[$connection->id]);
};
$wsWorker->onWorkerStart = function () use (&$connections, $queueFile, $offsetFile) {
if (!is_dir(dirname($queueFile))) {
mkdir(dirname($queueFile), 0775, true);
}
if (!file_exists($queueFile)) {
touch($queueFile);
}
if (!file_exists($offsetFile)) {
file_put_contents($offsetFile, '0');
}
Timer::add(1, function () use (&$connections, $queueFile, $offsetFile) {
clearstatcache(true, $queueFile);
$size = filesize($queueFile);
$offset = (int) @file_get_contents($offsetFile);
if ($size === false || $size <= $offset) {
return;
}
$fp = fopen($queueFile, 'r');
if (!$fp) {
return;
}
fseek($fp, $offset);
while (($line = fgets($fp)) !== false) {
$line = trim($line);
if ($line === '') {
continue;
}
foreach ($connections as $connection) {
$connection->send($line);
}
}
$newOffset = ftell($fp);
fclose($fp);
file_put_contents($offsetFile, (string) $newOffset, LOCK_EX);
});
};
Worker::runAll();