官方文档里的异步回调函数已经在swoole4.3版本后移除改用协程.在文档的Coroutine中.注意自己的版本哈.可通过终端命令php --ri swoole查看自己当前Swoole版本.

注意事项

 官方文档的redis协程实例

go(function () {
    $redis = new Swoole\Coroutine\Redis();
    $redis->connect('127.0.0.1', 6379);
    $val = $redis->get('key');
});

注意:如果不在go(function(){})中执行Coroutine会报如下错误

[2019-06-24 15:11:27 @11374.0]    ERROR    (PHP Fatal Error: 10001):
Swoole\Coroutine\Redis::connect: API must be called in the coroutine

 这就会有人那么了这个go到底是个什么呢?为什么非要写在go函数中呢?其实go()是创建协程的一个缩写.

function Swoole\Coroutine::create(callable $function, ...$args) : int|false;
function go(callable $function, ...$args) : int|false; // 短名API

Coroutine Mysql

使用

class coroutineMysql
{
    public $database = '';
    public $db_conf = '';

    public function __construct()
    {

        $this->database = new Swoole\Coroutine\MySQL();
        $this->db_conf = ([
            'host' => '127.0.0.1',
            'port' => 3306,
            'user' => 'root',
            'password' => 'root',
            'database' => 'test'
        ]);
    }
  
    public function execut($id, $user_id)
    {
        go(function() use ($id,$user_id){
            $this->database->connect($this->db_conf);
            $sql = "select * from orders where user_iad = " . $user_id;
            $rst = $this->database->query($sql);
            // 打印查询出来的结果集
            print_r($rst);
            $this->database->close();
        });
        return '你好';

    }
}

$sel = new coroutineMysql();
echo $sel->execut(1, 4);

 在construct方法中我们先去实例话协程mysql,然后设置数据库的配置

 如果是正常的php顺序将会输出数据后再输出你好。可最后是先输出的你好后输出的数据库数据.

你好Array
(
)

 对于数据库操作的返回值分为两类:一个是boole类型(增删改),一个是结果集.所以需要对返回值进行判断.稍作修改~

$rst = $this->database->query($sql);
if($rst === false){
    // 输出执行错误.为了方便查看,业务中不可这样!
    echo $this->database->error;
    echo '修改或添加失败';
}elseif($rst === true){
    echo '修改或添加成功';
}else{
    // 打印查询出来的结果集
    print_r($rst);
}

 执行结果

你好Unknown column 'user_iad' in 'where clause'修改或添加失败

 打错了..不要在意这个错误.没有问题的~

Coroutine Redis

注意:

  1. swoole2.0的才需要执行下面的hiredis安装!
  2. 安装redis服务.
  3. 安装hiridis库(最终编译成so文件来使用).

编译swoole需要加入 -enable-async-redis.

安装hiridis库

 地址:https://github.com/redis/hiredis

cd /data/softpackage
git clone https://github.com/redis/hiredis.git
cd hiredis/
sudo make
sudo make install
sudo ldconfig

-- swoole4.0一下需要设置redis,重新编译安装swoole
-- swoole版本4.0以上不需要重新编译

# 查找php-config
find / -name php-config
# 返回
/usr/local/php/bin/php-config
cd /data/softpackage/swoole-src/
./configure --with-php-config=/usr/local/php/bin/php-config --enable-async-redis

使用

class coroutineRedis
{
    public $redis_server = '';
    public $redis_config = '';

    public function __construct()
    {
        $this->redis_config = [
            'host' => '127.0.0.1',
            'port' => 6379
        ];
        go(function () {
            $this->redis_server = new Swoole\Coroutine\Redis();
            $link = $this->redis_server->connect($this->redis_config['host'], $this->redis_config['port']);
            if (!$link) {
                return '链接失败' . PHP_EOL;;
            }
            return '链接成功' . PHP_EOL;;
        });
    }

    public function set()
    {
        go(function () {
            $this->redis_server->set('gy', 1);
            $this->redis_server->close();
        });
    }

    public function get()
    {
        echo '开始获取' . PHP_EOL;
        go(function () {
            echo '获取结果' . $this->redis_server->get('gy');
        });
        echo '正在获取' . PHP_EOL;;
        $this->redis_server->close();
    }

}

$a = new coroutineRedis();
//$a->set();
$a->get();
echo 'hello' . PHP_EOL;

 结果

开始获取
正在获取
hello
获取结果1

Redis 事务

  1. multi启动事物.将下面所有的动作都加入到队列进行等待.
  2. exec执行事务中所有的操作.并一次返回所有的结果
public function begin()
{
    go(function (){
        $this->redis_server->multi();
        $this->redis_server->set('guoyi',2);
        $this->redis_server->get('gy');
        $this->redis_server->get('guoyi');
        $result = $this->redis_server->exec();
        $this->redis_server->close();
        var_dump($result);
    });
}

 结果

hello
array(3){
    [0]=>
    bool(true)
    [1]=>
    string(1) "1"
    [2]=>
    string(1) "2"
}
Last modification:February 18th, 2020 at 10:21 pm