CRMEB 中的 Workerman 长连接服务:从异步网络编程到即时通讯实战

发布时间:2026/10/15 1:53:02
CRMEB 中的 Workerman 长连接服务:从异步网络编程到即时通讯实战 后端电商前端【免费下载链接】CRMEBCRMEB开源商城免费开源多语言商城系统Tp6框架商城系统可商用包含小程序商城、H5商城、公众号商城、PC商城、App支持分销、拼团、砍价、秒杀、优惠券、积分、会员等级、小程序直播、页面DIY前后端分离方便二开更有详细使用文档、接口文档、数据字典、二开文档/视频教程欢迎大家提出宝贵意见和建议项目地址https://gitcode.com/gh_mirrors/cr/CRMEB点击查看免费下载导读本文以 CRMEB 仓库中内置的 Workerman 官方 README 为核心骨架系统讲解 Workerman 异步事件驱动框架的环境要求、安装方式、六大服务搭建WebSocket/HTTP/WebServer/TCP/SSL/自定义协议、Timer 定时器、AsyncTcpConnection 异步连接以及 ReactPHP 生态集成并结合 CRMEB 的think workerman命令、config/workerman.php配置与crmeb/services/workerman源码说明后台管理员消息通知、H5 客服聊天、新订单弹窗等长连接场景的真实落地方式。读完你将掌握 Workerman 的完整入门到进阶用法并能看懂 CRMEB 长连接服务的进程结构与消息分发链路。一、Workerman 是什么异步事件驱动的 PHP 网络框架Workerman 是一个纯 PHP 实现的异步事件驱动网络框架用于快速构建高性能、可扩展的网络应用。它不依赖 PHP-FPM/Nginx而是自己常驻内存监听端口、处理并发连接因此天然适合聊天、实时推送、在线客服、物联网网关等长连接场景。在 CRMEB 项目中Workerman 承担三类核心长连接职责见 config/workerman.php 顶部注释channel内部通讯系统程序收到消息后通过此端口推送给对应客户/客服以及后台新订单弹窗提醒admin后台通知新订单、新退款单发送消息给程序后台消息通知chat客服聊天客户或客服发送消息给程序客服消息通知。从依赖角度当前仓库锁定的是 Workerman 3.5.19 版本见 Worker.php 中的const VERSION 3.5.19。其内部结构分为四层事件循环层Workerman\Events支持 Select/libevent/Event/Swoole/React 等、连接层Workerman\Connection、协议层Workerman\Protocols内置 HTTP/WebSocket/Text/Frame以及核心的 Worker.php 进程容器。核心特性支持 HTTP、WebSocket、SSL 及任意自定义协议支持多进程部署count属性设置进程数多进程间通过 Channel 组件通信支持 libevent、HHVM、ReactPHP 等事件循环扩展完全常驻内存无 PHP 请求生命周期开销。二、环境要求与安装Workerman 官方 README 明确给出的运行前提如下项目要求PHP 版本PHP 5.3 或更高操作系统POSIX 兼容系统Linux、macOS、BSDPHP 扩展POSIX 与 PCNTL 扩展需要说明的是这里“PHP 5.3”是 Workerman 库自身的最低要求而 CRMEB v5 后端运行环境要求PHP 7.1–7.4见 crmeb/README.md实际部署时以 CRMEB 的要求为准。安装方式Composercomposer require workerman/workerman当前仓库中该依赖已通过 Composer 安装至crmeb/vendor/workerman/workerman其 composer.json 声明了 PSR-4 自动加载Workerman\→./并建议安装ext-event以获得更好的性能。若要使用 ReactPHP 生态还需按需安装react/mysql、clue/redis-react、react/dns、react/http-client、react/zmq、react/stomp等包。Windows 并非推荐运行环境php think workerman start --d等守护进程模式依赖 POSIX 信号机制在 Windows 下需要分三步分别启动内部通讯、admin、chat 三个服务详见 crmeb/README.md。三、五种基础服务搭建实战Workerman 统一以「协议 URI 回调」的方式组织代码new Worker(协议://监听地址:端口)然后给实例挂上onConnect/onMessage/onClose等回调最后调用Worker::runAll()启动。以下示例均可在独立start.php中直接运行。1. WebSocket 服务器?php require_once __DIR__ . /vendor/autoload.php; use Workerman\Worker; // 创建 Websocket 服务器 $ws_worker new Worker(websocket://0.0.0.0:2346); // 4 个进程 $ws_worker-count 4; // 新连接到来时触发 $ws_worker-onConnect function($connection) { echo New connection\n; }; // 收到数据时触发 $ws_worker-onMessage function($connection, $data) { // 给客户端回送 hello $data $connection-send(hello . $data); }; // 连接关闭时触发 $ws_worker-onClose function($connection) { echo Connection closed\n; }; // 运行 Worker Worker::runAll();要点解读count决定启动的子进程数多进程可显著提升并发吞吐但 CRMEB 中 admin/chat 均配置为1见下文因为需要依靠单进程内存中的$user映射表维护“用户 ID → 连接”关系三个回调各自独立对应 Worker.php 中onWorkerStart、onConnect、onMessage、onClose、onError、onBufferFull、onBufferDrain等公开属性回调。2. HTTP 服务器Workerman 的 HTTP 协议处理器会解析请求并填充 PHP 超全局变量因此在onMessage中可以直接使用$_GET、$_POST、$_COOKIE、$_SESSION、$_SERVER、$_FILESrequire_once __DIR__ . /vendor/autoload.php; use Workerman\Worker; // #### http worker #### $http_worker new Worker(http://0.0.0.0:2345); // 4 个进程 $http_worker-count 4; // 收到数据时触发 $http_worker-onMessage function($connection, $data) { var_dump($_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER, $_FILES); // 给客户端回送数据 $connection-send(hello world \n); }; // 运行所有 worker Worker::runAll();从源码看Http.php 支持GET/POST/PUT/DELETE/HEAD/OPTIONS六种方法input()负责判断请求是否完整依据\r\n\r\n与Content-Length计算包长度并校验包大小上限maxPackageSize不合法请求直接返回400 Bad Request。3. WebServer静态网站服务器Workerman\WebServer是 Worker 的子类基于 HTTP 协议封装了虚拟主机与静态文件服务能力require_once __DIR__ . /vendor/autoload.php; use Workerman\WebServer; use Workerman\Worker; // WebServer $web new WebServer(http://0.0.0.0:80); // 4 个进程 $web-count 4; // 设置域名对应的站点根目录 $web-addRoot(www.your_domain.com, /your/path/Web); $web-addRoot(www.another_domain.com, /another/path/Web); // 运行所有 worker Worker::runAll();从 WebServer.php 的实现可见addRoot()将“域名 → 站点根目录”写入$serverRoot映射进程启动时若映射为空会直接报错退出server root not set同时初始化mime.types表见Protocols/Http/mime.types。4. TCP 服务器最底层的 TCP 服务器是理解 Workerman 数据流的起点——所有上层协议HTTP/WebSocket/Text最终都是对 TCP 字节流的input/decode/encode拆包封包require_once __DIR__ . /vendor/autoload.php; use Workerman\Worker; // #### 创建 socket 并监听 1234 端口 #### $tcp_worker new Worker(tcp://0.0.0.0:1234); // 4 个进程 $tcp_worker-count 4; // 新连接到来时触发 $tcp_worker-onConnect function($connection) { echo New Connection\n; }; // 收到数据时触发 $tcp_worker-onMessage function($connection, $data) { $connection-send(hello $data \n); }; // 连接关闭时触发 $tcp_worker-onClose function($connection) { echo Connection closed\n; }; Worker::runAll();5. 开启 SSLwss:// / https://通过传入 stream context 再切换传输层transport ssl即可将服务升级为加密通道?php require_once __DIR__ . /vendor/autoload.php; use Workerman\Worker; // SSL context $context array( ssl array( local_cert /your/path/of/server.pem, local_pk /your/path/of/server.key, verify_peer false, ) ); // 创建带 SSL context 的 Websocket 服务器 $ws_worker new Worker(websocket://0.0.0.0:2346, $context); // 启用 SSL。WebSocketSSL 即 Secure WebSocketwss:// // https 等也采用类似方式 $ws_worker-transport ssl; $ws_worker-onMessage function($connection, $data) { $connection-send(hello . $data); }; Worker::runAll();CRMEB 在 Workerman.php 命令 中完整复刻了这一模式从系统配置读取证书文件路径wssLocalCert/wssLocalpk组装local_cert、local_pk、verify_peer false的 SSL context再按需设置transport ssl。当前仓库中wss_open被固定为0即默认走明文 websocket开启 WSS 需自行申请域名证书。四、自定义协议Text \n 的完整范例当内置协议不满足业务时可以自定义协议。协议类只需实现三个静态方法Workerman 会通过ProtocolInterface见 Protocols/ProtocolInterface.php调用它们input($recv_buffer)判断缓冲区中是否已有一个完整包返回包长度不足返回 0decode($recv_buffer)把原始字节解析为业务数据encode($data)把业务数据编码为发送字节流。以下示例定义了一个「每包以\n结尾」的文本协议Protocols/MyTextProtocol.phpnamespace Protocols; /** * 用户自定义协议 * 格式 Text\n */ class MyTextProtocol { public static function input($recv_buffer) { // 查找 \n 首次出现的位置 $pos strpos($recv_buffer, \n); // 尚未收到完整包返回 0 表示无法计算包长度 if($pos false) { return 0; } // 返回包长度 return $pos1; } public static function decode($recv_buffer) { return trim($recv_buffer); } public static function encode($data) { return $data.\n; } }在 Worker 中以MyTextProtocol://前缀注册require_once __DIR__ . /vendor/autoload.php; use Workerman\Worker; // #### MyTextProtocol worker #### $text_worker new Worker(MyTextProtocol://0.0.0.0:5678); $text_worker-onConnect function($connection) { echo New connection\n; }; $text_worker-onMessage function($connection, $data) { $connection-send(hello world \n); }; $text_worker-onClose function($connection) { echo Connection closed\n; }; // 运行所有 worker Worker::runAll();与之对照内置的 Websocket.php 的input()就是逐字节解析帧头FIN、掩码、opcode、长度握手未完成时进入dealHandshake并校验客户端帧必须带掩码frame not masked直接断开Frame.php 则以 4 字节大端长度前缀拆包。理解这三个方法就掌握了 Workerman 一切协议的底层逻辑。五、Timer 定时器进程内毫秒级任务调度Timer 是 Workerman 内置的轻量定时器适合做心跳检测、轮询清理等进程内任务require_once __DIR__ . /vendor/autoload.php; use Workerman\Worker; use Workerman\Lib\Timer; $task new Worker(); $task-onWorkerStart function($task) { // 间隔 2.5 秒 $time_interval 2.5; $timer_id Timer::add($time_interval, function() { echo Timer run\n; } ); }; // 运行所有 worker Worker::runAll();源码层面Lib/Timer.phpTimer::add($time_interval, $func, $args array(), $persistent true)$persistent false时仅执行一次EV_TIMER_ONCE未启用事件扩展时基于pcntl_alarm(1)SIGALRM信号驱动每次 tick 将到期任务执行后按原间隔重新挂入任务表启用 libevent/Event 等扩展时直接委托给事件循环的EV_TIMER通道精度更高Timer::del($timer_id)与Timer::delAll()用于移除定时任务。CRMEB 中的 Timer 应用心跳与超时检测在 WorkermanService.php 与 ChatService.php 中Timer::add(15, ...)每 15 秒扫描全部连接若当前时间 - lastMessageTime 12秒则判定掉线并close(timeout)同时把在线状态写回数据库、广播给客服端。在线状态刷新ChatService每 2 秒统计在线用户与在线客服的 uid 集合将不在线的记录批量置为online 0见 ChatService.php。CRMEB 定时任务命令php think timer start同样基于 Workerman 的 Worker 与 Timer 实现见 crmeb/crmeb/command/Timer.php在onWorkerStart中调用SystemCrontabServices::crontabCommandRun()执行平台配置的定时任务支持-i 0.001自定义执行间隔PID 文件写入runtime/timer.pid。六、AsyncTcpConnection异步客户端连接AsyncTcpConnection让 Workerman 进程既能当服务器也能当异步客户端可主动连接外部 TCP/WebSocket 等服务require_once __DIR__ . /vendor/autoload.php; use Workerman\Worker; use Workerman\Connection\AsyncTcpConnection; $worker new Worker(); $worker-onWorkerStart function() { // 客户端使用 Websocket 协议 $ws_connection new AsyncTcpConnection(ws://echo.websocket.org:80); $ws_connection-onConnect function($connection){ $connection-send(hello); }; $ws_connection-onMessage function($connection, $data){ echo recv: $data\n; }; $ws_connection-onError function($connection, $code, $msg){ echo error: $msg\n; }; $ws_connection-onClose function($connection){ echo connection closed\n; }; $ws_connection-connect(); }; Worker::runAll();从源码看AsyncTcpConnection.php 继承自TcpConnection默认transport tcp、_remotePort 80需要显式调用connect()建立连接并支持tcp/ws/text/frame等协议前缀。这一能力是 CRMEB Channel 组件通信的底层基础之一。七、ReactPHP 生态集成Workerman 的事件循环与 ReactPHP 完全兼容可直接在onWorkerStart中通过Worker::getEventLoop()获取事件循环并创建异步客户端。官方 README 给出了六个组合示例。1. 异步 MySQLcomposer require react/mysql?php require_once __DIR__ . /vendor/autoload.php; use Workerman\Worker; $worker new Worker(tcp://0.0.0.0:6161); $worker-onWorkerStart function() { global $mysql; $loop Worker::getEventLoop(); $mysql new React\MySQL\Connection($loop, array( host 127.0.0.1, dbname dbname, user user, passwd passwd, )); $mysql-on(error, function($e){ echo $e; }); $mysql-connect(function ($e) { if($e) { echo $e; } else { echo connect success\n; } }); }; $worker-onMessage function($connection, $data) { global $mysql; $mysql-query(show databases, function ($command, $mysql) use ($connection) { if ($command-hasError()) { $error $command-getError(); } else { $results $command-resultRows; $fields $command-resultFields; $connection-send(json_encode($results)); } }); }; Worker::runAll();2. 异步 Rediscomposer require clue/redis-react?php require_once __DIR__ . /vendor/autoload.php; use Clue\React\Redis\Factory; use Clue\React\Redis\Client; use Workerman\Worker; $worker new Worker(tcp://0.0.0.0:6161); $worker-onWorkerStart function() { global $factory; $loop Worker::getEventLoop(); $factory new Factory($loop); }; $worker-onMessage function($connection, $data) { global $factory; $factory-createClient(localhost:6379)-then(function (Client $client) use ($connection) { $client-set(greeting, Hello world); $client-append(greeting, !); $client-get(greeting)-then(function ($greeting) use ($connection){ echo $greeting . PHP_EOL; $connection-send($greeting); }); $client-incr(invocation)-then(function ($n) use ($connection){ echo This is invocation # . $n . PHP_EOL; $connection-send($n); }); }); }; Worker::runAll();3. 异步 DNS 解析composer require react/dnsrequire_once __DIR__ . /vendor/autoload.php; use Workerman\Worker; $worker new Worker(tcp://0.0.0.0:6161); $worker-onWorkerStart function() { global $dns; $loop Worker::getEventLoop(); $factory new React\Dns\Resolver\Factory(); $dns $factory-create(8.8.8.8, $loop); }; $worker-onMessage function($connection, $host) { global $dns; $host trim($host); $dns-resolve($host)-then(function($ip) use($host, $connection) { $connection-send($host: $ip); },function($e) use($host, $connection){ $connection-send($host: {$e-getMessage()}); }); }; Worker::runAll();4. 异步 HTTP 客户端composer require react/http-client?php require_once __DIR__ . /vendor/autoload.php; use Workerman\Worker; $worker new Worker(tcp://0.0.0.0:6161); $worker-onMessage function($connection, $host) { $loop Worker::getEventLoop(); $client new \React\HttpClient\Client($loop); $request $client-request(GET, trim($host)); $request-on(error, function(Exception $e) use ($connection) { $connection-send($e); }); $request-on(response, function ($response) use ($connection) { $response-on(data, function ($data) use ($connection) { $connection-send($data); }); }); $request-end(); }; Worker::runAll();5. 异步 ZMQ消息队列composer require react/zmq?php require_once __DIR__ . /vendor/autoload.php; use Workerman\Worker; $worker new Worker(text://0.0.0.0:6161); $worker-onWorkerStart function() { global $pull; $loop Worker::getEventLoop(); $context new React\ZMQ\Context($loop); $pull $context-getSocket(ZMQ::SOCKET_PULL); $pull-bind(tcp://127.0.0.1:5555); $pull-on(error, function ($e) { var_dump($e-getMessage()); }); $pull-on(message, function ($msg) { echo Received: $msg\n; }); }; Worker::runAll();6. 异步 STOMP消息代理协议composer require react/stomp?php require_once __DIR__ . /vendor/autoload.php; use Workerman\Worker; $worker new Worker(text://0.0.0.0:6161); $worker-onWorkerStart function() { global $client; $loop Worker::getEventLoop(); $factory new React\Stomp\Factory($loop); $client $factory-createClient(array(vhost /, login guest, passcode guest)); $client -connect() -then(function ($client) use ($loop) { $client-subscribe(/topic/foo, function ($frame) { echo Message received: {$frame-body}\n; }); }); }; Worker::runAll();八、命令行管理启动、状态、停止与重载Workerman 官方 README 给出了一套进程管理命令在start.php场景下php start.php start # 前台启动 php start.php start -d # 守护进程方式启动 php start.php status # 查看运行状态 php start.php connections # 查看当前连接数 php start.php stop # 停止 php start.php restart # 重启 php start.php reload # 平滑重载仅 reloadable 的进程命令的第一个参数start/-d/status/connections/stop/restart/reload会被映射为内部信号操作。从 Worker.php 的状态常量可见进程存在STATUS_STARTING / STATUS_RUNNING / STATUS_SHUTDOWN / STATUS_RELOADING四种状态。CRMEB 中的命令封装CRMEB 通过 ThinkPHP 6 控制台命令封装了上述能力见 crmeb/README.md# 长连接服务h5 聊天、后台管理员消息通知、新订单弹窗 php think workerman [status] [--d]参数说明statusstart启动/stop关闭/restart重启/status/connections--d守护进程后台方式启动第二个参数server可选admin/chat/channel可只启动其中某一个服务。命令实现位于 crmeb/crmeb/command/Workerman.phpinit()把 ThinkPHP 的Input参数回填到全局$argv从而复用 Workerman 的信号解析逻辑execute()读取 config/workerman.php 配置依次创建admin Workerwebsocket://0.0.0.0:40001、chat Workerwebsocket://0.0.0.0:40002、channel 内部通讯服务127.0.0.1:40003各服务进程数由配置中的serverCount决定当前均为 1PID 文件写入runtime/workerman.pid最后调用Worker::runAll()统一启动。命令注册在 crmeb/config/console.phpworkerman→\crmeb\command\Workerman::classtimer→\crmeb\command\Timer::class。九、CRMEB 中的落地实现配置、鉴权与消息分发1. 配置项速查config/workerman.php 是三段式结构与上述三个服务一一对应配置段协议监听地址端口进程数用途channel内部 TCP127.0.0.140003—程序与长连接服务之间的内部通讯总线adminwebsocket0.0.0.0400011后台新订单/退款通知、管理员消息推送chatwebsocket0.0.0.0400021客户与客服的实时聊天2. 鉴权流程Token → 连接映射以 admin 服务为例WorkermanHandle.php 的login方法处理前端 WebSocket 传来的typelogin消息从data中取出管理员 Token调用AdminAuthServices::parseToken()校验成功后将adminInfo/adminId挂在TcpConnection对象上并通过WorkermanService::setUser()建立「管理员 ID → 连接」映射鉴权失败则直接close连接。chat 服务ChatService.php同样维护$user普通用户与$kefuUser在线客服两张映射表。3. Channel 消息总线与广播多进程/多服务之间通过 workerman-channel 组件通信ChannelService.php 封装了Client::connect($config[ip], $config[port])、send($type, $data, $ids)与Client::publish($type, $data)send()中的ids为可选的指定用户 ID 列表不传则广播给全部在线用户业务侧订单创建、退款等向 channel 发布crmeb/crmeb_chat主题消息WorkermanService.php 在onWorkerStart中Client::on(crmeb, ...)订阅收到后按ids遍历$user表逐连接下发ChatService.php 同样订阅crmeb_chat若事件携带fun标记则调用ChatHandle对应方法处理否则直接推送type data。4. 统一响应封装Response.php 提供链式发送工具connection($conn)-success($type, $data)发送成功消息、fail()发送失败消息、close()发送后关闭连接最终统一json_encode后send保证前后端消息格式一致形如{type:...,data:{...}}。5. 心跳与掉线回收onMessage每次都会刷新$connection-lastMessageTimeWorkermanService.php前端心跳类型为ping时服务端直接回ping now时间戳。配合前述 Timer 扫描超过 12 秒无消息即判定超时关闭避免僵尸连接堆积。十、性能基准与源码目录速览官方基准测试硬件环境与结论Workerman 官方 README 附带了在如下环境的 ab 压测记录结果仅供参考实际表现取决于服务器硬件与业务复杂度CPUIntel(R) Core(TM) i3-3220 3.30GHz4 处理器内存8G操作系统Ubuntu 14.04 LTS压测工具ApacheBenchabPHP5.5.9压测代码是一个 3 进程的纯 TCP 服务onMessage直接回写一个 5 字节 HTTP 响应?php use Workerman\Worker; $worker new Worker(tcp://0.0.0.0:1234); $worker-count3; $worker-onMessage function($connection, $data) { $connection-send(HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nServer: workerman\r\nContent-Length: 5\r\n\r\nhello); }; Worker::runAll();压测命令与核心结果ab -n1000000 -c100 -k http://127.0.0.1:1234/完成请求1,000,000失败请求0Keep-Alive 请求1,000,000Requests per second138124.14 [#/sec]平均平均单请求耗时 0.724ms99% 请求在 1ms 内完成Transfer rate9846.74 KB/s。需要强调的是该数据是 Workerman 3.1.4 在特定单机环境下的官方记录属 README 自带历史数据不应作为当前仓库或生产环境的通用结论。仓库内目录结构速览Workerman 在crmeb/vendor/workerman/workerman下的模块分布Worker.php进程容器、信号处理、runAll()入口版本 3.5.19WebServer.phpHTTP 静态服务器虚拟主机 MIME 映射Connection/TcpConnection、UdpConnection、AsyncTcpConnection、AsyncUdpConnectionEvents/Select、Event、Libevent、Swoole及 React 系列事件循环Lib/Timer、ConstantsProtocols/Http、Websocket、Ws、Text、Frame、ProtocolInterface及Http/mime.typesAutoloader.php内置自动加载器。CRMEB 侧对 Workerman 的二次封装位于 crmeb/crmeb/services/workermanWorkermanServiceadmin 推送、chat/ChatService客服聊天、ChannelService消息总线、Response统一响应、WorkermanHandle/chat/ChatHandle消息路由与业务处理。十一、许可说明Workerman 以 MIT 许可证开源见 MIT-LICENSE.txt可自由用于商业项目。本文所述示例均可在仓库内对应的源码与配置文件中直接查阅验证建议结合 config/workerman.php、crmeb/crmeb/command/Workerman.php 与 crmeb/README.md 三个文件对照阅读即可快速搭建出属于自己的长连接业务。赞分享后端电商前端【免费下载链接】CRMEBCRMEB开源商城免费开源多语言商城系统Tp6框架商城系统可商用包含小程序商城、H5商城、公众号商城、PC商城、App支持分销、拼团、砍价、秒杀、优惠券、积分、会员等级、小程序直播、页面DIY前后端分离方便二开更有详细使用文档、接口文档、数据字典、二开文档/视频教程欢迎大家提出宝贵意见和建议项目地址https://gitcode.com/gh_mirrors/cr/CRMEB点击查看免费下载相关推荐GoBelieve即时通讯服务教程GoBelieve即时通讯服务教程 项目介绍 GoBelieve是一个开源的即时通讯服务项目旨在为开发者提供一个高效、稳定、易用的即时通讯解决方案。该项目支持终极指南如何使用CocoaAsyncSocket实现iOS即时通讯长连接终极指南如何使用CocoaAsyncSocket实现iOS即时通讯长连接 CocoaAsyncSocket是一款强大的异步网络通信库专为Mac和iOS平台设通信考研408数据结构怎么拿高分一份四阶段可执行的完整复习指南考研408数据结构怎么拿高分一份四阶段可执行的完整复习指南 备考考研408数据结构时你大概率经历过这样的场景视频里快速排序看得明明白白合上书却要手写出来文档教育教程上一篇LeechBlock NG 开源项目教程下一篇深度解析DB-GPT Text2SQL自动化微调框架如何实现82.5%执行准确率的技术突破创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询