Workerman怎么写mysql长连接代码

夏萱君_9596

夏萱君_9596

2026-11-13

220人浏览

原创

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

Workerman怎么写mysql长连接代码

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

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

Workerman怎么写mysql长连接代码

<?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引用即可。

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

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

下载

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,并触发重新初始化流程。这种重试机制确保了即使底层连接中断,上层业务也能透明地获取到一个新的可用连接,从而维持服务的连续性。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2026.05.20

226

15

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

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

2026.05.20

222

12

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

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

2026.05.20

227

13

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

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

2026.11.12

20

15

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

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

2026.11.12

20

15

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

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

2026.11.12

20

15

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

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

2026.11.06

120

12

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

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

2026.11.06

100

13

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

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

2026.11.06

100

10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程