[踩坑实践] Swoole dispatch_func 自定义分配worker 进程
发表于|更新于|踩坑教训
swoole 的分配worker 进程方式有很多 轮询 争抢 空闲 等等.
因为业务的需求, 我们的服务需要根据用户uid 分配 worker 进程做到用户操作排队.
dispatch_func 自定义分配worker进程方法, 真实让我又爱又恨.
好处不多说 满足业务需求, 从此实现用户操作 单进程排队的效果.
坑也不少, 第一个踩的坑 空包处理 return -1, 没想到结果非常惨 Error: Too many open files[24]
可以看下以前的文章 [Error: Too many open files[24]][1]
今天有一个坑 换了个业务 但也需要用 dispatch_func
心跳包 或 keepalive 两种检测连接方法都失效了….
原因还是 return 负数 我 return -100 仍然不给力 ….
改成随便一个worker 就 ok 了 棒棒哒~
文章作者: Leon
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Leon!
相关推荐
2019-12-16
[踩坑] Swoole 4.2.11低版本不抛错 执行不同静态方法一定次数 进程异常退出 `PHP Deprecated: Non-static method `
很久之前运维同学通知我 线上服务器 产生大量 core.15…. 文件 磁盘快占满了 我没在意.今天发现线上有个服务的否个进程运行出了问题.找了一下午问题. 都没找明白 . 想起每次找swoole官方回复都是 版本太低, 先升级到最新版本. 抱着试试看的心态. 升级swoole 到 4.4.12 在运行发现如下错误: PHP Deprecated: Non-static method Controller\Test::func() should not be called statically in /data/application/QuantPlatform/script/src/Controller/Test.php on line 41PHP Deprecated: Swoole\Timer::swoole_timer_tick() expects parameter 2 to be a valid callback, non-static method Controller\Test::func() should not be called statically...
2020-04-03
Swoole WebSoctet 使用 zlib 压缩之 PHP 与 pako.js
一些理论知识先说一下deflate算法吧,deflate是zip压缩文件的默认算法, 其实deflate现在不光用在zip文件中, 在7z, xz等其他的压缩文件中都用, 实际上deflate只是一种压缩数据流的算法,任何需要流式压缩的地方都可以用。 也就是说 zlib 格式, gzip 格式,是文件格式,deflate 是这些文件格式使用的压缩算法。 传输方式 deflate 压缩后是二进制,通常有两种传输方式: 二进制 Base64编码 二进制PHP // 压缩,注意:其中 ZLIB_ENCODING_DEFLATE 参数是不能少的$data = gzdeflate(json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), 6, ZLIB_ENCODING_DEFLATE);// 使用 swoole 以二进制的方式发送$webSocket->push($fd, $data, WEBSOCKET_OPCODE_BINARY); JavaScript // 消息事件ws.onmess...
2018-08-23
Swoole 日志 部分代码
/** * @desc work进程内日志 仅限work 进程内使用 * @author lbf * @param $msg * @param string $name *------------------------------------------------------ */public static function Wlog($msg, $name = Log::MATCH){ if (!Main::WRITE_DEBUG_LOG && $name == Log::DEBUG) return; $name = $name == Log::DEBUG ? Log::MATCH : $name; $name = $name == Log::SQL ? Log::MATCH : $name; $str = ''; if (is_array($msg)) { foreach ($msg as $key => $val) { if (i...
2020-06-30
一个简陋的 PHP View 适用于Swoole
仅支持 向模板传递变量 /** * 视图 * @param array $params 模板变量 * @param string $method 视图模板 * @return mixed|string */public static function view(array $params = [], $method = ''): string{ // 利用堆栈追踪回溯 $array = debug_backtrace(); $file = $array[0]['file'] ?? ''; $method = $method ?: ($array[1]['function'] ?? ''); $fileDir = rtrim($file, '.php'); $viewFile = str_replace('Controller', 'View', $fileDir . DS...
2023-12-21
Swoole 抛错 ; WARNING timer_callback (ERRNO 9007): No idle worker is available
根据提供的错误消息,这是一个关于Swoole服务的错误。错误消息中的WARNING timer_callback (ERRNO 9007): No idle worker is available表示没有空闲的工作进程可用。 这种情况通常发生在Swoole服务的工作进程池已满,无法处理更多的请求或任务。当所有工作进程都在忙于处理请求时,新的请求将无法得到处理,从而导致该警告出现。 解决该问题的方法可以考虑以下几点: 增加工作进程数:可以通过增加Swoole服务的工作进程数来扩展处理能力。可以在Swoole的配置文件或代码中找到关于工作进程数的设置项,并适当增加工作进程的数量。 优化代码逻辑:检查Swoole服务中的代码逻辑,确保没有长时间阻塞的操作或耗时过长的任务。如果存在耗时操作,可以考虑使用异步或并发处理方式,以充分利用工作进程资源。 调整资源限制:检查服务器的资源限制,例如文件句柄数、内存限制等。确保这些限制不会导致工作进程无法创建或执行。 监控和调优:使用合适的监控工具来监视Swoole服务的性能指标,例如请求处理速度、工作进程状态等。根据监控结果进行调优,找出性能...
2024-04-05
Swoole Http 服务 Woker子进程bug 导致 Master 进程内存溢出导致
今天生产突然遇到一个问题. 一个内部的http 接口服务. master 进程内存溢出, 快速增长内存 问题. 想了很多 也看了很多日志. 发现服务器 php_error.log 在提示内存溢出写入日志内存失败. [05-Apr-2024 20:56:09 Asia/Shanghai] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20382400 bytes) in FileLog.php on line 217 通过调试发现和 大佬们说的一样: 主进程内存占用过高一般是有大量数据未发送保存在内存缓存区中,请开启心跳检测功能,剔除坏连接。 诶 我们这个问题还是 日志写的太大了. 导致 worker进程直接 Fatal 死掉了. Master 不主动释放, 日积月累服务器内存写满.
评论
公告
记录技术实践,分享学习与思考。



