Swoole

基于PHP+Redis令牌桶限流

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

php7异常与错误处理和自定义异常

青春壹個敷衍的年華 提交于 2020-10-12 20:31:44
7.2版本异常与错误的概述 什么叫做异常? 异常是指程序运行中不符合预期情况以及与正常流程不同的状况。 比如你链接数据库,在参数都写上去的条件下,发现链接不上去,这就属于不符合预期 可以被 try-catch 捕捉得到 什么叫做错误? 是属于php程序自身的问题,一般是由非法的语法,环境问题导致的,使得编译器无法通过检查,甚至无法运行的情况。 平时遇到的 warming、notice都是错误,只是级别不同而已。 例如: TypeError(类型错误) 我规定的函数参数类型和传入的参数不一致 ArithmeticError (算数错误) ParseError (解析错误)在调入的文件中,include "demo.php",或者 eval();中有语法错误造成解析失败 AssertionError(断言错误)当assert生效时产生该错误 DivisionByZeroError (分母为零) 运算过程中例如除法,分母为0 除了这几种情况,其余全部为异常 异常处理 在以前的 php5.X 中 并且不能被 try-catch 捕捉得到,到了 php 7.x 中,定义了一个 Throwable 接口 并使得大部分的 Error 和 Exception 实现了该接口,我们得以在 try-catch 中抛出该错误 所以说以后想要捕获异常,而你又不知道此异常是 Error 还是

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

tp6中swoole扩展websocket的使用

杀马特。学长 韩版系。学妹 提交于 2020-08-19 22:08:48
相信不少人都已经知道tp6.0已经适配swoole.并推出think-swoole 3.0 ,这次就来介绍下tp6中swoole扩展websocket的使用。 Websocket 继承与Http,进行websocket连接之前需要一次HTTP请求,如果当期地址支持websocket则返回101,然后进行连接。也就是说并不是服务支持websocket后,请求每个连接地址都可以进行websocket连接,而是需要预先适配才可以连接。 thinkphp6.0中新增的一项就是Event,websocket服务这块依赖于Event,因此我们需要先创建一个Event listener php think make:listener WebsocketTest 执行过后,将会在app目录下看到新增的目录和文件 其中handle是用来处理事件。 参考如图进行修改 class WebsocketTest { public $websocket = null; /** * 注入容器管理类,从容器中取出Websocket类,或者也可以直接注入Websocket类, */ public function __construct(Container $container) { $this->websocket = $container->make(Websocket::class); } /** *

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 yield关键字以及协程的实现

人走茶凉 提交于 2020-08-18 07:15:39
php的yield是在php5.5版本就出来了,而在初级php界却很少有人提起,我就说说个人对php yield的理解 Iterator接口 在php中,除了数组,对象可以被foreach遍历之外,还有另外一种特殊对象,也就是继承了iterator接口的对象,也可以被对象遍历,但和普通对象的遍历又有所不同,下面是3种类型的遍历情况: 可以看出,迭代器的遍历,会依次调用重置,检查当前数据,返回当前指针数据,指针下移方法,结束遍历的条件在于检查数据返回true或者false 生成器 生成器和迭代器类似,但也完全不同 生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。 生成器使用yield关键字进行生成迭代的值 例如: 一:生成器方法 生成器它的内部实现了以下方法: Generator implements Iterator { //返回当前产生的值 public mixed current ( void ) //返回当前产生的键 public mixed key ( void ) //生成器继续执行 public void next (