easyswoole build service de file d'attente de messages 03-configuration de base du plug-in

easyswoole build service de file d'attente de messages 03-configuration de base du plug-in

Après avoir obtenu l'environnement, j'ai commencé le processus d'écriture de code.L'environnement que j'ai utilisé était easyswoole 3.x, la démo officielle de la salle de discussion qui m'a été donnée par le patron officiel, et cela a commencé le voyage d'écriture de l'architecture. Écrivez, l'architecture d'abord, la figure suivante est le croquis d'architecture que j'ai conçu, à titre de référence uniquement:

Le premier problème rencontré a été le problème de chiffrement de bout en bout. Cela m'a rappelé un plug-in appelé Jwt, qui résout l'interaction entre Api et end (Pc / Android / Ios). C'est une très bonne méthode de chiffrement, et c'est aussi très utile. Facile.

L'approche traditionnelle consiste à stocker les informations utilisateur authentifiées sur le serveur, telles que Session. L'utilisateur apporte l'ID de session avec la requête suivante, puis le serveur vérifie si l'utilisateur a été authentifié.L'avantage de Jwt est de laisser le chiffrement sur le client pour réduire la pression sur le serveur.

Installez jwt (jeton Web JSON)

Installez jwt

Vous pouvez installer la version officielle

composer require lcobucci/jwt

Vous pouvez également installer la version easyswoole

composer require easyswoole/jwt

Il n'y a pas de différence d'utilisation, le document officiel GitHub: https://github.com/huizhang-Easyswoole/jwt, introduit avant l'utilisation de la classeuse EasySwoole\Jwt\Jwt;

chiffrement

    /**
     * 为用户设置 token  Jwt
     * https://github.com/lcobucci/jwt/blob/3.3/README.md
     */
    protected function setToken(){
    
    

        $jwtObject = Jwt::getInstance()
            ->setSecretKey('easyswoole') // 秘钥
            ->publish();

        $jwtObject->setAlg('HMACSHA256'); // 加密方式
        $jwtObject->setAud('user'); // 用户
        $jwtObject->setExp(time()+3600); // 过期时间
        $jwtObject->setIat(time()); // 发布时间
        $jwtObject->setIss('easyswoole'); // 发行人
        $jwtObject->setJti(md5(time())); // jwt id 用于标识该jwt
        $jwtObject->setNbf(time()+60*5); // 在此之前不可用
        $jwtObject->setSub('主题'); // 主题

        // 自定义数据
        $jwtObject->setData([
            'other_info'
        ]);

        // 最终生成的token
        $token = $jwtObject->__toString();
        return $token;
    }

Déchiffrer le jeton


 	/**
     * 获取token的公共接口  Jwt
     */
    protected function getToken(){
    
    

        $auth_token = $this->request()->getHeader('auth_token');

        if( empty($auth_token) ){
    
    
            //密码不正确
        }

        $jwtObject = Jwt::getInstance()->setSecretKey('easyswoole')->decode($auth_token);
        $status = $jwtObject->getStatus();
        switch ($status)
        {
    
    
            case -1:
                echo 'token无效';
                break;
            case  1:
                echo '验证通过';
					....
                break;
            case  2:
                echo '验证失败';
                break;
            case  3:
                echo 'token过期';
                break;
        }
    }

Insérez la description de l'image ici

Base de données et pool de connexions

La deuxième question est la manière de se connecter aux données. Le support officiel est Mysqli, Orm et Elasticsearch. Pour les performances et les fonctionnalités, je choisis Orm et utilise la méthode de connexion du pool de connexions.

Voici une brève présentation des points de connaissance du pool de connexions. Comme son nom l'indique, le pool de connexions est un moyen conventionnel d'améliorer les performances et de réduire la mémoire du serveur. Il spécifie le nombre maximum de connexions et le nombre minimum de connexions pour obtenir une réutilisation des ressources, une vitesse de réponse plus rapide du système et des connexions unifiées. Gestion pour éviter le rôle de fuite de connexion à la base de données.

Installation de Mysql-Orm

composer require easyswoole/orm

Initialiser la configuration de chargement, charger Orm, ici pour dire, charger le fichier de configuration doit également être chargé dans la initializeméthode d' initialisation , ne pas utiliser le constructeur PHP, cela peut provoquer des bugs.

Le répertoire racine EasySwooleEvent.phpde la initializeméthode, commencez par charger un profil personnalisé:

   /**
     * 加载自定义配置文件
     */
    public static function loadConf()
    {
    
    
        $ConfPath = EASYSWOOLE_ROOT . '/App/Conf';
        $Conf  = Config::getInstance();
        $files = File::scanDirectory($ConfPath);
        if (!is_array($files['files'])) {
    
    
            return;
        }
        foreach ($files['files'] as $file) {
    
    
            echo $file.PHP_EOL;
            $data = require_once $file;
            $Conf->setConf(strtolower(basename($file, '.php')), (array)$data);
        }
    }

Si vous ne trouvez pas la Fileclasse, vous use EasySwoole\Utility\File;devez la présenter au début , vous devez y faire attention, car la version sera différente, vous devez déboguer vous-même.

Chargez initialement le composant Orm, qui GlobalConfigestuse EasySwoole\EasySwoole\Config


        $dbConf = GlobalConfig::getInstance()->getConf('db');
        $config = new DBConfig();
        $config->setDatabase($dbConf['mysql-master']['database']);
        $config->setUser($dbConf['mysql-master']['username']);
        $config->setPassword($dbConf['mysql-master']['password']);
        $config->setHost($dbConf['mysql-master']['host']);
        $config->setPort($dbConf['mysql-master']['port']);
        $config->getCharset($dbConf['mysql-master']['charset']);

        //Mysql连接池配置
        $config->setGetObjectTimeout(3.0); //设置获取连接池对象超时时间
        $config->setIntervalCheckTime(30*1000); //设置检测连接存活执行回收和创建的周期
        $config->setMaxIdleTime(15); //连接池对象最大闲置时间(秒)
        $config->setMaxObjectNum(20); //设置最大连接池存在连接对象数量
        $config->setMinObjectNum(5); //设置最小连接池存在连接对象数量
        $config->setAutoPing(5); //设置自动ping客户端链接的间隔
        DbManager::getInstance()->addConnection(new Connection($config));

Extension de fichier de la couche de modèle

namespace App\Models;

use EasySwoole\ORM\AbstractModel;

/**
 * 用户Model模型
 * Class UserShop
 */
class UserModel extends AbstractModel
{
    
    
    protected $tableName = 'wm_user_user';
}

Appel du contrôleur

 $userModel = UserModel::create()->field(['user_id'])->get($user_id);
 $userData = $userModel->getOriginData();

Installation du plugin Redis

Installer et télécharger les dépendances correspondantes par connexion au pool de connexions

composer require easyswoole/redis-pool 
composer require easyswoole/pool

mainServerCreate Enregistrez le service Redis dans la méthode (appelée avant le démarrage du service)

//注册 redis连接池
$RedisConfig = new RedisConfig();
$masterRedisConfig = new \EasySwoole\Redis\Config\RedisConfig(GlobalConfig::getInstance()->getConf('redis'));
//注册连接池管理对象
\EasySwoole\Pool\Manager::getInstance()->register(new \App\Pool\RedisPool($RedisConfig,$masterRedisConfig),'redis');

Ajout du gestionnaire redisPool, nouveau fichier/App/Pool/RedisPool.php

namespace App\Pool;

use EasySwoole\Pool\Config;
use EasySwoole\Pool\AbstractPool;
use EasySwoole\Redis\Config\RedisConfig;
use EasySwoole\Redis\Redis;

class RedisPool extends AbstractPool
{
    
    
    protected $redisConfig;

    /**
     * 重写构造函数,为了传入redis配置
     * RedisPool constructor.
     * @param Config      $conf
     * @param RedisConfig $redisConfig
     * @throws \EasySwoole\Pool\Exception\Exception
     */
    public function __construct(Config $conf,RedisConfig $redisConfig)
    {
    
    
        parent::__construct($conf);
        $this->redisConfig = $redisConfig;
    }

    protected function createObject()
    {
    
    
        //根据传入的redis配置进行new 一个redis
        $redis = new Redis($this->redisConfig);
        return $redis;
    }
}

Appel du contrôleur

    /**
     * @throws 缓存token
     */
    protected function cacheToken($token){
    
    
        $redis=\EasySwoole\Pool\Manager::getInstance()->get('redis')->getObj();

        $redis->select(1);
        $result = $redis->set('auth_token:100', $token,['NX','PX'=>20000]);
        echo $redis->get('auth_token:100');
    }

Insérez la description de l'image ici

Démarrez easyswoole

php easyswoole server start -mode=websocket

Insérez la description de l'image ici
Insérez la description de l'image ici
Le texte du code n'est pas facile, alors encouragez

Je suppose que tu aimes

Origine blog.csdn.net/xuezhiwu001/article/details/109385509
conseillé
Classement