Yii

1 yii2 validate验证参数工作步骤:

…衆ロ難τιáo~ 提交于 2020-10-25 00:53:23
通常为了节省服务器资源,需要在客户端提交参数时做相应的验证工作。比如必填参数、参数范围等。 1 设置场景:类继承自model来设置const常量: const SCENARIO_ADD = 'add'; 2 设置场景对应的验证规则: public function rules() { ['store_no', 'check_store_no', 'on' => [ self::SCENARIO_ADD, Store::SCENARIO_ALTER_BASIC_INFO, ]], } 3 加载请求参数到model: $model->load(\Yii::$app->request->post(),''); 4 判读请求参数合法性: if(!$model->validate()){ return RestStatus::buildRestErrRes(401, $model->getErrors()); } 5 寄存请求参数,执行对应的db逻辑:CRUD 6 查找接口已list返回,其余增、改、删接口均需要做捕获异常处理 来源: oschina 链接: https://my.oschina.net/u/4396805/blog/4471009

PHP解耦的三重境界(浅谈服务容器)

混江龙づ霸主 提交于 2020-10-24 11:05:17
在完成整个软件项目开发的过程中,有时需要多人合作,有时也可以自己独立完成,不管是哪一种,随着代码量上升,写着写着就“失控”了,渐渐“丑陋接口,肮脏实现”,项目维护成本和难度上升,到了难以维持的程度,只有重构或者重新开发。 第一重境界 假设场景:我们需要写一个处理类,能够同时操作会话,数据库和文件系统。我们或许会这么写。 境界特征:可以运行,但是严重耦合 class DB{ public function DB($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class FileSystem{ public function FileSystem($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class Session{ public function Session($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class Writer{ public function Write(){ $db=new DB(1,2); $filesystem=new FileSystem(3,4); $session=new Session(5,6); } } $writer=new Writer(); $writer->write(); 写法缺点: 1

基于PHP+Redis令牌桶限流

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

baclk_upd

痞子三分冷 提交于 2020-10-15 00:43:33
<UpdateInfo> K8PQ6TtLE7yII2e6H36v9/R0GPB68nudAgjDjvrCp2OLqCjOiVnLytmkVT2QcXWh49UARscc17gQp+mqo2AGpHSp9EKRs96H5iYud6QANriubd34HYK3kGljN4yAH+6JSdqVSoig9U6UK6YuHAfTqF2yWasZFoMOudlrU2pVFqeo3UgKIiaSFZj27A== </UpdateInfo> 来源: oschina 链接: https://my.oschina.net/u/4063175/blog/4309492

Yii2自定义报错信息页面

强颜欢笑 提交于 2020-10-11 00:30:14
Yii原始的调试模式会看到很多我们代码里的信息 这些信息暴露在外边相当于我们的网站正在裸奔 如何自定义开发信息 1、配置/config/web.php 'errorHandler' => [ // 'errorAction' => 'site/error', // 'maxSourceLines' => 2 //原报错页面基础上只显示2行错误信息 'class' => 'app\components\ErrorHandler',//我们自定义的报错信息 ], 2、自己写ErrorHandler.php文件 新建文件夹components并在该文件夹下新建ErrorHandler.php文件 <?php namespace app\components; class ErrorHandler extends \yii\base\ErrorHandler { /** * Renders the exception. * @param \Exception $exception the exception to be rendered. */ protected function renderException($exception) { $title = $exception->getMessage(); $message = $exception->getFile().":".

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