官方文档里的异步回调函数已经在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
注意:
swoole2.0
的才需要执行下面的hiredis
安装!- 安装
redis
服务. - 安装
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 事务
multi
启动事物.将下面所有的动作都加入到队列进行等待.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"
}