共计 5758 个字符,预计需要花费 15 分钟才能阅读完成。
在 5.1
版本中减少了多种数据库协程客户端的反对,并且全副以 PDO
接口的形式提供,旧的业务代码无需做任何更改即可一键切换为协程模式,异步非阻塞地并发执行。
包含:
pdo_pgsql
pdo_odbc
pdo_sqlite
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-FPM
和 Swoole
,应用并不宽泛。
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
ODBC
(Open Database Connectivity
)是一种为多种数据库管理系统提供对立接口的标准化技术。它是由微软公司提出的,目标是为了实现异构性,使得应用程序可能拜访多种不同类型的数据源。ODBC
的规范定义了应用程序发出请求的 API
,以及由驱动程序提供的响应申请的 API
。ODBC
是一种凋谢的、跨平台的技术,能够在多种操作系统和编程语言中应用。
绝大多数关系型数据库都反对 ODBC
驱动,其中包含:
Microsoft SQL Server
Oracle
IBM DB2
MySQL
PostgreSQL
SQLite
Teradata
Microsoft Access
SAP Sybase Adaptive Server Enterprise (ASE)
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.ini
,Driver=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
的一些长处:
- 占用资源少:
SQLite
是一款嵌入式数据库,不须要装置或保护,以一个文件的模式寄存在本地操作系统文件系统上,不须要独立运行一个数据库服务器过程。因而,其占用资源非常少,能够在资源受限的嵌入式设施、挪动设施上运行。 - 速度快:
SQLite
是一款十分疾速的关系型数据库,可能轻松解决中小型数据集。相比于其余传统的关系型数据库,它的读写速度绝对较快。 - 对事务的反对:与其余轻量级数据库相比,
SQLite
对事务的反对十分好,并反对 Acid 属性,能够避免数据失落或损坏。 - 可移植性:SQLite 的文件格式是独立于操作系统的,这使得用户可能将其数据库文件从一个操作系统迁徙到另一个操作系统。
在以下状况下能够思考应用 SQLite
:
- 本地数据存储:
SQLite
适宜在应用程序中存储本地数据,如挪动应用程序中的用户集体数据、本地设置和缓存等。 - 中小型数据量存储:
SQLite
适宜存储中小型数据集,例如小型企业或单个用户的数据,而不是利用场景简单或数据集十分大的状况。 - 须要进行离线数据读写操作:因为
SQLite
的文件格式独立于操作系统,因而能够将数据存储为文件,并在离线状况下进行读写操作。 - 疾速原型开发:因为
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 数据库的一些特点和性能:
- 高性能:
Oracle
数据库可能解决大量的并发用户申请,并疾速的解决大规模的数据。 - 规模性:
Oracle
数据库反对大规模的数据库集群和简单的汇聚操作,使得它在大型企业中和要害业务利用中十分受欢迎。 - 冗余备份:
Oracle
数据库提供弱小的冗余备份和复原性能,反对在线备份和复原、增量备份和复原、点工夫复原等。 - 安全性:
Oracle
数据库提供用于对数据库进行加密、数据脱敏、访问控制和身份验证的性能。 - 灵活性:
Oracle
数据库反对多种数据类型和编程语言,并提供了弱小的存储、索引和查问性能。 - 高可用性:
Oracle
数据库具备高可用性,反对主从同步、主动故障转移和容错性能,这些性能能够确保零碎的连续性和稳定性。 - 性能优化:
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
。
这样的形式更加平安强壮,可间接用于生产环境。