easyswooleビルドメッセージキューサービス03-基本的なプラグイン構成
環境を取得した後、コードを書くプロセスを開始しました。使用した環境は、公式のボスから提供された公式のチャットルームのデモであるeasyswoole 3.xで、これがアーキテクチャの作成の旅を開始しました。最初にアーキテクチャを記述します。次の図は、参照用に、私が設計したアーキテクチャのスケッチです。
最初に遭遇した問題は、エンドツーエンドの暗号化の問題でした。Apiとエンド(Pc / Android / Ios)の間の相互作用を解決するJwtというプラグインを考えました。これは非常に優れた暗号化方法であり、非常に便利です。シンプル。
従来のアプローチは、認証されたユーザー情報をセッションなどのサーバーに保存することです。ユーザーが次のリクエストでセッションIDを持ってくると、サーバーはユーザーが認証されているかどうかを確認します。Jwtの利点は、クライアントに暗号化を残してサーバーへの負荷を軽減することです。
jwt(JSON Webトークン)をインストールします
jwtをインストールします
公式版をインストールできます
composer require lcobucci/jwt
easyswooleバージョンをインストールすることもできます
composer require easyswoole/jwt
使用法に違いはありません。GitHubの公式ドキュメント:https://github.com/huizhang-Easyswoole/jwt、クラスが使用される前に紹介されていますuse EasySwoole\Jwt\Jwt;
暗号化
/**
* 为用户设置 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;
}
トークンを復号化
/**
* 获取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;
}
}
DBと接続プール
2番目の問題は、データへの接続方法です。公式サポートはMysqli、Orm、Elasticsearchです。パフォーマンスと機能のために、Ormを選択し、接続プール接続方法を使用します。
接続プールの知識ポイントについて簡単に説明します。名前が示すように、接続プールは、パフォーマンスを向上させ、サーバーメモリを削減するための従来の手段です。これは、リソースの再利用、システムの応答速度の高速化、および接続の統合を実現するための最大接続数と最小接続数を指定します。データベース接続リークの役割を回避するための管理。
Mysql-Ormインストール
composer require easyswoole/orm
ロード構成を初期化します。ここでは、ロード構成ファイルも初期化initialize
メソッドでロードする必要があります。PHPコンストラクターを使用しないでください。バグが発生する可能性があります。
ルートディレクトリEasySwooleEvent.php
のinitialize
方法は、最初のカスタムプロファイルをロードします。
/**
* 加载自定义配置文件
*/
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);
}
}
File
クラスが見つからない場合は、最初use EasySwoole\Utility\File;
に紹介する必要があります。バージョンが異なるため、自分でデバッグする必要があります。自分で注意を払う必要があります。
最初のORMコンポーネント、ロードGlobalConfig
ですuse 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));
モデルレイヤーのファイル拡張子
namespace App\Models;
use EasySwoole\ORM\AbstractModel;
/**
* 用户Model模型
* Class UserShop
*/
class UserModel extends AbstractModel
{
protected $tableName = 'wm_user_user';
}
コントローラーコール
$userModel = UserModel::create()->field(['user_id'])->get($user_id);
$userData = $userModel->getOriginData();
Redisプラグインのインストール
接続プール接続によって対応する依存関係をインストールおよびダウンロードします
composer require easyswoole/redis-pool
composer require easyswoole/pool
mainServerCreate
メソッドにRedisサービスを登録します(サービスが開始する前に呼び出されます)
//注册 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');
redisPoolマネージャー、新しいファイルを追加しました/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;
}
}
コントローラーコール
/**
* @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');
}
easyswooleを開始します
php easyswoole server start -mode=websocket
コードテキストは簡単ではないので、奨励してください