讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

Workerman怎么写mysql长连接代码

夏萱君_9596

夏萱君_9596

发布时间:2026-11-13 18:44:13

|

220人浏览过

|

来源于php中文网

原创

在workerman中实现mysql长连接,核心做法是复用pdo或mysqli实例,避免每次请求都建立新连接。具体而言,应在worker进程启动时初始化数据库连接对象,并将其绑定到当前进程上下文(如静态变量或自定义属性),随后在所有业务逻辑中直接使用该实例进行查询。这样做能显著减少tcp握手和认证开销,提升高并发下的响应速度。需要注意的是,由于workerman是多进程模型,每个worker进程必须拥有独立的连接实例,严禁跨进程共享同一个pdo对象,否则会导致严重的并发冲突和数据错乱。

Workerman怎么写mysql长连接代码

如何确保连接在Worker生命周期内持续有效

要确保连接在Worker整个生命周期内有效,关键在于利用onWorkerStart回调进行初始化,并处理连接断开后的自动重连机制。Workerman的Worker进程可能会因为超时、信号或异常而重启,因此不能假设连接永远在线。最佳实践是在onWorkerStart中创建PDO实例,并在每次执行SQL前检查连接状态。如果检测到连接失效(例如通过ping()方法或捕获异常),则重新建立连接。这种“懒加载”或“即时检查”策略既保证了连接的持久性,又避免了因网络波动导致的静默失败。

Workerman怎么写mysql长连接代码

win可用的mysql指令skill
win可用的mysql指令skill

安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。

下载
<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';

class DatabaseManager {
    public static $pdo = null;

    public static function init() {
        if (self::$pdo === null) {
            $dsn = 'mysql:host=127.0.0.1;dbname=test;charset=utf8mb4';
            $user = 'root';
            $pass = 'password';
            try {
                self::$pdo = new PDO($dsn, $user, $pass, [
                    PDO::ATTR_PERSISTENT => true,
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                ]);
            } catch (PDOException $e) {
                error_log("DB Connection Failed: " . $e->getMessage());
            }
        }
    }

    public static function query($sql, $params = []) {
        // 检查连接是否存活,若断开则重建
        if (!self::$pdo || !self::$pdo->ping()) {
            self::$pdo = null;
            self::init();
        }
        try {
            $stmt = self::$pdo->prepare($sql);
            $stmt->execute($params);
            return $stmt->fetchAll();
        } catch (PDOException $e) {
            error_log("Query Error: " . $e->getMessage());
            return [];
        }
    }
}

$worker = new Worker('tcp://0.0.0.0:1234');
$worker->onWorkerStart = function($worker) {
    DatabaseManager::init();
};

$worker->onMessage = function($connection, $data) {
    $result = DatabaseManager::query("SELECT * FROM users WHERE id = ?", [1]);
    $connection->send(json_encode($result));
};

Worker::runAll();

多进程环境下如何避免连接冲突

在多进程环境下,避免连接冲突的根本原则是“一进程一连接”。Workerman默认启动多个Worker进程,每个进程都有独立的内存空间。如果在类中定义静态变量来存储PDO实例,必须确保该静态变量在每个进程启动时被正确初始化,而不是在主进程(Master)中初始化后被子进程继承。上述代码示例中,DatabaseManager::init()被放置在onWorkerStart回调中,这正是为了在每个子进程启动时单独创建连接。此外,应避免使用全局单例模式直接实例化数据库连接,除非你能保证该单例在进程 fork 之后被重置。对于更复杂的场景,可以使用ConnectionPool思想,但基础层面只需确保每个Worker持有自己的PDO引用即可。

Workerman怎么写mysql长连接代码

<?php
// 验证多进程隔离的代码片段
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';

class ProcessSafeDB {
    public static $instanceId = null;

    public static function getInstance() {
        if (self::$instanceId === null) {
            // 每个进程首次调用时生成唯一ID并建立连接
            self::$instanceId = getmypid() . '_' . uniqid();
            echo "Process " . getmypid() . " initialized DB instance: " . self::$instanceId . PHP_EOL;
            // 实际这里应返回 PDO 对象
        }
        return self::$instanceId;
    }
}

$worker = new Worker('text://0.0.0.0:2345');
$worker->count = 2; // 启动2个Worker进程

$worker->onWorkerStart = function($worker) {
    $id = ProcessSafeDB::getInstance();
    // 模拟后续操作
};

$worker->onMessage = function($connection, $msg) {
    $id = ProcessSafeDB::getInstance();
    $connection->send("Current Instance: " . $id);
};

Worker::runAll();

当MySQL服务器重启后连接池如何处理断连

当MySQL服务器重启或网络闪断时,原有的长连接会变为无效状态,此时程序若继续使用旧连接执行SQL,会抛出SQLSTATE[HY000]: General error: 2006 MySQL server has gone away异常。处理这一问题的具体做法是在每次查询前增加健康检查。在PHP的PDO扩展中,可以调用$pdo->ping()方法来检测连接是否活跃。如果ping()返回false,或者在执行prepare/execute时捕获到PDOException,则应立即将当前的PDO实例置为null,并触发重新初始化流程。这种重试机制确保了即使底层连接中断,上层业务也能透明地获取到一个新的可用连接,从而维持服务的连续性。

热门AI工具

更多
Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

更多
Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

226

2026.05.20

Workerman实时通信与长连接开发教程
Workerman实时通信与长连接开发教程

WWorkerman实时通信与长连接开发教程聚合实时通信、聊天室、长连接、消息推送、AI流式输出等Workerman高并发开发内容。

222

2026.05.20

Workerman异步通信与TCP服务器开发
Workerman异步通信与TCP服务器开发

Workerman异步通信与TCP服务器开发专题整理Workerman异步通信、TCP服务、HTTP服务、WebSocket开发与高并发PHP服务器教程。

227

2026.05.20

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

20

2026.11.12

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

20

2026.11.12

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

120

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

100

2026.11.06

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

100

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Laravel5.2博客实战视频教程
Laravel5.2博客实战视频教程

共41课时 | 22.1万人学习

后盾网ECShop从入门到精通视频教程
后盾网ECShop从入门到精通视频教程

共42课时 | 11.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn