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

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

1、異步毫秒定時器

  1. swoole_timer_tick:設置一個間隔時鐘定時器,與after定時器不一樣的是tick定時器會持續觸發,直到調用swoole_timer_clear清除。int swoole_timer_tick(int $ms, callable $callback, mixed $user_param)php

    • $ms:單位毫秒
    • $callbackmysql

      • function callbackFunction(int $timer_id, mixed $params = null);
      • $timer_id:定時器的ID,可用於swoole_timer_clear清除此定時器
      • $params:由swoole_timer_tick傳遞的第三個參數
    • $user_param:用戶參數,該參數會被傳遞到callbackFunction中,若是有多個參數可使用數組的形式,也可使用匿名函數的use語法傳遞到回調函數中
  2. swoole_timer_after:在指定的時間後執行函數,須要1.7.7或更高版本。int swoole_timer_after(int $after_time_ms, mixed $callback_function, mixed $user_param);git

    • 是一次性函數,執行完成後就會銷燬
    • $ater_time_ms:最大不超過86400000
  3. swoole_timer_clear:使用定時器ID來刪除定時器。bool swoole_timer_clear(int $timer_id)github

    • $timer_id:定時器ID,調用swoole_timer_tickswoole_timer_after後會返回一個整數的ID
    • 只能用來清除當前進程的定時器
swoole中定時器的例子:
# 先打印start,每隔2s打印tick回調函數中的內容,打印start後5s打印after中的內容
swoole_timer_tick(2000, function($timer_id,) {
    echo "2s : timer_id-{$timer_id}";
});
$data = ['name' => 'ronaldo'];
swoole_timer_after(5000, function($timer_id) use ($data) {
    print_r("5s : data - {$data}");
});
echo 'start';

2、異步文件系統

  1. swoole_async_readfile,異步讀取文件內容redis

    • 函數風格:swoole_async_readfile(string $filename, mixed $callback);
    • 命名空間風格:Swoole\Async::readFile(string $filename, mixed $callback);
    • 文件不存在會返回false
    • 成功打開文件當即返回true
    • 數據服務完畢後會回調指定的callback函數
    • callback參數:$filename$content
swoole_async_readfile會將文件內容所有複製到內存,因此不能用於大文件的讀取,若是想讀取大文件,使用 swoole_async_read
swoole_async_readfile最大可讀取 4M的文件,受限於 SW_AIO_MAX_FILESIZE
// 異步讀取文件
$result = swoole_async_readfile($filename, function ($filename, $content) {
    echo "filename : {$filename}" . PHP_EOL;
    echo "content : {$content}" . PHP_EOL;
});

echo 'start'.PHP_EOL;
var_dump($result);
  1. swoole_async_writefile,異步寫文件sql

    • 函數風格:swoole_async_writefile(string $filename, string $fileContent, callable $callback = null, int falgs = 0);
    • 命名空間風格:Swoole\Async::writeFile(string $filename, string $fileContent, callable $callback = null, int falgs = 0);
    • $filename:文件名,必須有寫權限,文件不存在會自動建立。打開文件失敗會返回false
    • $fileContent:最大可寫入4M
    • $callback:可選
    • $falgs:寫入選項,使用FILE_APPEND表示追加到文件末尾
    • 若是文件已存在,底層會覆蓋舊的文件內容
經常使用於寫日誌
// 異步寫文件
$content = date('Y-m-d H:i:s') . PHP_EOL;
$filename = __DIR__ . '/test.txt';
Swoole\Async::writeFile($filename, $content, function ($filename) {
    echo "write {$filename} success" . PHP_EOL;
}, FILE_APPEND);

echo 'start' . PHP_EOL;

3、異步Mysql

一、 swoole_mysql->connect(array $serverConfig, callable $callback)
// 回調
function callback(swoole_mysql $db, bool $result);
// 配置
$serverConfig= array(
    'host' => '127.0.0.1',
    'user' => 'root',
    'password' => '123456',
    'database' => 'test',
    'charset' => 'utf8',
);
二、 function swoole_mysql->query($sql, callable $callback);
  • function callback(swoole_mysql $link, mixed $result);vim

    • 執行失敗,$resultfalse,讀取$link對象的error屬性得到錯誤信息,errno屬性得到錯誤碼
    • 執行成功,SQL爲非查詢語句,$resulttrue,讀取$link對象的affected_rows屬性得到影響的行數,insert_id屬性得到Insert操做的自增ID
    • 執行成功,SQL爲查詢語句,$result爲結果數組
三、異步鏈接mysql 的一個小實例
class AsyncMysql {

    private $dbSource = null;
    private $dbConfig = null;
    public function __construct()
    {
        $this->dbSource = new swoole_mysql;
        $this->dbConfig = [
            'host' => '127.0.0.1',
            'port' => 3306,
            'user' => 'root',
            'password' => '123456',
            'database' => 'test',
            'charset' => 'utf8', //指定字符集
            'timeout' => 2,  // 可選:鏈接超時時間(非查詢超時時間),默認爲SW_MYSQL_CONNECT_TIMEOUT(1.0)
        ];
    }

    public function execute($id, $name)
    {
        // 鏈接mysql
        $this->dbSource->connect($this->dbConfig, function ($db, $result) use ($id, $name) {
            if ($result === false) {
                var_dump($db->error, $db->errno);
                die;
            }
            $sql = "UPDATE `student` SET `name` = '{$name}' WHERE `id` = {$id}";
            $db->query($sql, function ($db, $result) {
                if ($result === false) {
                    var_dump($db->connect_error);
                } elseif ($result === true) { // sql爲非查詢語句
                    echo "執行非查詢語句\n";
                    var_dump($db->affected_rows);
                } else { // sql爲查詢語句
                    echo "執行查詢語句\n";
                    print_r($result);
                }
                $db->close();
            });
        });
    }
    
}

$obj = new AsyncMysql();
$obj->execute(1, 'ronaldo7');
echo "start\n";

異步Redis

  1. redis服務安裝數組

    • redis服務bash

      • 去redis官網下載redis包
      • tar -zxvf redis-4.0.9.tar.gz
      • cd redis-4.0.9
      • make
      • cd src
      • ./redis-server,便可開啓redis服務
      • ./redis-cli,可鏈接redis服務
    • hiredis庫服務器

      • hiredis下載地址
      • unzip hiredis-0.13.3.zip
      • 若是你沒有unzip,能夠執行yum install -y unzip zip
      • cd hiredis-0.13.3.zip
      • make -j
      • sudo make install
      • sudo ldconfig
    • 編譯swoole須要加入-enable-async-redis

      • cd swoole
      • ./configure --with-php-config=/opt/soft/php/bin/php-config --enable-async-redis
      • make clean
      • make -j
      • sudo make install
  2. 查看安裝是否成功

    • 查看swoole是否存在:php -m

      • 若是不存在的話vim ~/.bash_profile
      • 加入一行:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
      • 再:source ~/.bash_profile,便可
    • 查看異步的redis是否支持:php --ri swoole

      • 若是存在:async redis client => enabled,代表支持
  3. redis經常使用方法

    • function swoole_redis->__construct(array $options = null);

      • $option配置選項數組,默認爲null
    • function swoole_redis->connect(string $host, int $port, callable $callback);

      • $host:redis服務器的主機IP
      • $port:redis服務器的端口
      • $callback:回調函數

        • function onConnect(swoole_redis $redis, bool $result);
        • $result:鏈接成功爲true,鏈接失敗爲false,能夠讀取$redis->errCode得到錯誤碼,讀取$redis->errMsg得到錯誤消息
    • function swoole_redis->close();
異步redis實例
$redisClient = new swoole_redis();
$redisClient->connect('127.0.0.1', 6379, function (swoole_redis $redis, $result) {
    echo "connect : {$result} \n";
//    $redis->set('name1', 'ronaldo', function (swoole_redis $redis, $result) {
//        echo "set : {$result} \n";
//        $redis->close();    
//    });
    $redis->keys('*', function (swoole_redis $redis, $result) {
        var_dump($result);
        $redis->close();
    });
});

echo 'start' . PHP_EOL;
相關文章
相關標籤/搜索