swoole学习--登录模块

使用swoole+thinkphp6.0+redis 结合开发的登录模块,做完之后有几点感悟:

1.不要相信任务数据,包括请求的外部接口,特别是超时者部分,尽可能的交给task完成。

2.原来可以在入口文件哪里使用超全局变量声明已经实例化的server服务对象,然后就其他文件使用了。

3.异步任务(协程)里面不能再异步(开启协程任务),只能是同步(task任务下,redis只能使用同步的模式,使用异步的模式会出错!)。

4.在使用task任务下,不能使用thinkphp6.0里面的门面(Facade),报错原因是因为找不到这个类(因为没有加载到这里)。

5.所有耗时的任务叫交给task完成。

6.使用同步redis下的单例模式,指的是同一个请求下只连接一次,后面在这个请求里面不断重复的都是这个实例,如:

<?php
namespace appcommoncontroller;
use thinkfacadeConfig;
use appcommoncontrollerRedis;

//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', 6379, 5);
        
        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=0)
    {
        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 appcommon	askTask();
		$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' => 4,//worker的数量
                'task_worker_num' => 4,//task的数量
            ]
        );

10.server里面的事件也有对应的方法,事件!=方法,你要先注册这个事件,才能使用这个方法!具体请参考server的task方法的使用!

11.使用ob_end_clean()方法必须要有输出才行,不然会报错! 

原文地址:https://www.cnblogs.com/laijinquan/p/12247477.html