swoole——從入門到放棄(三)
一、程式
-
swoole_process
SwooleProcess
-
swoole_process::__construct(callable $function, $redirect_stdin_stdout = false, $create_pipe = true);
-
$function
:子程式建立成功後要執行的函式 -
$redirect_stdin_stdout
:重定向子程式的標準輸入和輸出。啟用此選項後,在子程式內輸出內容將不是列印螢幕,而是寫入到主程式管道。讀取鍵盤輸入將變為從管道中讀取資料。預設為阻塞讀取。 -
$create_pipe
:是否建立管道,啟用$redirect_stdin_stdout
後,此選項將忽略使用者引數,強制為true
。如果子程式內沒有程式間通訊,可以設定為false
-
-
bool swoole_process->exec(string $execfile, array $args)
-
$execfile
指定可執行檔案的絕對路徑,如"/usr/bin/php"
-
$args
是一個陣列,是exec
的引數列表,如array(`test.php`, 123)
,相當與php test.php 123
-
-
function swoole_process->start() : int
:執行fork系統呼叫,啟動程式 -
array swoole_process::wait(bool $blocking = true);
:回收結束執行的子程式$result = array(`code` => 0, `pid` => 15001, `signal` => 15);
-
$blocking
引數可以指定是否阻塞等待,預設為阻塞 - 操作成功會返回一個陣列包含子程式的PID、退出狀態碼、被哪種訊號KILL
- 失敗返回
false
process
小例項
$process = new Swooleprocess(function (swoole_process $pro) {
// 子程式啟用http服務
$pro->exec(`/opt/soft/php/bin/php`, [__DIR__ . `/../http/http.php`]);
}, true);
$pid = $process->start();
echo $pid . PHP_EOL;
// 回收程式
$process->wait();
二、記憶體
swoole_table一個基於共享記憶體和鎖實現的超高效能,併發資料結構。用於解決多程式/多執行緒資料共享和同步加鎖問題。
-
swoole_table->__construct(int $size, float $conflict_proportion = 0.2)
-
$size
引數指定表格的最大行數,如果不是2的N次方,底層會自動調整為一個接近的數字,如果小於1024,預設為1024
-
-
bool swoole_table->column(string $name, int $type, int $size = 0);
記憶體表增加一列-
$name
指定欄位的名稱 -
$type
指定欄位型別:swoole_table::TYPE_INT
,swoole_table::TYPE_FLOAT
,swoole_table::TYPE_STRING
-
$size
字串必須指定長度
-
-
function swoole_table->create() : bool;
建立記憶體表 -
swoole_table->set(string $key, array $value)
-
$key
相同的key會覆蓋 -
$value
必須是一個陣列
-
-
function swoole_table->incr(string $key, string $column, mixed $incrby = 1);
原子自增操作 -
function swoole_table->decr(string $key, string $column, mixed $decrby = 1);
原子自減操作 -
array swoole_table->get(string $key, string $field = null);
獲取一行資料 -
bool swoole_table->exist(string $key);
檢查table中是否存在某一個key -
bool swoole_table->del(string $key)
刪除資料 -
int function swoole_table->count();
返回table中存在的條目數
swoole_table簡單的CURD例項
$table = new swoole_table(1024);
$table->column(`id`, swoole_table::TYPE_INT);
$table->column(`name`, swoole_table::TYPE_STRING, 16);
$table->column(`age`, swoole_table::TYPE_INT);
$table->create();
// 第一種設定、獲取方式
$table->set(`ronaldo`, [`id` => 1, `name` => `ronaldo`, `age` => 32]);
$table->incr(`ronaldo`, `age`, 2); // 原子自增
$rtn1 = $table->get(`ronaldo`);
print_r($rtn1);
// 第二種設定、獲取方式
$table[`ronaldo2`] = [`id` => 2, `name` => `ronaldo2`, `age` => 28];
$table->decr(`ronaldo2`, `age`, 2); // 原子自減
$table->del(`ronaldo`); // 刪除列
$rtn2 = $table[`ronaldo2`];
print_r($table[`ronaldo`]);
print_r($rtn2);
三、協程
協程可以理解為純使用者態的執行緒,其通過協作而不是搶佔來進行切換。相對於程式或者執行緒,協程所有的操作都可以在使用者態完成,建立和切換的消耗更低。
-
優勢:
- 開發者可以無感知的用同步的程式碼編寫方式達到非同步IO的效果和效能,避免了傳統非同步回撥所帶來的離散的程式碼邏輯和陷入多層回撥中導致程式碼無法維護。
- 同時由於swoole是在底層封裝了協程,所以對比傳統的php層協程框架,開發者不需要使用yield關鍵詞來標識一個協程IO操作,所以不再需要對yield的語義進行深入理解以及對每一級的呼叫都修改為yield,這極大的提高了開發效率。
協程操作redis例項
$http = new swoole_http_server(`0.0.0.0`, 9501);
$http->on(`request`, function ($request, $response) {
$redis = new SwooleCoroutineRedis();
$redis->connect(`0.0.0.0`, 6379);
$rtn = $redis->get($request->get[`a`]);
$response->header(`Content-Type`, `text/plain`);
$response->end($rtn);
});
$http->start();