场景: 我们系统每个用户需要通过ws实时同步他们在某第三方平台上的数据。会有新用户产生,产生新用户时动态给他建立一个连接。
我有如下方案,都无法满足需求
方案1:
写一个workerman脚本BTrade.php ,接收cli参数 用户id,以id作为worker的name与id, 如:“php BTrade.php start 1272”
问题: 在命令行执行一次脚本后,再次执行“php BTrade.php start 1273” 会报错 “Workerman[ BTrade.php] already running”
疑问:是不是一个脚本只能存在一个进程?
方案2
在一个脚本里new多个worker出来,每个worker维护一个用户的连接。如果有新用户来了,则重启脚本读取新的用户列表,再建立连接
代码:
$accounts = $pR->get($aKey); //取所有用户
foreach ($accounts as $account){
$aM = new UserAccount();
$account = $aM->getAccount($accountId);
var_dump($account['id']);
$worker = new Worker();
$worker->name = 'ws_trade_sync_'.md5($account['id']).'_usdt';
$worker->id = $account['id'];
// 进程启动时
$worker->onWorkerStart = function ($worker) use (
$key,
$account,
$queueTmp
//下面省略....
}
问题:restart脚本虽然能拿到最新用户,但是会导致已有的连接断开 reload能保证不断开,但是不会执行 $accounts = $pR->get($aKey); 获取所有用户?
希望有大佬能指点下是不是我的使用方式是错误的?或者谁能提供下解决思路。十分感谢!
方案3:一个用户一个脚本,每个人一个进程? 这样感觉好low,而且需要不停的动态创建新脚本文件。
希望大佬给与解答,再次感谢!
代码类似这样,原理是定时从redis获取所有账户数据,然后建立连接,建立连接时判断这个用户的连接是否已经存在,不存在才建立。
代码未测试,大致逻辑写出来了,你调试下应该就能用了
给你提供另一个思路,用GatewayWorker来搭一个服务端,每个用户作为客户端进行链接,用id来标识各个客户,针对性的给他们推送数据。
Events.php里OnMessage代码如下.