Yii

网站架构优化性能概念

核能气质少年 提交于 2021-01-23 20:38:34
最开始的网站架构 最初业务量不大,访问量小,此时的架构,应用程序、数据库、文件都部署在一台服务器上,有些甚至仅仅是租用主机空间 1. 应用、数据、文件分离 将应用程序、数据库、文件各自部署在独立的服务器上,并且根据服务器的用途配置不同的硬件,达到最佳的性能效果。 2. 利用缓存改善网站性能 大部分网站访问都遵循28原则,即80%的访问请求,最终落在20%的数据上,所以我们可以对热点数据进行缓存,减少热点数据的访问路径,提高用户体验。缓存实现常见的方式是本地缓存、分布式缓存。当然还有CDN、反向代理。 2.1 本地缓存 本地缓存,顾名思义是将数据缓存在应用服务器本地,可以存在内存中,也可以存在文件,组件。本地缓存的特点是速度快,但因为本地空间有限所以缓存数据量也有限。 2.2 分布式缓存 分布式缓存的特点是,可以缓存海量的数据,并且扩展非常容易,在门户类网站中常常被使用,速度按理没有本地缓存快,常用的分布式缓存是Memcached、Redis。 2.3 反向代理 部署在网站的机房,当用户请求达到时首先访问反向代理服务器,反向代理服务器将缓存的数据返回给用户,如果没有缓存数据才会继续访问应用服务器获取,这样做减少了获取数据的成本。 2.4 CDN 假设我们的服务器都部署在杭州的机房,对于浙江的用户来说访问是较快的,而对于北京的用户访问是较慢的

How to display JSON data in jQuery DataTables via Ajax?

℡╲_俬逩灬. 提交于 2021-01-21 08:08:09
问题 I've been trying to get my JSON data in jQuery DataTables component. First I wrote a JavaScript and a view like the code shown below: $.fn.dataTable.Editor({ ajax: "http://localhost/example22/index.php?r=site/display", table: "#example", fields: [{ label: "Name:", name: "name" }, { label: "Designation:", name: "designation" }, { label: "Address:", name: "address" }, { label: "Salary:", name: "salary" }] }); $('#example').DataTable({ lengthChange: false, ajax: "http://localhost/example22/index

IDEA环境搭建

和自甴很熟 提交于 2021-01-10 21:22:42
项目开发 环境安装 安装JDK、Maven、Mysql、redis、zookeeper、activeMq、Navicat、idea、windows下安装git.exe.配置好对应的环境变量。 在idea中配置jdk路径 File -> Project Structure 在idea中配置Maven路径File -> Settings -> Build Tools-> Maven 在idea中配置git路径File -> Settings -> Version Control-> Git 工具栏Maven Project -> reimport All Maven Projects 安装所有依赖jar Maven profile编译打包所有服务及web模块 Edit Configuration -> + -> Maven 添加profile ,command Line设置clean install -Dmaven.test.skip=true -Pdev 或者直接Run Maven Goal即可。本地测试web使用Tomcat Server,方法同上。 1.启动irdms-service-equipment服务(本服务引入需要调用的接口服务API,本项目是引入特定的façade模块) 2.启动irdms-web-equipment项目(tomcat) 3.测试接口 http://ip

解锁Redis锁的正确姿势

北城以北 提交于 2020-12-16 16:04:04
redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为。这个时候我们就要用到锁。锁的方式有好几种,php不能在内存中用锁,不能使用zookeeper加锁,使用数据库做锁又消耗比较大,这个时候我们一般会选用redis做锁机制。 setnx 锁在redis中最简单的数据结构就是string。最早的时候,上锁的操作一般使用setnx,这个命令是当:lock不存在的时候set一个val,或许你还会记得使用expire来增加锁的过期,解锁操作就是使用del命令,伪代码如下: 1if (Redis::setnx("my:lock", 1)) { 2 Redis::expire("my:lock", 10); 3 // ... do something 4 5 Redis::del("my:lock") 6} 这里其实是有问题的,问题就在于setnx和expire中间如果遇到crash等行为,可能这个lock就不会被释放了。于是进一步的优化方案可能是在lock中存储timestamp。判断timestamp的长短。 set 现在官方建议直接使用set来实现锁。我们可以使用set命令来替代setnx,就是下面这个样子 1if (Redis::set("my:lock", 1, "nx", "ex", 10)) { 2 ... do

Yii2设计模式——设计模式简介

ぃ、小莉子 提交于 2020-12-13 06:40:28
我们首先来思考一个问题:作为工程师,我们的价值是什么? 笔者认为是—— 解决用户问题 。 我们的任何知识和技能,如果不能解决特定的问题,那么就是无用的屠龙之术;我们的任何经验,如果不能对解决新的问题有用,那这经验就是过时的。工程师不是空谈者,也不是理论家,再好的理论,再好的设计,不能落地变成产品,不能解客户燃眉之急,那终究也是水中月镜中花,迟早要被淘汰。能解决现实中的问题才能体现作为工程师的价值。 但是,所有现实中的问题,都不是抽象的,比如我们不会提出一个“人是什么”“什么是善”这样的问题。我们要解决的问题,一定是特定场景下,加了一堆定语和描述,十分场景化的。比如:如何降低模块之间代码耦合度,如何解决高并发中的c100k问题,如何提高工程代码的可维护性等等。那么,针对这些特定的问题,早就经前人踩坑,总结出来的被认为行之有效的方式,就慢慢的沉淀为一种被称为“模式”的东西。从这个角度来说,算法是模式,设计模式是模式,架构也是模式——不同层面的解决方案而已。 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次地重用那些已有的解决方案,无需再重复相同的工作。 简单地说,模式就是在特定问题场景下,解决特定问题的固定的套路 。 设计模式简介 软件行业的设计模式,起源于1994年由GOF合著的《设计模式 - 可复用的面向对象软件元素

Yii2设计模式——工厂方法模式

心已入冬 提交于 2020-12-13 04:58:43
应用举例 yii\db\Schema抽象类中: //获取数据表元数据 public function getTableSchema($name, $refresh = false) { if (array_key_exists($name, $this->_tables) && !$refresh) { return $this->_tables[$name]; } $db = $this->db; $realName = $this->getRawTableName($name); if ($db->enableSchemaCache && !in_array($name, $db->schemaCacheExclude, true)) { /* @var $cache Cache */ $cache = is_string($db->schemaCache) ? Yii::$app->get($db->schemaCache, false) : $db->schemaCache; if ($cache instanceof Cache) { $key = $this->getCacheKey($name); if ($refresh || ($table = $cache->get($key)) === false) { //通过工厂方法loadTableSchema(

Yii将Index控制器设置默认控制器

倖福魔咒の 提交于 2020-12-12 04:42:11
1.做后台的时候,访问后台,会自动定义到site/index.html下,如何改变,将默认控制器改变成index呢 2.当页面加载完毕后,你再view中写了一个js代码,结果发现这个代码是加载在jquery资源之前的,这个时候要 <script> <?php $this->beginBlock('js_end') ?> //JavaScript代码区域 layui.use('element', function(){ var element = layui.element; }); <?php $this->endBlock() ?> </script> <?php $this->registerJs($this->blocks['js_end'],\yii\web\View::POS_END); ?> 来源: oschina 链接: https://my.oschina.net/u/3360064/blog/1540829

yii2.0 ajax

人走茶凉 提交于 2020-11-06 06:14:08
2.0用的参数是_csrf token = "<?php echo \Yii::$app->request->getCsrfToken()?>", $.ajax({ type:"post", url:"http://XXX.XXX.XXX/basic/web/index.php?r=admin/publish", data:{_csrf: token}, dataType:"json", success: function(data) { console.log(data); }, error:function() { console.log(321) } }) 来源: oschina 链接: https://my.oschina.net/u/4306387/blog/3876260

Yii2.0 解决“the requested URL was not found on this server”问题

那年仲夏 提交于 2020-10-29 07:36:22
在你下了 Yii 框架,配置完路由 urlManager 后,路由访问页面会报错“ the requested URL was not found on this server ”,url类似于这种“https://www.cnblogs.com/site/index”。 'urlManager' => [ 'enablePrettyUrl' => true , 'showScriptName' => false , // 不显示.php 'suffix' => '.html', // 后缀 'rules' => [ "<controller:\w+>/<action:\w+>/<id:\d+>"=>"<controller>/<action>", "<controller:\w+>/<action:\w+>"=>"<controller>/<action>" ] , ] , 解决方法: 方法一:删除项目下的 runtime 文件夹,然后强刷页面。 方法二:在项目文件夹下面添加 “.htaccess”文件,内容如下: Options + FollowSymLinks IndexIgnore * /* RewriteEngine on # if a directory or a file exists, use it directly RewriteCond %{REQUEST

PHP实现对短信验证码发送次数的限制(防机刷验证码)

本秂侑毒 提交于 2020-10-27 16:54:36
场景 在注册,修改密码,找回密码等场景里,我们都会遇到发送手机短信进行验证码验证,我们都知道,手机的这个短信接口是需要购买了,为了防刷,我们就会对短信验证码发送次数的限制,我们应该如何防止呢? 很多人都会这样做:对用户获取短信验证码的手机号、ip、和浏览器(使用唯一标识)进行限制。 本文介绍的方法是对用户每天只能通过同一浏览器或同一ip地址获取验证码10次或者同一手机号只能获取3次短信验证码,三种限制为“或”关系,一条超限就不发验证码。方法是通过在服务器端将用户的手机号、ip、ur_r标识记录并写入文件,再通过读取文件记录判断用户请求发送验证码的次数来做限制。 方法如下: 这里是获取短信验证码页面: <!DOCTYPE html> < html > < head ></ head > < body > <!-- 隐藏表单uv_r标识,用于对获取验证码的浏览器进行限制,唯一标识存储于浏览器cookie中。在用户进行获取短信验证码操作时将标识传入后台代码(可以通过js传入后台,此处未提供js代码) --> < input type = "hidden" name = "uv_r" value = "" id = "uv_r" > </ body > < script type = ”text/javascript” > /* 使用js获取cookie中ur_r唯一标识,如果不存在