关于swoole:Swoole-51-增加更多数据库协程客户端支持

3次阅读

共计 5758 个字符,预计需要花费 15 分钟才能阅读完成。

5.1 版本中减少了多种数据库协程客户端的反对,并且全副以 PDO 接口的形式提供,旧的业务代码无需做任何更改即可一键切换为协程模式,异步非阻塞地并发执行。

包含:

  1. pdo_pgsql
  2. pdo_odbc
  3. pdo_sqlite
  4. pdo_oci (Oracle 数据库)

开启办法

减少了 4 个编译参数和 Runtime Hook 选项,开启这些协程客户端。

编译选项

  • --with-swoole-odbc,依赖 unixodbc-dev
  • --with-swoole-pgsql,依赖 libpq-dev
  • --with-swoole-sqlite,依赖 libsqlite3-dev
  • --with-swoole-oracle,依赖 oracle-instantclient

Runtime Hook 选项

  • SWOOLE_HOOK_PDO_PGSQL
  • SWOOLE_HOOK_PDO_ODBC
  • SWOOLE_HOOK_PDO_SQLITE
  • SWOOLE_HOOK_PDO_ORACLE

这些选项已蕴含在 SWOOLE_HOOK_ALL 中,也可独自启用其中一个客户端。

PDO_PGSQL

在之前的版本中,提供了 Swoole\Coroutine\PostgreSQL 客户,因为是全新的 API,用户须要兼容 PHP-FPMSwoole,应用并不宽泛。

go(function () {$pg = new Swoole\Coroutine\PostgreSql();
    $conn = $pg->connect("host=127.0.0.1 port=5432 dbname=test user=test password=");
    $result = $pg->query($conn, 'SELECT * FROM test;');
    $arr = $pg->fetchAll($result);
    var_dump($arr);
});

5.1 版本中减少了 Runtime Hook PDO_PGSQL,能够间接应用 FPM 下的历史代码。

go(function () {$pdo = new PDO("pgsql:host={$host};port={$port};dbname={$dbname}", $user, $password);
    $statement = $pdo->query('select * from user  where id =1 limit 1');
    var_dump($statement->fetch(PDO::FETCH_ASSOC));
});

PDO_ODBC

ODBCOpen Database Connectivity)是一种为多种数据库管理系统提供对立接口的标准化技术。它是由微软公司提出的,目标是为了实现异构性,使得应用程序可能拜访多种不同类型的数据源。ODBC 的规范定义了应用程序发出请求的 API,以及由驱动程序提供的响应申请的 APIODBC 是一种凋谢的、跨平台的技术,能够在多种操作系统和编程语言中应用。

绝大多数关系型数据库都反对 ODBC 驱动,其中包含:

  1. Microsoft SQL Server
  2. Oracle
  3. IBM DB2
  4. MySQL
  5. PostgreSQL
  6. SQLite
  7. Teradata
  8. Microsoft Access
  9. SAP Sybase Adaptive Server Enterprise (ASE)
  10. Informix

这些数据库应用 ODBC 驱动程序来提供拜访接口,从而使开发人员能够在应用不同的数据库时应用雷同的代码拜访数据。

5.1 版本反对了 PDO_ODBC 的协程化反对,借助 ODBC 简直能够反对所有数据库,使得这些数据库也能够运行在 Swoole 协程模式下。

Linux 下须要装置 unixodbc 库来反对 odbc

sudo apt install unixodbc-dev

与其余数据库驱动不同,odbc须要先应用 odbcinst 工具注册数据库。在 Linux 下要配置 /etc/odbcinst.ini 文件实现。

odbcinst.ini

[mysql]
Driver=libmaodbc.so
Description=MariaDB Connector/ODBC(Unicode)
Threading=0
UsageCount=1

配置文件搁置于 /etc/odbcinst.iniDriver=libmaodbc.so就是通知 odbc 应用这个动态链接库作为驱动层。

若要反对其余更多数据库类型,就须要装置该数据库的 ODBC 驱动。例如 MySQL ODBC 驱动能够应用 odbc-mariadb

sudo apt install odbc-mariadb

执行胜利后,就会装置 libmaodbc.so 到零碎库目录中。

mysql_odbc.ini

注册数据库到 ODBC,须要编写一份配置文件,蕴含数据库的主机地址、用户名、明码等信息

[mysql-test]
Description = MySQL test database
Trace = On
TraceFile = stderr
Driver = mysql
SERVER = 127.0.0.1
USER = root
PASSWORD = root
PORT = 3306
DATABASE = test

而后应用 odbcinst 工具注册数据库:

odbcinst -i -d -f ~/mysql-odbc.ini

能够应用 isql 工具执行 SQL

htf@swoole-12:/etc$ isql mysql-test
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> show tables
+-----------------------------------------------------------------+
| Tables_in_test                                                  |
+-----------------------------------------------------------------+
| ckl                                                             |
| custom                                                          |
| firmware                                                        |
| numbers                                                         |
| userinfo                                                        |
+-----------------------------------------------------------------+
SQLRowCount returns 5
5 rows fetched
SQL> 

代码

Co\run(function () {$pdo = new PDO('odbc:mysql-test');
    $statement = $pdo->prepare('show tables');
    $statement->execute();
    var_dump(count($statement->fetchAll(PDO::FETCH_COLUMN)), 1);
});

PDO_SQLITE

SQLite一款轻量级的、开源的、嵌入式关系型数据库管理系统。其最次要的劣势是玲珑、疾速,具备对事务的反对,并且具备可移植性。以下是 SQLite 的一些长处:

  1. 占用资源少:SQLite是一款嵌入式数据库,不须要装置或保护,以一个文件的模式寄存在本地操作系统文件系统上,不须要独立运行一个数据库服务器过程。因而,其占用资源非常少,能够在资源受限的嵌入式设施、挪动设施上运行。
  2. 速度快:SQLite是一款十分疾速的关系型数据库,可能轻松解决中小型数据集。相比于其余传统的关系型数据库,它的读写速度绝对较快。
  3. 对事务的反对:与其余轻量级数据库相比,SQLite对事务的反对十分好,并反对 Acid 属性,能够避免数据失落或损坏。
  4. 可移植性:SQLite 的文件格式是独立于操作系统的,这使得用户可能将其数据库文件从一个操作系统迁徙到另一个操作系统。

在以下状况下能够思考应用 SQLite

  1. 本地数据存储:SQLite 适宜在应用程序中存储本地数据,如挪动应用程序中的用户集体数据、本地设置和缓存等。
  2. 中小型数据量存储:SQLite 适宜存储中小型数据集,例如小型企业或单个用户的数据,而不是利用场景简单或数据集十分大的状况。
  3. 须要进行离线数据读写操作:因为SQLite 的文件格式独立于操作系统,因而能够将数据存储为文件,并在离线状况下进行读写操作。
  4. 疾速原型开发:因为SQLite 易于应用和治理,因而适宜进行疾速原型开发,以便在真正的生产中测试和优化应用程序。

5.1 版本提供了 sqlite 嵌入式数据库的协程客户端反对,同样也是应用 PDO 作为接口层。

编译选项

./configure --enable-swoole-sqlite

须要依赖 libsqlite3-dev

代码实例

go(function() {$db = new PDO('sqlite::memory:');
    $db->exec('create table test (id int)');
    $stmt = $db->prepare('insert into test values(?)');
    $i = 2024;
    $stmt->execute([$i]);
    $stmt = $db->prepare('select id from test where id = ?');
    $stmt->execute([$i]);
    var_dump($stmt->fetch(PDO::FETCH_ASSOC)['id'] == $i);
});

PDO_OCI

Oracle 数据库是美国甲骨文公司研发的大型关系型数据库,在寰球范畴内有很多大型企业应用 Oracle 数据库。电商平台、银行、金融、电信等很多商业我的项目外围零碎应用了 Oracle 数据库。

以下是 Oracle 数据库的一些特点和性能:

  1. 高性能:Oracle 数据库可能解决大量的并发用户申请,并疾速的解决大规模的数据。
  2. 规模性:Oracle 数据库反对大规模的数据库集群和简单的汇聚操作,使得它在大型企业中和要害业务利用中十分受欢迎。
  3. 冗余备份:Oracle 数据库提供弱小的冗余备份和复原性能,反对在线备份和复原、增量备份和复原、点工夫复原等。
  4. 安全性:Oracle 数据库提供用于对数据库进行加密、数据脱敏、访问控制和身份验证的性能。
  5. 灵活性:Oracle 数据库反对多种数据类型和编程语言,并提供了弱小的存储、索引和查问性能。
  6. 高可用性:Oracle 数据库具备高可用性,反对主从同步、主动故障转移和容错性能,这些性能能够确保零碎的连续性和稳定性。
  7. 性能优化:Oracle 数据库提供了丰盛的性能优化性能,并反对各种调优技术,以确保数据库在高负载下稳固运行。

5.1版本提供了原生的 pdo_oci 协程客户端实现。可在协程环境下并发连贯操作 Oracle 数据库。

编译选项

须要减少 --with-swoole-oracle=instantclient,/path/to/instant/client/lib 参数来启用 PDO_OCI 协程客户端。

可在 Oracle 官网下载客户端驱动

apt install -y libaio-dev
apt install -y libaio1
wget -nv https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip
unzip instantclient-basiclite-linuxx64.zip && rm instantclient-basiclite-linuxx64.zip
wget -nv https://download.oracle.com/otn_software/linux/instantclient/instantclient-sdk-linuxx64.zip
unzip instantclient-sdk-linuxx64.zip && rm instantclient-sdk-linuxx64.zip
mv instantclient_*_* ./instantclient
rm ./instantclient/sdk/include/ldap.h
# fix debug build warning: zend_signal: handler was replaced for signal (2) after startup
echo DISABLE_INTERRUPT=on > ./instantclient/network/admin/sqlnet.ora
mv ./instantclient /usr/local/
echo '/usr/local/instantclient' > /etc/ld.so.conf.d/oracle-instantclient.conf
ldconfig

代码实例

Co\run(function () {$db = new PDO('oci:dbname=127.0.0.1:'.$ORACLE_PORT.'/'.$ORACLE_SERVICE_NAME.';charset=AL32UTF8', $ORACLE_USER, $ORACLE_PASSWORD);
    $db->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
    $db->exec("create table test (id int)");
    for($i = 0; $i < 10; $i++) {go(function () use($db, $i){$stmt = $db->prepare("insert into test values (?)");
            $stmt->execute([$i]);
            $stmt = $db->prepare("select id from test where id = ?");
            $stmt->execute([$i]);
            var_dump($stmt->fetch(PDO::FETCH_ASSOC)['id'] == $i);
        });
    }
});

结语

5.1 版本中减少了更多数据库协程客户端的反对,使得 Swoole 协程模式下能够反对多种数据库。

接口上抉择了应用 PDO API,放弃了与 PHP-FPM 的兼容性。无需批改代码,也没有额定的学习老本。

在实现上应用了原生 API + swoole::coroutine::async,基于可伸缩的 AIO 线程池和协程调度 API

这样的形式更加平安强壮,可间接用于生产环境。

正文完
 0