# Table
swoole_table一個基于共享內存和鎖實現的超高性能,并發數據結構。用于解決多進程/多線程數據共享和同步加鎖問題。
>最新版本已移除lock和unlock方法,請使用Swoole\Lock來實現數據同步
## swoole_table的優勢
* 性能強悍,單線程每秒可讀寫200萬次
* 無需加鎖,swoole_table內置行鎖自選鎖,所有操作均是多線程/多進程安全。用戶層完全不需要考慮數據同步問題。
* 支持多進程,swoole_table可以用于多進程之間共享數據
>swoole_table使用行鎖,而不是全局鎖,僅當2個進程在同一CPU時間,并發讀取同一條數據才會進行發生搶鎖
>swoole_table在1.7.5版本后可用
# 常量列表
swoole_table 目前只支持以下3種類型,個人感覺有點兒類似于表字段類型。
* swoole_table::TYPE_INT 整形字段
* swoole_table::TYPE_FLOAT 浮點字段
* swoole_table::TYPE_STRING 字符串字段
# 函數列表
* [__construct](#__construct)
* [column](#column)
* [create](#create)
* [set](#set)
* [get](#get)
* [del](#del)
* [lock](#lock)
* [unlock](#unlock)
## __construct
**功能描述**:內存表構造函數,創建內存表對象對象。
**函數原型**:
```php
swoole_table->__construct(int $size)
```
**返回**:一個swoole_table對象。
**參數說明**:
| 參數 | 說明 |
| -------- | -------- |
| int size | 表格的最大行數 |
**說明**:
* 創建對象后會創建一個Mutex鎖。
* $table->lock()/$table->unlock() 在這之后即可使用。
> swoole_table基于行鎖,所以單次set/get/del在多線程/多進程的環境下是安全的
set/get/del是原子操作,用戶代碼中不需要擔心數據加鎖和同步的問題
**樣例**:
```php
$table = new swoole_table(1024);
```
## column
**功能描述**:給內存表增加一列
**函數原型**:
```php
bool swoole_table->column(string $name, int $type, $size);
```
**參數說明**:
| 參數 | 說明 |
| -------- | -------- |
| string name | 新增的字段名稱 |
| int type | swoole_table支持的3種字段類型,詳情見[常量列表](#%E5%B8%B8%E9%87%8F%E5%88%97%E8%A1%A8) |
| int size | 這是根據type的不同占用的字節數 |
**說明**:
> swoole_table::TYPE_INT默認為4個字節,可以設置1,2,4,8一共4種長度
swoole_table::TYPE_STRING設置后,set操作不能設置的值不能超過此長度
swoole_table::TYPE_FLOAT會占用8個字節的內存
**樣例**:
```php
$table->column('id', swoole_table::TYPE_INT, 4);
```
## create
**功能描述**:創建內存表。
**函數原型**:
```php
swoole_table->create()
```
**說明**:
創建好表的結構后,執行create后創建表。
> swoole_table使用共享內存來保存數據,在創建子進程前,務必要執行swoole_table->create()
swoole_server中使用swoole_table,swoole_table->create() 必須在swoole_server->start()前執行
**樣例**:
```php
$table = new swoole_table(1024);
$table->column('id', swoole_table::TYPE_INT, 4); //1,2,4,8
$table->column('name', swoole_table::TYPE_STRING, 64);
$table->column('num', swoole_table::TYPE_FLOAT);
$table->create();
$worker = new swoole_process('child1', false, false);
$worker->start();
```
## set
**功能描述**:設置行的數據,(swoole_table使用key-value的方式來訪問數據,個人感覺key類似于db表記錄的id,value則是整條記錄的所有列的值。)
**函數原型**:
```php
swoole_table->set(string $key, array $value)
```
**參數說明**:
| 參數 | 說明 |
| -------- | -------- |
| string key | 數據的key,相同的$key對應同一行數據,如果set同一個key,會覆蓋上一次的數據 |
| array $value | 必須是一個數組,value中的鍵名必須與字段定義的$name完全相同 |
**說明**:
> swoole_table->set() 可以設置全部字段的值,也可以只修改部分字段
swoole_table->set() 未設置前,該行數據的所有字段均為空
## get
**功能描述**:獲取一行數據。
**函數原型**:
```php
array swoole_table->get($key);
```
**返回**:
* 如果找到則返回array 數組。
* 如果$key不存在,將返回false。
## del
**功能描述**:刪除一行數據。
**函數原型**:
```php
bool swoole_table->del(string $key)
```
**返回**:
* $key對應的數據不存在,將返回false。
* 成功刪除返回true
## lock
**功能描述**:鎖定整個表。
**函數原型**:
```php
swoole_table->lock()
```
**使用場景**:當多個進程同時要操作一個事務性操作時,一定要加鎖,將整個表鎖定。操作完成后釋放鎖。
**說明**:
* lock() 是互斥鎖,所以只能保護lock/unlock中間的代碼是安全的。lock/unlock之外的操作是不能保護的。
* set/get/del操作不使用互斥鎖,所以lock之后無法阻止其他進程調用這些函數。
**注意**:
> lock/unlock必須成對出現,否則會發生死鎖,這里務必要小心
lock/unlock之間不應該加入太多操作,避免鎖的粒度太大影響程序性能
lock/unlock之間的代碼,應當try/catch避免拋出異常導致跳過unlock發生死鎖
## unlock
**功能描述**:釋放鎖。
**函數原型**:
```php
swoole_table->unlock()
```
## 整體使用案例
```php
$table = new swoole_table(1024);
$table->column('id', swoole_table::TYPE_INT, 4); //1,2,4,8
$table->column('name', swoole_table::TYPE_STRING, 64);
$table->column('num', swoole_table::TYPE_FLOAT);
$table->create();
$table->set('tianfenghan@qq.com', array('id' => 145, 'name' => 'rango', 'num' => 3.1415));
$table->set('350749960@qq.com', array('id' => 358, 'name' => "Rango1234", 'num' => 3.1415));
$table->set('hello@qq.com', array('id' => 189, 'name' => 'rango3', 'num' => 3.1415));
$data = $table->get('350749960@qq.com');
$table->del('hello@qq.com');
$table->lock();
/**
事務性處理。
**/
$table->unlock();
count($table); // 獲得有多少條記錄。
```
## 遍歷Table
swoole_table類實現了迭代器和Countable接口,可以使用foreach進行遍歷,使用count計算當前行數。
>遍歷Table 依賴pcre 如果發現無法遍歷table,檢查機器是否安裝pcre-devel
~~~
foreach($table as $row)
{
var_dump($row);
}
echo count($table);
~~~
- 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