在上面的代码中,主要做了两件事:
- 实现ThinkPHP的命令设置
- 将命令参数重新构造为workerman兼容的方式
最终效果如下:
文章插图
文章插图
以上是ulthon_admin内置的两款皮肤效果,分别是:科幻、像素 。
对于面板的管理,这里多做介绍,这算是PHP开发者的基本功,谁还不会个CURD啊 。
第四步,进阶,更好的性能和流量统计我们的IP拦截客户端需要运行在服务器上,并且直接连接数据库,如果每次收到请求都要查询数据库,那么很有可能导致连接不通畅,尤其是客户端和数据库本身位置较远的时候 。在第一步的代码中,我们只是简单地使用了查询缓存,但是还不够,还可以优化 。并且我们可以在管理面板的截图中看到,我们是可以统计流量和拦截次数的,现在我们要实现这些功能:
流量统计首先我们将第一个步骤,流量转发部分的代码改造成如下的样子:
<?php// 向TO发起连接$to_connection = new AsyncTcpConnection('tcp://127.0.0.1:' . Config::get('door.port_to'));$to_connection->onMessage = function ($source, $data) use ($connection, $remote_ip) {// 接收到来自TO的数据,返回的数据$connection->send($data);// 将流量统计存储到内存里Cache::inc(md5($remote_ip) . '-to', strlen($data));};// 流程和流量控制$to_connection->onClose = function ($source) use ($connection) {$connection->close();};$connection->onBufferFull = function ($dest) use ($to_connection) {$to_connection->pauseRecv();};$connection->onBufferDrain = function ($dest) use ($to_connection) {$to_connection->resumeRecv();};$connection->onMessage = function ($source, $data) use ($to_connection, $remote_ip) {// 接收来自IN的数据,请求的数据$to_connection->send($data);// 将流量统计存储到内存里Cache::inc(md5($remote_ip) . '-in', strlen($data));};// 流程和流量控制$connection->onClose = function ($source) use ($to_connection) {$to_connection->close();};$to_connection->onBufferFull = function ($dest) use ($connection) {$connection->pauseRecv();};$to_connection->onBufferDrain = function ($dest) use ($connection) {$connection->resumeRecv();};在第一部的代码中,只用两行便实现了这些代码:// 放行连接,连接内部目标端口$to_connection = new AsyncTcpConnection('tcp:127.0.0.1:' . Config::get('door.port_to'));// 互相转发流量$connection->pipe($to_connection);$to_connection->pipe($connection);这里使用的是workerman内置的流量转发,它很好用,但是这里我们要统计流量,所以我们手动转发流量 。这里我们将统计的数据存储到缓存里,而不是直接连接数据库更新,这是为了更好的连接性能 。我们会另外开启一个进程将这些改动更新到数据库 。后面会介绍到 。
拦截统计我们将第一步中的加载IP白名单的逻辑改成下面这样:
<?php$worker->onConnect = function (TcpConnection $connection) {$disable_cache_key = 'disable_ip_list';$list_ip = Cache::get($disable_cache_key);if (empty($list_ip)) {$connection->close();}$remote_ip = $connection->getRemoteIp();if (!in_array($remote_ip, $list_ip)) {AppIpReject::initRecord($remote_ip);$connection->close();}};在这里我们不连接数据库查询,而是直接从本地缓存读取白名单,这样会有更好的性能 。我们会在另一个进程中更新这份白名单 。另外我们可以看到,拦截的IP调用了一个静态方法,这里的功能很简单,判断数据库中该IP是否存在,如果不存在则新增,如果存在,则更新拦截次数+·1 。这里就不多介绍了 。这里也没有必要做什么性能优化,反正本来就是拦截的IP,优化个毛 。
高性能处理缓存数据上面我们介绍,我们会另外开启一个进程,维护IP白名单,并且将流量统计提交到数据库 。这就是这个进程:
推荐阅读
- 固件更新处难寻?手把手教你用影驰魔盘更新SSD固件
- 教你如何取个好听的英文名字 怎么取英文名
- 微信设置更换修改气泡和主题教程 微信皮肤怎么设置
- 教师|宝丰县2022年招聘教师200名,8月2日起开始报名
- 教师资格证报名照片是教师资格证的照片吗 教师资格证报名照片要求是什么
- 大学教育技术学专业简析 教育技术学是什么专业
- nfc怎么复制门禁卡iQOO nfc怎么复制门禁卡
- 金宝贝和其他早教机构相比到底好在哪儿 金宝贝早教怎么样
- 教你制作电子相册,一分钟就能学会 如何制作电子相册
- 3种方法教你查看电脑真实配置 怎么查电脑配置
