swoole——從入門到放棄(三)

swoole——從入門到放棄(三)

1、進程

  • swoole_process Swoole\Process
  • swoole_process::__construct(callable $function, $redirect_stdin_stdout = false, $create_pipe = true);php

    • $function:子進程建立成功後要執行的函數
    • $redirect_stdin_stdout:重定向子進程的標準輸入和輸出。啓用此選項後,在子進程內輸出內容將不是打印屏幕,而是寫入到主進程管道。讀取鍵盤輸入將變爲從管道中讀取數據。默認爲阻塞讀取。
    • $create_pipe:是否建立管道,啓用$redirect_stdin_stdout後,此選項將忽略用戶參數,強制爲true。若是子進程內沒有進程間通訊,能夠設置爲 false
  • bool swoole_process->exec(string $execfile, array $args)redis

    • $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 Swoole\process(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();

2、內存

swoole_table一個基於共享內存和鎖實現的超高性能,併發數據結構。用於解決多進程/多線程數據共享和同步加鎖問題。
  • swoole_table->__construct(int $size, float $conflict_proportion = 0.2)swoole

    • $size參數指定表格的最大行數,若是不是2的N次方,底層會自動調整爲一個接近的數字,若是小於1024,默認爲1024
  • bool swoole_table->column(string $name, int $type, int $size = 0);內存表增長一列數據結構

    • $name指定字段的名稱
    • $type指定字段類型:swoole_table::TYPE_INTswoole_table::TYPE_FLOATswoole_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);

3、協程

協程能夠理解爲純用戶態的線程,其經過 協做而不是搶佔來進行切換。相對於進程或者線程,協程全部的操做均可以在用戶態完成,建立和切換的消耗更低。
  • 優點:併發

    1. 開發者能夠無感知的用同步的代碼編寫方式達到異步IO的效果和性能,避免了傳統異步回調所帶來的離散的代碼邏輯和陷入多層回調中致使代碼沒法維護。
    2. 同時因爲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 Swoole\Coroutine\Redis();
    $redis->connect('0.0.0.0', 6379);
    $rtn = $redis->get($request->get['a']);

    $response->header('Content-Type', 'text/plain');
    $response->end($rtn);
});
$http->start();
相關文章
相關標籤/搜索