Workerman 5.x 完整实战指南:基于事件驱动的 PHP 异步网络框架
后端【免费下载链接】workermanAn asynchronous event driven PHP socket framework. Supports HTTP, Websocket, SSL and other custom protocols.项目地址https://gitcode.com/gh_mirrors/wo/workerman点击查看免费下载Workerman 是一个使用纯 PHP 编写、基于事件驱动的异步网络通信框架可用于构建高性能、可扩展的实时网络应用覆盖 HTTP、WebSocket、自定义 TCP 协议、协程与连接池等场景。本指南以当前仓库 README.md 为主线结合 src 目录源码与 tests 测试用例系统讲解环境要求、安装、四种典型服务端写法、SSL 加密、异步客户端、协程四大并发原语、连接池以及完整的命令行运维体系。框架概述与适用场景Workerman 的核心定位是在 PHP 中构建长期常驻内存、支持高并发连接的异步网络服务。它采用事件驱动模型通过一个主进程管理多个 Worker 子进程每个 Worker 负责监听端口并处理连接事件从而突破传统 PHP-FPM请求结束即销毁的短生命周期模式。从当前仓库结构可以确认框架的主要组成模块src/Worker.php核心 Worker 类负责进程管理、端口监听、事件循环初始化与命令行调度src/Connection连接抽象层包含 TcpConnection.php、AsyncTcpConnection.php、UdpConnection.php 等src/Events事件循环实现包括 Select.php、Event.php、Swoole.php、Swow.php、Fiber.php、Ev.phpsrc/Protocols应用层协议解析包括 HTTP、WebSocket、Text、Frame 等。运行环境要求根据 README 与 composer.json 的约束运行 Workerman 需要满足以下条件项目要求PHP 版本 8.1仓库 composer.json 中require明确要求操作系统POSIX 兼容系统Linux、macOS、BSDPHP 扩展必须安装 POSIX 与 PCNTL 扩展性能增强扩展推荐安装 Event / Swoole / Swow 扩展以获得更好性能其中 PCNTL进程控制与 POSIX 扩展是运行的基础前提。在 Worker.php 的checkSapiEnv()方法中框架会显式检查pcntl与posix扩展是否加载若缺失会直接提示安装。同时该方法还校验了一组关键函数stream_socket_server、pcntl_fork、posix_kill等是否被disable_functions禁用并确认只能通过命令行 SAPI 运行——这意味着 Workerman 程序必须以php start.php方式启动无法运行在传统 Web 服务器环境中。安装使用 Composer 一条命令即可完成安装composer require workerman/workerman仓库 composer.json 展示了依赖关系项目依赖于workerman/coroutine包提供协程能力并将ext-event列为建议安装项For better performance。从源码结构看当安装了ext-event扩展时框架会自动选用 Event 事件循环否则回退到 Select 事件循环见 Worker.php 的initGlobalEvent()方法。构建一个 WebSocket 服务端这是 Workerman 最经典的入门示例。创建一个start.php文件内容如下完整代码见 README.md?php use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; // Create a Websocket server $ws_worker new Worker(websocket://0.0.0.0:2346); // Emitted when new connection come $ws_worker-onConnect function ($connection) { echo New connection\n; }; // Emitted when data received $ws_worker-onMessage function ($connection, $data) { // Send hello $data $connection-send(Hello . $data); }; // Emitted when connection closed $ws_worker-onClose function ($connection) { echo Connection closed\n; }; // Run worker Worker::runAll();代码要点解析new Worker(websocket://0.0.0.0:2346)协议与监听地址合一的写法websocket://指定应用层协议0.0.0.0:2346表示监听所有网卡的 2346 端口onConnect/onMessage/onClose三个核心事件回调分别在连接建立、收到数据、连接关闭时触发Worker::runAll()启动框架的主入口。从 Worker.php 的源码可以看到runAll()内部依次完成 SAPI 环境检查、初始化、命令解析、端口可用性检查、守护进程化、Worker 初始化、信号安装、主进程 PID 保存、UI 展示、子进程 fork 与监控等一整套流程。仓库 tests/Feature 目录下提供了配套的 WebSocket 测试桩与测试用例WebsocketServer.php 定义服务端WebsocketServiceTest.php 验证握手与消息收发逻辑可作为实际开发时参考的服务端骨架。构建一个 HTTP 服务端HTTP 服务端与 WebSocket 服务端写法几乎一致区别在于协议前缀与多进程配置use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; // #### http worker #### $http_worker new Worker(http://0.0.0.0:2345); // 4 processes $http_worker-count 4; // Emitted when data received $http_worker-onMessage function ($connection, $request) { //$request-get(); //$request-post(); //$request-header(); //$request-cookie(); //$request-session(); //$request-uri(); //$request-path(); //$request-method(); // Send data to client $connection-send(Hello World); }; // Run all workers Worker::runAll();要点说明$http_worker-count 4设置该 Worker 启动 4 个子进程。count是 Worker.php 中定义的公开属性默认值为 1。多进程能充分利用多核 CPU但每个进程独立维护自己的连接集合onMessage回调的第二个参数是$request即 src/Protocols/Http/Request.php 封装好的请求对象可以链式调用get()、post()、header()、cookie()、session()、uri()、path()、method()等方法来获取请求信息HTTP 协议解析逻辑位于 src/Protocols/Http.php仓库中的 HttpTest.php 对协议解析、请求封装做了系统测试。仓库还提供了 HttpServer.php 测试桩与 HttpConnectionTest.php 特征测试通过 GuzzleHttp 客户端实际发起 GET/POST 请求并断言状态码、响应体与 JSON 内容验证了 HTTP 服务的完整收发链路。构建一个 TCP 服务端当需要自定义二进制协议或私有文本协议时可以直接使用底层 TCPuse Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; // #### create socket and listen 1234 port #### $tcp_worker new Worker(tcp://0.0.0.0:1234); // 4 processes $tcp_worker-count 4; // Emitted when new connection come $tcp_worker-onConnect function ($connection) { echo New Connection\n; }; // Emitted when data received $tcp_worker-onMessage function ($connection, $data) { // Send data to client $connection-send(Hello $data \n); }; // Emitted when connection is closed $tcp_worker-onClose function ($connection) { echo Connection closed\n; }; Worker::runAll();这里onMessage收到的$data是原始字符串数据按换行或框架内部缓冲分割。如果需要在此基础上定义自己的协议可以参考 src/Protocols 目录下的协议实现方式并实现 ProtocolInterface.php 约定的接口。启用 SSL 加密传输通过 SSL 上下文与transport属性可以轻松让 WebSocket 升级为安全版本wss://HTTP 升级为https://?php use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; // SSL context. $context [ ssl [ local_cert /your/path/of/server.pem, local_pk /your/path/of/server.key, verify_peer false, ] ]; // Create a Websocket server with ssl context. $ws_worker new Worker(websocket://0.0.0.0:2346, $context); // Enable SSL. WebSocketSSL means that Secure WebSocket (wss://). // The similar approaches for Https etc. $ws_worker-transport ssl; $ws_worker-onMessage function ($connection, $data) { // Send hello $data $connection-send(Hello . $data); }; Worker::runAll();配置解析$context[ssl]PHP 流上下文local_cert指向服务端证书PEM 格式local_pk指向私钥verify_peer置为false表示服务端不要求校验客户端证书典型的一对一认证场景$ws_worker-transport ssl将传输层切换为 SSL。transport是 Worker.php 中定义的公开属性默认值为tcp可改为ssl、tls等同一套机制对 HTTPS 同样适用把 Worker 的监听协议换成http://并设置transport ssl即可。SSL 连接的底层处理可以参考 SslConnectionTest.php 测试用例它对 SSL 场景的连接建立与数据传输有专门验证。使用 AsyncTcpConnection 构建异步客户端AsyncTcpConnection让 Workerman 进程能够主动作为客户端异步地连接外部服务如 WebSocket 服务、HTTP API、TCP 长连接等适用于网关、代理、消息推送等场景。完整示例见 README.mduse Workerman\Worker; use Workerman\Connection\AsyncTcpConnection; require_once __DIR__ . /vendor/autoload.php; $worker new Worker(); $worker-onWorkerStart function () { // Websocket protocol for client. $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();关键点说明这里创建的是一个不带监听地址的 Workernew Worker()所有异步连接都放在onWorkerStart回调中发起确保在 Worker 进程启动完成后才建立外部连接AsyncTcpConnection位于 src/Connection/AsyncTcpConnection.php它继承自 TcpConnection.php。从源码看它声明了BUILD_IN_TRANSPORTS常量支持tcp、udp、unix、ssl、sslv2、sslv3、tls等内置传输层协议连接地址同样采用协议://IP:端口格式支持ws://、tcp://、text://、frame://等例如示例中的ws://echo.websocket.org:80即用于连接外部的 WebSocket 回显服务相比同步阻塞式file_get_contents异步连接不会阻塞当前 Worker 进程可同时维护成百上千个外部连接。协程支持四种并发原语Workerman 5.x 在事件驱动之上引入了**协程Coroutine**能力用于将异步任务降维为同步写法大幅提升单进程内的并发性能。注意协程功能依赖 Swoole 扩展、Swow 扩展或 revoltphp/event-loop对应Fiber::class事件循环README 中所有协程示例的eventLoop设置均以此为前提。框架本身提供 src/Events/Swoole.php、src/Events/Swow.php、src/Events/Fiber.php 三个协程事件循环实现以及Workerman\Coroutine命名空间下的协程工具类。切换协程事件循环协程示例中统一使用$worker-eventLoop属性指定事件循环$worker-eventLoop Swoole::class; // Or Swow::class or Fiber::classeventLoop是 Worker.php 中定义的公开属性运行时该值会覆盖全局默认事件循环类默认逻辑见initGlobalEvent()安装了event扩展用Event::class否则用Select::class。1. Coroutine创建异步任务Coroutine::create用于创建协程让耗时的异步操作如 HTTP 请求并发执行同时立即返回主流程继续处理?php use Workerman\Connection\TcpConnection; use Workerman\Coroutine; use Workerman\Events\Swoole; use Workerman\Protocols\Http\Request; use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; $worker new Worker(http://0.0.0.0:8001); $worker-eventLoop Swoole::class; // Or Swow::class or Fiber::class $worker-onMessage function (TcpConnection $connection, Request $request) { Coroutine::create(function () { echo file_get_contents(http://www.example.com/event/notify); }); $connection-send(ok); }; Worker::runAll();注意示例中onMessage回调使用了类型声明TcpConnection $connection与Request $request这是框架提供的类型安全的回调签名。2. Barrier并发任务同步等待Barrier 用于管理协程间的并发与同步所有协程并行执行Barrier::wait()会阻塞等待全部任务完成后才继续确保流程同步?php use Workerman\Connection\TcpConnection; use Workerman\Coroutine\Barrier; use Workerman\Coroutine; use Workerman\Events\Swoole; use Workerman\Protocols\Http\Request; use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; // Http Server $worker new Worker(http://0.0.0.0:8001); $worker-eventLoop Swoole::class; // Or Swow::class or Fiber::class $worker-onMessage function (TcpConnection $connection, Request $request) { $barrier Barrier::create(); for ($i1; $i5; $i) { Coroutine::create(function () use ($barrier, $i) { file_get_contents(http://127.0.0.1:8002?task_id$i); }); } // Wait all coroutine done Barrier::wait($barrier); $connection-send(All Task Done); }; // Task Server $task new Worker(http://0.0.0.0:8002); $task-onMessage function (TcpConnection $connection, Request $request) { $task_id $request-get(task_id); $message Task $task_id Done; echo $message . PHP_EOL; $connection-close($message); }; Worker::runAll();示例演示了典型的聚合请求模式HTTP 服务器收到一次请求后并发调用 4 个任务接口全部完成后统一响应All Task Done。这里还用到了两个 Worker 实例8001与8002端口在同一个进程内共存的写法Worker::runAll()会同时启动它们。3. Parallel并发执行并收集结果与 Barrier 不同Parallel 会直接返回每个任务的返回值通过add()添加任务、wait()等待完成并取得结果数组?php use Workerman\Connection\TcpConnection; use Workerman\Coroutine\Parallel; use Workerman\Events\Swoole; use Workerman\Protocols\Http\Request; use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; // Http Server $worker new Worker(http://0.0.0.0:8001); $worker-eventLoop Swoole::class; // Or Swow::class or Fiber::class $worker-onMessage function (TcpConnection $connection, Request $request) { $parallel new Parallel(); for ($i1; $i5; $i) { $parallel-add(function () use ($i) { return file_get_contents(http://127.0.0.1:8002?task_id$i); }); } $results $parallel-wait(); $connection-send(json_encode($results)); // Response: [Task 1 Done,Task 2 Done,Task 3 Done,Task 4 Done] }; // Task Server $task new Worker(http://0.0.0.0:8002); $task-onMessage function (TcpConnection $connection, Request $request) { $task_id $request-get(task_id); $message Task $task_id Done; $connection-close($message); }; Worker::runAll();示例运行后客户端收到的响应为[Task 1 Done,Task 2 Done,Task 3 Done,Task 4 Done]——每个任务协程的return值按顺序收集进结果数组。4. Channel协程间数据通信Channel 提供协程之间的数据传递通道一个协程向通道push数据另一个协程从通道pop数据实现同步与数据共享。new Channel(2)中的数字表示通道容量缓冲大小?php use Workerman\Connection\TcpConnection; use Workerman\Coroutine\Channel; use Workerman\Coroutine; use Workerman\Events\Swoole; use Workerman\Protocols\Http\Request; use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; // Http Server $worker new Worker(http://0.0.0.0:8001); $worker-eventLoop Swoole::class; // Or Swow::class or Fiber::class $worker-onMessage function (TcpConnection $connection, Request $request) { $channel new Channel(2); Coroutine::create(function () use ($channel) { $channel-push(Task 1 Done); }); Coroutine::create(function () use ($channel) { $channel-push(Task 2 Done); }); $result []; for ($i 0; $i 2; $i) { $result[] $channel-pop(); } $connection-send(json_encode($result)); // Response: [Task 1 Done,Task 2 Done] }; Worker::runAll();示例中两个协程分别向容量为 2 的通道推送结果主流程连续pop两次取出数据最终响应[Task 1 Done,Task 2 Done]。连接池复用资源提升性能Pool 用于管理连接或资源池通过复用例如数据库连接来减少重复建立/销毁的开销。核心 API 包括get()获取资源、put()归还资源、setConnectionCreator()设置创建函数、setConnectionCloser()设置销毁函数、setHeartbeatChecker()设置心跳检测函数。基础用法手动获取与归还?php use Workerman\Connection\TcpConnection; use Workerman\Coroutine\Pool; use Workerman\Events\Swoole; use Workerman\Protocols\Http\Request; use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; class RedisPool { private Pool $pool; public function __construct($host, $port, $max_connections 10) { $pool new Pool($max_connections); $pool-setConnectionCreator(function () use ($host, $port) { $redis new \Redis(); $redis-connect($host, $port); return $redis; }); $pool-setConnectionCloser(function ($redis) { $redis-close(); }); $pool-setHeartbeatChecker(function ($redis) { $redis-ping(); }); $this-pool $pool; } public function get(): \Redis { return $this-pool-get(); } public function put($redis): void { $this-pool-put($redis); } } // Http Server $worker new Worker(http://0.0.0.0:8001); $worker-eventLoop Swoole::class; // Or Swow::class or Fiber::class $worker-onMessage function (TcpConnection $connection, Request $request) { static $pool; if (!$pool) { $pool new RedisPool(127.0.0.1, 6379, 10); } $redis $pool-get(); $redis-set(key, hello); $value $redis-get(key); $pool-put($redis); $connection-send($value); }; Worker::runAll();实现说明new Pool($max_connections)创建容量上限为 10 的连接池创建器Creator负责建立真实连接new Redis并connect销毁器Closer负责释放close()心跳检测器HeartbeatChecker通过ping()维持连接活性onMessage中使用static $pool让连接池在进程内只初始化一次这是常驻内存进程复用资源的关键写法。进阶用法协程内自动获取与释放结合协程上下文Context与Coroutine::defer可以在同一协程内复用同一个连接并在协程销毁时自动归还完全隐藏池的获取/归还逻辑?php use Workerman\Connection\TcpConnection; use Workerman\Coroutine\Context; use Workerman\Coroutine; use Workerman\Coroutine\Pool; use Workerman\Events\Swoole; use Workerman\Protocols\Http\Request; use Workerman\Worker; require_once __DIR__ . /vendor/autoload.php; class Db { private static ?Pool $pool null; public static function __callStatic($name, $arguments) { if (self::$pool null) { self::initializePool(); } // Get the connection from the coroutine context // to ensure the same connection is used within the same coroutine $pdo Context::get(pdo); if (!$pdo) { // If no connection is retrieved, get one from the connection pool $pdo self::$pool-get(); Context::set(pdo, $pdo); // When the coroutine is destroyed, return the connection to the pool Coroutine::defer(function () use ($pdo) { self::$pool-put($pdo); }); } return call_user_func_array([$pdo, $name], $arguments); } private static function initializePool(): void { self::$pool new Pool(10); self::$pool-setConnectionCreator(function () { return new \PDO(mysql:host127.0.0.1;dbnameyour_database, your_username, your_password); }); self::$pool-setConnectionCloser(function ($pdo) { $pdo null; }); self::$pool-setHeartbeatChecker(function ($pdo) { $pdo-query(SELECT 1); }); } } // Http Server $worker new Worker(http://0.0.0.0:8001); $worker-eventLoop Swoole::class; // Or Swow::class or Fiber::class $worker-onMessage function (TcpConnection $connection, Request $request) { $value Db::query(SELECT NOW() as now)-fetchAll(); $connection-send(json_encode($value)); }; Worker::runAll();这套模式有两个关键设计协程上下文Context保证同一协程内复用同一条连接第一次调用时从池中get()并写入上下文后续调用直接取上下文中的连接避免同一协程内重复获取Coroutine::defer()保证连接自动归还注册协程销毁时的回调在协程结束时将连接放回池中业务代码无需关心池的细节。命令行运维命令Workerman 提供了完整的命令行操作体系启动脚本假设为start.php支持以下命令php start.php start php start.php start -d php start.php status php start.php status -d php start.php connections php start.php stop php start.php stop -g php start.php restart php start.php reload php start.php reload -g各命令的含义与底层实现对应 Worker.php 的parseCommand()方法命令说明start以调试模式启动前台运行可直接看到日志输出start -d以守护进程daemon模式后台启动status查看所有 Worker 的运行状态status -d为实时刷新模式每秒动态刷新状态面板connections查看当前所有连接信息stop停止服务发送SIGINT信号stop -g为优雅停止发送SIGQUIT信号等待正在处理的任务完成后再退出restart重启服务restart -d重启并后台运行restart -g优雅重启reload热重载业务代码发送SIGUSR1信号仅重启 Worker 子进程而不中断主进程reload -g为优雅重载发送SIGUSR2信号从 Worker.php 的命令帮助文本可以确认完整命令集为start、stop、restart、reload、status、connections六种。机制细节status命令通过向主进程发送SIGIOT信号收集各子进程统计信息Worker.php再格式化输出进程状态面板connections通过发送SIGIO信号收集连接信息Worker.php优雅停止时设置了$stopTimeout超时控制Worker.php超时未结束的进程会被强制退出。总结围绕当前仓库的 README.md 与 src 源码可以梳理出 Workerman 的核心实践路径三种服务端范式WebSocketwebsocket://、HTTPhttp:// 请求对象、TCPtcp:// 原始数据均通过Worker::runAll()启动靠onConnect/onMessage/onClose事件驱动安全传输通过 SSL 上下文 transport ssl一键升级为wss:///https://主动连接外部用AsyncTcpConnection在 Worker 进程内发起异步客户端连接协程并发基于 Swoole / Swow / Fiber 事件循环使用Coroutine::create、Barrier、Parallel、Channel四种原语处理并发任务资源复用用Pool管理数据库/Redis 等连接池结合Context与Coroutine::defer实现自动获取归还进程运维借助start/status/connections/stop/restart/reload六类命令完成常驻服务的全生命周期管理。实际部署时需满足 PHP 8.1、POSIX 兼容系统、PCNTL 与 POSIX 扩展等前提条件参见 composer.json 与 Worker.php 的启动校验并按需安装 Event / Swoole / Swow 扩展来启用高性能事件循环或协程能力。赞分享后端【免费下载链接】workermanAn asynchronous event driven PHP socket framework. Supports HTTP, Websocket, SSL and other custom protocols.项目地址https://gitcode.com/gh_mirrors/wo/workerman点击查看免费下载相关推荐Workerman高性能PHP异步事件驱动框架深度解析Workerman高性能PHP异步事件驱动框架深度解析 本文深入解析Workerman框架的核心架构、异步事件驱动原理、多协议支持特性及其性能优势。Worke后端Webman基于Workerman的高性能PHP框架Webman基于Workerman的高性能PHP框架 项目基础介绍和主要编程语言 Webman 是一个基于 Workerman 开发的高性能 PHP 框架。W后端Web框架Phalcon微服务与事件驱动架构Phalcon微服务与事件驱动架构 本文深入探讨了Phalcon框架在微服务架构中的应用重点介绍了Micro应用开发模式、事件管理器与观察者模式实现、异步处理后端Web框架上一篇Windows安卓应用安装器三步实现电脑运行手机应用下一篇TrafficMonitor股票插件终极指南在Windows任务栏实时监控你的投资组合创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

uniPush离线推送实战:厂商通道配置与到达率优化指南

uniPush离线推送实战:厂商通道配置与到达率优化指南

1. 离线推送到底在解决什么问题做移动端应用的人迟早会撞上这个需求:用户把App划掉了、手机锁屏了、后台进程被系统回收了,这时候业务侧发出一条通知,用户还能不能在通知栏看到?答案就是离线推送要解决的核心命题。uniPush这套方案…

2026/10/14 2:44:28 阅读更多 →
单片机计算机毕设之基于物联网的婴儿床环境自动调节与哄睡联动装置设计 基于单片机的智能婴儿摇篮温湿度调节与远程监控系统设计(032707)

单片机计算机毕设之基于物联网的婴儿床环境自动调节与哄睡联动装置设计 基于单片机的智能婴儿摇篮温湿度调节与远程监控系统设计(032707)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/10/14 2:44:28 阅读更多 →
Java异步编程进阶:CompletableFuture任务编排与线程池实战

Java异步编程进阶:CompletableFuture任务编排与线程池实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 2:43:28 阅读更多 →

最新新闻

Virglrenderer 虚拟化技术深入解析 · 专栏目录

Virglrenderer 虚拟化技术深入解析 · 专栏目录

一套面向工程师的 virglrenderer 源码级技术专栏。从概述与演进讲起,再深入核心抽象、各后端实现、部署集成与工程实践。所有内容以仓库源码为准。 这里讲一下我为什么关注 virglrenderer,因为国产 GPU 的虚拟化需求。 随着国产化替代的推进&#xff0c…

2026/10/14 3:23:34 阅读更多 →
Kestrel_VLLM_CUDA - 04 · 分组量化 GEMM 内核

Kestrel_VLLM_CUDA - 04 · 分组量化 GEMM 内核

04 分组量化 GEMM 内核 一句话:一个内核同时服务 decode(M1)与 prefill(M32),用「每线程固定几列、沿 K 扫」的映射让权重按 warp 满事务读、激活广播;用 z-split 把小 M 的欠填充网格补满&…

2026/10/14 3:23:34 阅读更多 →
Spring Boot 单元测试怎么写?物联网平台 MockMvc 接口测试与 Mockito 消息链路测试实战(附 JaCoCo 覆盖率报告)

Spring Boot 单元测试怎么写?物联网平台 MockMvc 接口测试与 Mockito 消息链路测试实战(附 JaCoCo 覆盖率报告)

真实运行截图:一、功能都写完了,为什么还要写测试? 我这个物联网设备接入平台(Spring Boot 3.5 EMQX MySQL),从设备注册、MQTT 接入、消息入库到密钥轮换,功能主线已经跑通了。但每次面试话题…

2026/10/14 3:23:34 阅读更多 →
宁波执业律师张娟:配偶背的债你要还吗——夫妻共同债务认定规则拆解

宁波执业律师张娟:配偶背的债你要还吗——夫妻共同债务认定规则拆解

结论先行:配偶单方所负的债务,并不天然由你连带承担。民法典第1064条确立了共债共签原则——共同签字或事后追认、为家庭日常生活需要所负的债务才是共同债务;超出日常生活需要的,原则上由举债方自担,除非债权人能证明…

2026/10/14 3:23:34 阅读更多 →
铝制小青瓦筑就江南院墅 复刻黛瓦白墙的东方栖居

铝制小青瓦筑就江南院墅 复刻黛瓦白墙的东方栖居

坐落于苏州的拙政江南,以拙政园为文脉基底,打造连片式低密新中式院墅群落。白墙围合私家庭院,黛瓦错落铺陈屋面,亭廊婉转、叠石理水,将苏州园林的雅致意境藏进每一方栖居空间。项目全线屋面采用铝制小青瓦,以现代建材工艺复刻传统江南小青瓦的形与韵,更从根源破解传统陶瓦的运维…

2026/10/14 3:23:34 阅读更多 →
中国起名服务正在发生什么变化?从“大师经验”到专业化、品牌化服务

中国起名服务正在发生什么变化?从“大师经验”到专业化、品牌化服务

很长时间里,人们对于“找人起名”的想象都非常简单: 找一位有经验的老师, 报出生时间, 老师根据经验给出几个名字。 整个服务高度依赖: “这个大师厉不厉害”。 但今天再观察国内专业起名市场,会发现它已经…

2026/10/14 3:22:34 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →