PHPackages                             lys/php-sharding-pdo - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. lys/php-sharding-pdo

ActiveLibrary[Database &amp; ORM](/categories/database)

lys/php-sharding-pdo
====================

v9.10.39(2y ago)611565111Apache-2.0PHPPHP &gt;=7.2

Since Sep 2Pushed 1y ago1 watchersCompare

[ Source](https://github.com/1107012776/PHP-Sharding-PDO)[ Packagist](https://packagist.org/packages/lys/php-sharding-pdo)[ RSS](/packages/lys-php-sharding-pdo/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (2)Versions (116)Used By (1)

PHP-Sharding-PDO
================

[](#php-sharding-pdo)

PHP、MySQL分库分表中间件，需要依赖PDO，PHP分库分表，支持协程

[目录](#PHP-Sharding-PDO)

- [一、安装](#%E5%AE%89%E8%A3%85)
- [二、说明](#%E8%AF%B4%E6%98%8E)
- [三、注意](#%E6%B3%A8%E6%84%8F)
- [四、单元测试](#%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95)
- [五、示例](#%E7%A4%BA%E4%BE%8B)

    - [1.基本的分块规则配置类](#1%E6%88%91%E4%BB%AC%E9%9C%80%E8%A6%81%E9%85%8D%E7%BD%AE%E4%B8%80%E4%B8%8B%E5%9F%BA%E6%9C%AC%E7%9A%84%E5%88%86%E5%9D%97%E8%A7%84%E5%88%99%E9%85%8D%E7%BD%AE%E7%B1%BB)
    - [2.Model创建](#2Model%E5%88%9B%E5%BB%BA)
    - [3.基础用法](#3%E5%9F%BA%E7%A1%80%E7%94%A8%E6%B3%95)

        - [查询](#%E6%9F%A5%E8%AF%A2)
        - [插入](#%E6%8F%92%E5%85%A5)
        - [更新](#%E6%9B%B4%E6%96%B0)
        - [删除](#%E5%88%A0%E9%99%A4)
    - [4.Join用法](#4Join%E7%94%A8%E6%B3%95)
    - [5.XA用法](#5XA%E7%94%A8%E6%B3%95)
- [六、案例](#%E6%A1%88%E4%BE%8B)

环境要求
====

[](#环境要求)

- PHP &gt;= 7.2
- Swoole &gt;= 4.1.0 （协程环境）

安装
==

[](#安装)

You can install the package via composer:

```
composer require lys/php-sharding-pdo
```

说明
==

[](#说明)

###### （1）已支持协程，使用协程必须在主进程开启 \\Swoole\\Runtime::enableCoroutine();

[](#1已支持协程使用协程必须在主进程开启---swooleruntimeenablecoroutine)

###### （2）支持分片规则自定义，支持实现复杂的分片，分片规则是依赖输入的where条件或者insert插入的数据来的

[](#2支持分片规则自定义支持实现复杂的分片分片规则是依赖输入的where条件或者insert插入的数据来的)

###### （3）如果是insert匹配了多个库或者多张表就会返回false，请确认你insert插入匹配的规则只会有一个库和一张表

[](#3如果是insert匹配了多个库或者多张表就会返回false请确认你insert插入匹配的规则只会有一个库和一张表)

###### （4）由于MySQL不能使用滚动游标

[](#4由于mysql不能使用滚动游标)

> 规则匹配到多库多表分页会比较慢，优化的方案是使用一个where条件来过滤掉非必要的查询结果集，增加查询分页效率比如 where id &gt;= 1000000 或者 where id &lt;= 1000000

> 规则匹配到单库单表分页与原来的速度一样

###### （5）在事务处理中同时插入更新二个库或者多个库，是有一定机率（2PC提交）由于事务提交失败而导致数据不一致的，所以建议把某个维度的数据放在同一个数据库，或使用柔性事务，达到最终一致性

[](#5在事务处理中同时插入更新二个库或者多个库是有一定机率2pc提交由于事务提交失败而导致数据不一致的所以建议把某个维度的数据放在同一个数据库或使用柔性事务达到最终一致性)

注意
==

[](#注意)

###### （1）协程模式必须在主进程开启这个东西，否则会出现死锁

[](#1协程模式必须在主进程开启这个东西否则会出现死锁)

```
\Swoole\Runtime::enableCoroutine();
```

###### （2）协程中不能使用pdo长连接，在高并发的情况下，会出现如下异常

[](#2协程中不能使用pdo长连接在高并发的情况下会出现如下异常)

```
PHP Fatal error:  Uncaught Swoole\Error: Socket#30 has already been bound to another coroutine#2,
reading of the same socket in coroutine#4 at the same time is not allowed
```

###### （3）Replace into自增主键，并发量大的时候可能出现返回false和死锁的，所以不适合高并发项目的使用，高并发，请使用雪花算法等一些分布式主键方案

[](#3replace-into自增主键并发量大的时候可能出现返回false和死锁的所以不适合高并发项目的使用高并发请使用雪花算法等一些分布式主键方案)

###### （4）非协程情况下，并且常驻内存，如workerman框架请使用如下代码释放上下文，上下文管理为单例，所以需要该方法释放单例实例，一般是在一个请求结束，或者一个任务结束，释放完上下文，请重新new Model实例才行，因为释放上下文，清理了上下文中的PDO实例，方法如下:

[](#4非协程情况下并且常驻内存如workerman框架请使用如下代码释放上下文上下文管理为单例所以需要该方法释放单例实例一般是在一个请求结束或者一个任务结束释放完上下文请重新new-model实例才行因为释放上下文清理了上下文中的pdo实例方法如下)

```
