版权属于:
桑帅东的博客
作品采用:
《
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
》许可协议授权
1. 环境说明
mongodb版本:4.4.6
2. 实现功能说明
实现日志处理自定义类
用ioc重写系统日志类,实现LoggerInterface接口。
第一步:在自定义类中增加Log文件实现系统日志类接口;
第二步:项目根目录创建文件 bootstrap.php,IOC覆盖系统日志类,注册自定义日志处理器;
use App\Log\LogHandler;
use EasySwoole\Component\Di;
use EasySwoole\EasySwoole\SysConst;
//IOC覆盖系统日志类
Di::getInstance()->set(SysConst::LOGGER_HANDLER, LogHandler::class);
实现IP限流和IP白名单机制
使用 Swoole\Table,存储用户访问情况,使用定时器,将前一周期的访问情况清空,统计下一周期。
第一步:IP 访问统计类,实现了 初始化 Table、统计 IP访问次数、获取一个周期内次数超过一定值的记录;
class IpList
{
use Singleton;
/** @var Table */
protected $table;
public function __construct()
{
TableManager::getInstance()->add('ipList', [
'ip' => [
'type' => Table::TYPE_STRING,
'size' => 16
],
'count' => [
'type' => Table::TYPE_INT,
'size' => 8
],
'lastAccessTime' => [
'type' => Table::TYPE_INT,
'size' => 8
]
], 1024 * 128);
$this->table = TableManager::getInstance()->get('ipList');
}
public function access(string $ip): int
{
$key = substr(md5($ip), 8, 16);
$info = $this->table->get($key);
if ($info) {
$this->table->set($key, [
'lastAccessTime' => time(),
'count' => $info['count'] + 1,
]);
return $info['count'] + 1;
} else {
$this->table->set($key, [
'ip' => $ip,
'lastAccessTime' => time(),
'count' => 1,
]);
return 1;
}
}
public function clear()
{
foreach ($this->table as $key => $item) {
$this->table->del($key);
}
}
public function accessList($count = 10): array
{
$ret = [];
foreach ($this->table as $key => $item) {
if ($item['count'] >= $count) {
$ret[] = $item;
}
}
return $ret;
}
}
第二步:封装完IP统计 的操作之后,我们就可以在 EasySwooleEvent.php 中的 mainServerCreate 回调事件中初始化 IpList 类和定时器,注册 IP 统计自定义进程
第三步:在 EasySwooleEvent.php 中的 onRequestonRequest 事件中 接着我们在判断和统计IP的访问
3. 项目地址
https://gitee.com/sangshuaidong2020/easyswoole
评论