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;
}
}
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 initialize
méthode d' initialisation , ne pas utiliser le constructeur PHP, cela peut provoquer des bugs.
Le répertoire racine EasySwooleEvent.php
de la initialize
mé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 File
classe, 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 GlobalConfig
estuse 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');
}
Démarrez easyswoole
php easyswoole server start -mode=websocket
Le texte du code n'est pas facile, alors encouragez