# mysql client
Swoole在1.8.6版本提供了全新的异步MySQL客户端,底层自行实现了MySQL的通信协议,无需依赖其他第三方库,如libmysqlclient、mysqlnd、mysqli等。
[TOC=2,3]
## **swoole_mysql->construct**
创建异步mysql客户端。
## **swoole_mysql->on**
设置事件回调函数。目前仅支持onClose事件回调。
~~~
function swoole_mysql->on($event_name, callable $callback);
~~~
**onClose事件**
当连接关闭时回调此函数。
~~~
$db->on('Close', function($db){
echo "MySQL connection is closed.\n";
});
~~~
## **swoole_mysql->connect**
异步连接到MySQL服务器。
~~~
function swoole_mysql->connect(array $serverConfig, callable $callback);
~~~
$serverConfig为MySQL服务器的配置,必须为关联索引数组
$callback连接完成后回调此函数
服务器配置
~~~
$server = array(
'host' => '192.168.56.102',
'user' => 'test',
'password' => 'test',
'database' => 'test',
'charset' => 'utf8',
);
~~~
* host MySQL服务器的主机地址,支持IPv6(::1)和UnixSocket(unix:/tmp/mysql.sock)
* port MySQL服务器监听的端口,选填,默认为3306
* user 用户名,必填
* password 密码,必填
* database 连接的数据库,必填
* charset 设置客户端字符集,选填,默认使用Server返回的字符集。如果字符串不存在,底层会抛出Swoole\MySQL\Exception异常
**回调函数**
~~~
function onConnect(swoole_mysql $db, bool $result);
~~~
* $db 为swoole_mysql对象
* $result 连接是否成功,只有为true时才可以执行query查询
* $result 为false,可以通过connect_errno和connect_error得到失败的错误码和错误信息
## **swoole_mysql->escape**
转义SQL语句中的特殊字符,避免SQL注入攻击。底层基于mysqlnd提供的函数实现,`需要依赖PHP的mysqlnd扩展`。
* 编译时需要增加--enable-mysqlnd来启用,如果你的PHP中没有mysqlnd将会出现编译错误
* 必须在connect完成后才能使用
* 客户端未设置字符集时默认使用Server返回的字符集设置,可在connect方法中加入charset修改连接字符集
>此方法在1.9.6或更高版本可用
~~~
function swoole_mysql->escape(string $str) : string
~~~
**使用实例**
~~~
$db = new swoole_mysql;
$server = array(
'host' => '127.0.0.1',
'user' => 'root',
'password' => 'root',
'database' => 'test',
);
$db->connect($server, function ($db, $result) {
$data = $db->escape("abc'efg\r\n");
});
~~~
## **swoole_mysql->query**
执行SQL查询。
~~~
function swoole_mysql->query($sql, callable $callback);
~~~
* $sql为要执行的SQL语句
* $callback执行成功后会回调此函数
* 每个MySQLi连接只能同时执行一条SQL,必须等待返回结果后才能执行下一条SQL
**回调函数**
~~~
function onSQLReady(swoole_mysql $link, mixed $result);
~~~
* 执行失败,$result为false,读取$link对象的error属性获得错误信息,errno属性获得错误码
* 执行成功,SQL为非查询语句,$result为true,读取$link对象的affected_rows属性获得影响的行数,insert_id属性获得Insert操作的自增ID
* 执行成功,SQL为查询语句,$result为结果数组
**事务处理**
在Swoole\MySQL中执行下列SQL语句可以实现事务处理。
* 启动事务:START TRANSACTION
* 提交事务:COMMIT
* 回滚事务:ROLLBACK
## **swoole_mysql->begin**
启动事务。函数原型:
~~~
function swoole_mysql->begin(callable $callback);
~~~
启动一个MySQL事务,事务启动成功会回调指定的函数
与commit和rollback结合实现MySQL事务处理
* 同一个MySQL连接对象,同一时间只能启动一个事务
* 必须等到上一个事务commit或rollback才能继续启动新事务
* 否则底层会抛出Swoole\MySQL\Exception异常,异常code为21
>事务处理在1.9.15或更高版本可用
**使用实例**
~~~
$db->begin(function( $db, $result) {
$db->query("update userinfo set level = 22 where id = 1", function($db, $result) {
$db->rollback(function($db, $result) {
echo "commit ok\n";
});
});
});
~~~
## **swoole_mysql->commit**
提交事务。
~~~
function swoole_mysql->commit(callable $callback);
~~~
* 提交事务,当服务器返回响应时回调此函数
* 必须先调用begin启动事务才能调用commit否则底层会抛出Swoole\MySQL\Exception异常
* 异常code为22
>在1.9.15或更高版本可用
**使用实例**
```
$db->begin(function( $db, $result) {
$db->query("update userinfo set level = 22 where id = 1", function($db, $result) {
$db->commit(function($db, $result){
echo "commit ok\n";
});
});
});
```
## **swoole_mysql->rollback**
回滚事务。
~~~
function swoole_mysql->rollback(callable $callback);
~~~
* 必须先调用begin启动事务才能调用rollback否则底层会抛出Swoole\MySQL\Exception异常
* 异常code为22
## **swoole_mysql->close**
关闭MySQL连接。
~~~
function swoole_mysql->close();
~~~
**异步mysql客户端**
```php
global $mysql;
$mysql = new Mysql;
$server = array(
'host' => '192.168.56.102',
'port' => 3306,
'user' => 'test',
'password' => 'test',
'database' => 'test',
'charset' => 'utf8', //指定字符集
'timeout' => 2, // 可选:连接超时时间(非查询超时时间),默认为SW_MYSQL_CONNECT_TIMEOUT(1.0)
);
$mysql->connect($server, function (Mysql $db, $r) {
if ($r === false) {
var_dump($db->connect_errno, $db->connect_error);
die;
}
});
$sql = 'show tables';
$mysql->query($sql, function (Mysql $db, $r) {
if ($r === false) {
var_dump($db->error, $db->errno);
} elseif ($r === true) {
var_dump($db->affected_rows, $db->insert_id);
}
var_dump($r);
});
- swoole简介
- swoole功能概述
- 序章
- 开发必读
- 1 环境搭建
- 1.1 环境搭建
- 1.2 搭建Echo服务器
- 2 初识Swoole
- 2.1 Worker进程
- 2.2 TaskWorker进程
- 2.3 Timer定时器
- 2.4 Process进程
- 2.5 Table内存表
- 2.6 多端口监听
- 2.7 sendfile文件支持
- 2.8 SSL支持
- 2.9 热重启
- 2.10 http_server
- 附录*server配置
- 附录*server函数
- 附录*server属性
- 附录*server回调函数
- 附录*server高级特性
- 心跳检测
- 3 Swoole协议
- 3.1 EOF协议
- 3.2 固定包头协议
- 3.3 Http协议
- 3.4 WebSocket协议
- 3.5 MTQQ协议
- 内置http_server
- 内置websocket_server
- Swoole\Redis\Server
- 4 Swoole异步IO
- 4.1 AsyncIO
- 异步文件系统IO
- swoole_async_readfile
- swoole_async_writefile
- swoole_async_read
- swoole_async_write
- 5 swoole异步客户端
- ws_client
- http_client
- mysql_client
- redis_client
- tcp_client
- http2_client
- 6 swoole协程
- Swoole\Coroutine\Http\Client
- Swoole\Coroutine\MySQL
- Swoole\Coroutine\Redis
- Coroutine\PostgreSQL
- Swoole\Coroutine\Client
- Swoole\Coroutine\Socket
- Swoole\Coroutine\Channel
- Coroutine
- Swoole\Coroutine::create
- Swoole\Coroutine::resume
- Swoole\Coroutine::suspend
- Swoole\Coroutine::sleep
- Coroutine::getaddrinfo
- Coroutine::gethostbyname
- swoole_async_dns_lookup_coro
- Swoole\Coroutine::getuid
- getDefer
- setDefer
- recv
- Coroutine::stats
- Coroutine::fread
- Coroutine::fget
- Coroutine::fwrite
- Coroutine::readFIle
- Coroutine::writeFIle
- Coroutine::exec
- 7 swoole_process
- process::construct
- process::start
- process::name
- process::signal
- process::setaffinity
- process::exit
- process::kill
- process::daemon
- process->exec
- process::wait
- process::alarm
- 8 swoole定时器
- swoole_timer_tick
- swoole_timer_after
- swoole_timer_clear
- 9 swoole_event
- swoole_event_add
- swoole_event_set
- swoole_event_del
- swoole_event_wait
- swoole_event_defer
- swoole_event_write
- swoole_event_exit
- swoole提供的function
- 常见问题
- 客户端链接失败原因
- 如何设置进程数
- 如何实现异步任务
- 如何选择swoole三种模式
- php中哪些函数是阻塞的
- 是否可以共用1个redis或mysql连接
- 如何在回调函数中访问外部的变量
- 为什么不要send完后立即close
- 不同的Server程序实例间如何通信
- MySQL的连接池、异步、断线重连
- 在php-fpm或apache中使用swoole
- 学习Swoole需要掌握哪些基础知识
- 在phpinfo中有在php-m中没有
- 同步阻塞与异步非阻塞选择
- CURL发送POST请求服务器端超时
- 附录
- 预定义常量
- 内核参数调优
- php四种回调写法
- 守护进程程序常用数据结构
- swoole生命周期
- swoole_server中内存管理机制
- 使用jemalloc优化swoole内存分配性能
- Reactor、Worker、Task的关系
- Manager进程
- Swoole的实现
- Reactor线程
- 安装扩展
- swoole-worker手册
- swoole相关开源项目
- 写在后面的话
- 版本更新记录
- 4.0