Swoft

基于PHP+Redis令牌桶限流

萝らか妹 提交于 2020-10-17 08:44:01
一 、场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制。比如对于某个 用户,他在一个时间段(interval)内,比如 1 分钟,调用服务器接口的次数不能够 大于一个上限(limit),比如说 100 次。如果用户调用接口的次数超过上限的话,就直接拒绝用户的请求,返回错误信息。 服务接口的流量控制策略:分流、降级、限流等。本文讨论下限流策略,虽然降低了服务接口的访问频率和并发量,却换取服务接口和业务应用系统的高可用。 二、常用的限流算法 1、漏桶算法 漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率.示意图如下: 可见这里有两个变量,一个是桶的大小,支持流量突发增多时可以存多少的水(burst),另一个是水桶漏洞的大小(rate)。 因为漏桶的漏出速率是固定的参数,所以,即使网络中不存在资源冲突(没有发生拥塞),漏桶算法也不能使流突发(burst)到端口速率.因此,漏桶算法对于存在突发特性的流量来说缺乏效率. 2、令牌桶算法 令牌桶算法(Token Bucket)和 Leaky Bucket 效果一样但方向相反的算法

PHP实现多个关键词搜索查询功能示例

丶灬走出姿态 提交于 2020-10-06 01:51:37
本文实例讲述了PHP实现多个关键词搜索查询功能。分享给大家供大家参考,具体如下: PHP对于数据库的搜索主要通过使用SQL语句中的 like 子句来实现。如果同时搜索多个关键词,可以使用 union 子句来将搜索结果合并起来。以下代码实现了一个搜索页面 <?php require_once ( '' Connections / conn . php '' ); ?> <?php $colname_rs = $_GET [ '' key '' ]; //获得用户输入 $result = explode ( '' , '' , $_GET [ '' key '' ]); //分解用户输入的多个关键词,存入$result数组 mysql_select_db ( $database_conn , $conn ); //连接数据库 //根据多个关键词构建SQL语句 $query_rs = "SELECT * FROM (" ; for ( $i = 0 ; $i < count ( $result ); $i ++ ) //根据每个搜索关键词构建SQL语句 { if ( $i == 0 ) //对第一个关键词,不使用UNION $query_rs .= "SELECT * FROM searchtable WHERE title LIKE ''% $result[0] %'' OR

Laravel 文件缓存也可以快得飞起,tmpfs 了解一下

こ雲淡風輕ζ 提交于 2020-10-05 06:05:46
截至 Laravel 7,共有 6 个可用的缓存驱动程序,其中 APC 是最佳实践,而文件驱动程序是唯一不需要额外设置的驱动程序。 我昨晚与一位朋友交谈,他提到他们使用 Redis 作为缓存驱动程序,这让我想到我还有一个仍然使用文件驱动程序的项目。 我想我可以使用一些内存驱动缓存,以获得更好的性能,但我真的不想在这个时候用 Redis。就在这时,一个解决方案让我眼前一亮,我知道但还没有真正使用过的东西。 tmpfs. $ mount -t tmpfs -o size=12m tmpfs storage/framework/cache    它做了啥 (小朋友你是否有很多?) 图片由 Liam Briese 提供 tmpfs: 允许你将文件作为一个目录存储在 RAM (内存) 中。 在 Linux 服务器上,Laravel 目录中,运行上述操作将把 storage/framework/cache 映射到 RAM,这意味着你可以通过使用 RAM 而不是磁盘 IO 来享受缓存文件的延迟下降。 如果你在你的应用中大量使用缓存的话,使用此方法的代价非常小 你可以确保你的服务器在重新启动时切换到 RAM 存储,方法是将以下命令放入你的服务器的系统配置文件 /etc/fstab tmpfs storage/framework/cache tmpfs nodev,nosuid,noexec

redis里通过命名空间存储缓存,根据结构生成树型

大兔子大兔子 提交于 2020-09-27 13:57:34
一般为了方便管理 redis 缓存,我们通过 : 来分隔不同的 key 来进行存储缓存,这样方便查看。 例如: game:upload_role:1000 game:member_info:2000 game:member_info:state_info:3000 上面的这种结构在 Redis Desktop Manager 中就会显示如下: 我们可以通过 keys 命令来获取 redis 里的所有 key。但这些 key 是没有层次的,如何生成? 只能通过 : 分隔符来处理各 key 的上下层关系。 代码如下: function relationCache($keys, &$index, &$index_tree) { $result = []; if ($keys) { foreach ($keys as $key) { $arr = explode(':', $key); $len = count($arr); for ($ix = 0; $ix < $len; $ix++) { $cur_key = implode(':', array_slice($arr, 0, $ix + 1)); if (!isset($index_tree[$cur_key])) { $index_tree[$cur_key] = $index++; $pid = 0; if ($ix >= 1)

PHP设计模式之访问者模式(Visitor)代码实例大全(32)

回眸只為那壹抹淺笑 提交于 2020-09-26 04:55:57
目的 访问者模式可以让你将对象操作外包给其他对象。 这样做的最主要原因就是关注(数据结构和数据操作)分离。但是被访问的类必须定一个契约接受访问者。 (详见例子中 Role::accept 方法) 契约可以是一个抽象类也可以就是一个接口。在此情况下,每个访问者必须自行选择调用访问者的哪个方法。 UML图 ★官方PHP高级学习交流社群「点击」管理整理了一些资料,BAT等一线大厂进阶知识体系备好(相关学习资料以及笔面试题)以及不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货 代码 RoleVisitorInterface.php <?php namespace DesignPatterns\Behavioral\Visitor; /** * 注意:访问者不能自行选择调用哪个方法, * 它是由 Visitee 决定的。 */ interface RoleVisitorInterface { public function visitUser(User $role); public function visitGroup(Group $role); } RoleVisitor.php <?php

Redis 之服务器集群配置

£可爱£侵袭症+ 提交于 2020-08-19 09:35:11
常见的集群架构如图: redis操作过程中数据同步的函数调用关系: 集群搭建:   1.修改3个redis.config 文件的:   2.启动2个redis服务器 当杀掉redis主进程Master时,由于Slave(6380)只读,则无法向redis中写数据了,这时我们将借助sentinel工具进行监控主从服务器。 以上内容希望帮助到大家, 很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家 ,需要戳这里 PHP进阶架构师>>>实战视频、大厂面试文档免费获取 来源: oschina 链接: https://my.oschina.net/u/4234147/blog/4511551

PHP 控制反转(IOC)与依赖注入(DI)

和自甴很熟 提交于 2020-08-18 14:42:29
概念 IOC与DI 据我了解其实早期是JAVA的理念,长期并不被PHP业界接受,因为PHP的理念是简单高效,但是长期的发展使得PHP必须为了工程规范和开发解耦必须走上这条路。Laraval框架为PHP的发展带来了的理念,逐步的各大框架都开始走上了标准化的开发步伐。这其中包含了ThinkPHP、EasySwoole、Swoft等等。 控制反转 传统的开发模式如果我们想要的到一个对象,我们必须去使用new。 这种方式的类控制权限在人的手中,是程序需要的时候认为主动创建依赖的对象( 见下图1-1 )。 // 图 1-1 // 通常的依赖注入模式 class Course { protected $user; public function __construct(User $user) { $this->user = $user; } } 依赖注入 前者说控制反转中,系统会将所有的请求单例Bean或者 全局单例Bean 保存在专用的IoC 容器当中,根据代码的需要 选择性的注入对应的需求类,注入的类 由IoC 容器管理, 降低程序的耦合,使得开发人员只需要关注对应的业务逻辑。 两者之间的关联 可以说两者是相辅相成的,依赖注入依靠IOC 控制反转,是IOC的最终目的,而 IOC 对于 依赖注入 是其实现的前提。 这里我们举个栗子 , 其实 PHP的composer

PHP操作Redis,记不住多操作几次

感情迁移 提交于 2020-08-18 03:07:43
redis 的基本操作方法 1.redis 的连接 : //实例化redis $redis = new Redis(); //连接 $redis->connect('127.0.0.1', 6379); //检测是否连接成功 echo "Server is running: " . $redis->ping(); // 输出结果 Server is running: +PONG 2.redis 操作 Strng (字符串): // 设置一个字符串的值 $redis->set('cat', 111); //获取一个字符串的值 echo $redis->get('cat'); // 111 // 重复set $redis->set('cat', 222); echo $redis->get('cat'); // 222 3.redis 操作 List (列表): //存储数据到列表中 $redis->lpush('list', 'html'); $redis->lpush('list', 'css'); $redis->lpush('list', 'php'); //获取列表中所有的值 $list = $redis->lrange('list', 0, -1); print_r($list);echo '<br>'; // Array ( [0] => php [1] => css

PHP 多任务秒级定时器的实现方法

戏子无情 提交于 2020-08-17 20:11:20
描述 最近在公司部署crontab的时候,突发奇想是否可以用PHP去实现一个定时器,颗粒度到秒级就好,因为crontab最多到分钟级别,同时也调研了一下用PHP去实现的定时器还真不太多,Swoole 扩展里面到实现了一个毫秒级的定时器很高效,后面写一篇,先用PHP去实现一个定时器类,以供学习参考。 实现 在实现定时器代码的时候,用到了PHP系统自带的两个扩展 Pcntl - 多进程扩展 : 主要就是让PHP可以同时开启很多子进程,并行的去处理一些任务。 Spl - SplMinHeap - 小顶堆 一个小顶堆数据结构,在实现定时器的时候,采用这种结构效率还是不错的,插入、删除的时间复杂度都是 O(logN) ,像 libevent 的定时器也在 1.4 版本以后采用了这种数据结构之前用的是 rbtree,如果要是使用链表或者固定的数组,每次插入、删除可能都需要重新遍历或者排序,还是有一定的性能问题的。 流程 说明 1、定义定时器结构,有什么参数之类的. 2、然后全部注册进我们的定时器类 Timer. 3、调用定时器类的monitor方法,开始进行监听. 4、监听过程就是一个while死循环,不断的去看时间堆的堆顶是否到期了,本来考虑每秒循环看一次,后来一想每秒循环看一次还是有点问题,如果正好在我们sleep(1)的时候定时器有到期的了,那我们就不能马上去精准执行,可能会有延时的风险

PHP 闭包那点事儿

余生颓废 提交于 2020-08-17 17:07:31
匿名函数 匿名函数,也叫闭包函数,说白了就是“没有名字的函数”,和一般函数结构一样,只是少了函数名以及最后需要加上分号 ; 。 注:理论上讲闭包和匿名函数是不同的概念,不过PHP将其视作相同的概念。 $func = function() { echo 'Hello World' . PHP_EOL; }; $func(); 匿名函数和普通函数的区分有: 匿名函数也可以作为变量的值来使用。 匿名函数可以从父作用域继承变量,而这个父作用域是定义该闭包的函数(不一定是调用它的函数)。 $message = 'hello'; $example = function () use ($message) { return $message; }; $message = 'world'; echo $example(); 输出:hello 注意:必须使用 use 关键字将变量传递进去才行,具体见 官方文档 。 闭包类 定义一个闭包函数,其实就是实例化一个闭包类( Closure )对象: $func = function() { echo 'hello world' . PHP_EOL; }; var_dump($func); 输出: object(Closure)#1 (0) { } 类摘要: Closure { __construct ( void ) public static