
正文
swoole学习--登录模块
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
使用swoole+thinkphp6.0+redis 结合开发的登录模块,做完之后有几点感悟:
1.不要相信任务数据,包括请求的外部接口,特别是超时者部分,尽可能的交给task完成。
2.原来可以在入口文件哪里使用超全局变量声明已经实例化的server服务对象,然后就其他文件使用了。
3.异步任务(协程)里面不能再异步(开启协程任务),只能是同步(task任务下,redis只能使用同步的模式,使用异步的模式会出错!)。
4.在使用task任务下,不能使用thinkphp6.0里面的门面(Facade),报错原因是因为找不到这个类(因为没有加载到这里)。
5.所有耗时的任务叫交给task完成。
6.使用同步redis下的单例模式,指的是同一个请求下只连接一次,后面在这个请求里面不断重复的都是这个实例,如:
<?php
namespace app\common\controller;
use think\facade\Config;
use app\common\controller\Redis;//redis单例模式
class Predis
{
public $redis;
/**
* 定义单例模式的变量
*/
private static $_instance = null; public function __construct()
{
$this -> redis = new \Redis();
//$result = $this -> redis->connect(Config::get('redis.host'), Config::get('redis.port'), Config::get('redis.timeOut'));
$result = $this -> redis->connect('127.0.0.1', , ); if($result === false)
{
throw new \Exception('redis connect error');
}
} /**
* 1、单例类只能有一个实例。
* 2、单例类必须自己创建自己的唯一实例。
* 3、单例类必须给所有其他对象提供这一实例。
*/
public static function getInstance()
{
if(empty(self::$_instance))
{
self::$_instance = new self();
} return self::$_instance;
} /**
* 存储数据
*/
public function set($key, $value, $time=)
{
if(empty($key))
{
return "";
} if(is_array($value))
{
$value = json_encode($value);
} if(!$time)
{
return $this -> redis -> set($key, $value);
} return $this -> redis -> setex($key, $time, $value);
} /**
*获取数据
*/
public function get($key)
{
if(empty($key))
{
return "";
} $res = $this -> redis -> get($key);
return $res; }}
使用:
Predis::getInstance()->set(Redis::smsKey($data['phone']), $data['code']);
7.在整理task功能的时候,有注意到一个有趣的事情:就是通过一个变量值来调用这个对象的方法,如:
$obj = new app\common\task\Task();
$method = $data['method'];
if(empty($method))
{
return "method for null";
}
$flag = $obj -> $method($data['data']);
8.能面向对象的就尽量面向对象,尽可能避免面向过程,主要是对以后维护不好维护。
9.如果需要task来处理事情的话,记得在set的时候写明task是多少,不然无法开启task任务,如:
$this->http->set(
[
'enable_static_handler' => true,
'document_root' => '/www/wwwroot/tp6/public/index',
'worker_num' => ,//worker的数量
'task_worker_num' => ,//task的数量
]
);
10.server里面的事件也有对应的方法,事件!=方法,你要先注册这个事件,才能使用这个方法!具体请参考server的task方法的使用!
11.使用ob_end_clean()方法必须要有输出才行,不然会报错!







