# 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