首页
统计
壁纸
追番记录
优秀博主
关于
推荐
导航
工具
音乐解锁
Search
1
NAS的简单介绍
738 阅读
2
网站环境一键部署工具推荐
505 阅读
3
tp5-模型数据处理
406 阅读
4
win10镜像
366 阅读
5
第20200225期-电脑壁纸-P10
350 阅读
PHP
闲谈杂料
硬件系统
美图
ThinkPHP
笔记
数据库
Lua
登录
Search
标签搜索
ThinkPHP
MySQL
Laravel
PHP
API
GIT
Windows10
markdown
Web
跨域
ajax
小程序
壁纸
Linux
jsonp
try
异常
Dcat
UEFI
win10
phpfunny
累计撰写
104
篇文章
累计收到
24
条评论
首页
栏目
PHP
闲谈杂料
硬件系统
美图
ThinkPHP
笔记
数据库
Lua
页面
统计
壁纸
追番记录
优秀博主
关于
推荐
导航
工具
音乐解锁
搜索到
104
篇与
的结果
2020-08-15
Apache高级内容及优化
加密文章,请前往内页查看详情
2020年08月15日
184 阅读
0 评论
0 点赞
2020-08-01
linux添加计划任务
原题:linux增加一个计划任务,每天早上8点执行aa.php文件。分析:使用linux中crontab规定时间来执行指定脚本解答:1,首先查看php可执行文件所在目录which php得到路径/usr/bin/php2,编辑crontab文件crontab -e3,i键编辑0,8, * /usr/bin/php /opt/lampp/htdocs/wechat/xjtest-web_browser/pcntl_test.php即:计划任务执行频率+php可执行文件路径+要执行的php文件路径 。补充:计划任务执行频率:分,时,日,月,周
2020年08月01日
182 阅读
0 评论
0 点赞
2020-08-01
laravel核心文件不存在或者打不开
在使用laravel框架部署的时候碰到的小坑下载完核心,修改完配置数据库,路径访问修改为public,正常过程走完之后访问地址提示数据流错误不存在打不开原因是:核心都没有下载完整或者没有复制完整的缘故!(使用composer下载laravel好几次碰到这个错误)写这篇文档记录一下解决方法。以下方法还不使请重新下载完整的lavarel框架吧。解决方法:cd到该引用的根目录,先删除 composer.lock 文件重新在根目录执行“composer install”,这样就能重新生成 composer.lock 文件了。如果出现php版本不匹配,可用“composer install --ignore-platform-reqs”(忽略版本匹配)。补充:在第二步骤执行composer install提示我的composer版本过低,所以要先更新一下版本composer self-update更新完之后再次输入composer install提示我使用了禁用的函数,去php环境将使用的php版本中禁用函数配置文件中putenv()删除即可执行 Composer install 命令,提示 killed(原因是服务器内存不足)解决方式1:升级服务器配置解决方式2:查看当前composer包状态信息composer diagnose出现的异常在手动解决即可例如我的这个情况proc_open去php禁用函数把他删除即可再次使用 composer install 即可正常操作
2020年08月01日
108 阅读
0 评论
0 点赞
2020-07-28
微信支付流程
暂无简介
2020年07月28日
142 阅读
0 评论
0 点赞
2020-07-28
NAS的简单介绍
定义Network Attached Storage:网络附属存储按字面简单说就是连接在网络上,具备资料存储功能的装置,因此也称为“网络存储器”。它是一种专用数据存储服务器。它以数据为中心,将存储设备与服务器彻底分离,集中管理数据,从而释放带宽、提高性能、降低总拥有成本、保护数据。NAS本身能够支持多种协议(如NFS、CIFS、FTP、HTTP等)能够支持各种操作系统从本质上讲,NAS 是一个位于桌面上的迷你服务器。您可以通过 USB 电缆将其直接连接到您的计算机,但这会抵消其主要优势:网络。NAS 会创建一个小型网络,任何具有正确凭据(用户名和密码)的设备都可以访问。NAS 是使用简单的外置硬盘的一步,也是创建自己的个人云存储的一步。为什么要弄NAS?*1.当代第三方网盘吃相不佳(用户体验不好)2.第三方网盘的替代品3.花钱少(NAS是一次性投资,每年只需要交家庭网费即可)4.数据安全(数据保存在自己手里是最安全)在第三方网盘里保存的私密信息,网盘管理者有权限查看即使你删除了网盘里的资料,但是真实数据并没有被删除。只是删除了用户本人对这个文件的使用权限而已5.用户数据量大(0202年用户在工作生活中会产生产大量的珍贵数据)6.传输速度快(0202年5G发展迅速突破了文件传输的限制,使网盘普及化)7.私有云化(私人网盘)8.不利因素(不排除意外或者黑客手段)如果外网可以访问NAS就说明NAS已经完全暴露在网络上靠路由器的防护功能(流量拦截,注入攻击)靠NAS系统的安全防护(异常请求,非法请求)靠NAS系统的用户权限(排除大部分非法用户登陆)其他防护网络上有大量的蠕虫病毒疯狂肆虐(每时每刻都存在)端口穷举扫描:俗称‘撒网捕鱼’最近有一案例:B站up主党妹的公司NAS被蠕虫感染导致所有的数据被非对称加密,俗称勒索病毒。(中毒原因是当时安装架设NAS时候对安全的考虑不周,还有就是使用的是windows server系统文件共享-安全性差没有Linux好)黑客攻击:这种情况不太常见,除非你NAS里有价值的东西非常多(政治机密,商业机密,其他)nas的日常使用方向照片1.同步2.时光相册3.网站图床视频1.在线观看2.电影3.vlog4.电视剧5.录像6.在线剪辑7.热备份 项目项目1.项目克隆2.git版本控制游戏1.主机在局域网内直接读取nas中游戏文件(需六类网线)学习资料1.小姐姐2.姿势 知识/技术3.其他数据除了个人使用,还可以商用共享云:投入高,收入稳定。多种模式商用1.无限网盘项目:收取用户流量使用2.有限网盘项目:收取用户会员费用3.混合项目:混合收费硬件1. 服务器戴尔/联想/华硕/DIY服务器/详情待补充2. 矿机蜗牛星际/猫盘/斐讯N1盒子/详情待补充3. 集成nas *Synology群晖DS218+(2盘位)双核CPU,2.0-2.5GHz,单RJ-45 1GbE网口,2Gddr4(最大拓展6G)套餐:DS218+配4T西数NAS专用 ¥3599(6期免)-20200713DS220+(2盘位)双核CPU,2.0-2.9GHz,双RJ-45 1GbE网口,2Gddr4(最大拓展6G)[DS718+]()(2盘位)双核CPU,2.0-2.7GHz,双RJ-45 1GbE网口,2Gddr4(最大拓展6G)DS418play(4盘位)[DS918+]()(4盘位)DS920+(4盘位)双核CPU,2.0-2.7GHz,双RJ-45 1GbE网口,4Gddr4(最大拓展8G)套餐:DS918+配4T(2块红盘)nas专用盘 ¥5618(3期免)-20200713系列方向Plus系列强大的 NAS 可通过即时快照和时间点恢复保护来确保数据完整性。Value系列通过紧凑型 NAS 享受轻松无忧的数据管理和存储部署。J系列个人云解决方案,可轻松实现数据共享、多媒体串流、无缝式存储管理。梗:买软件送硬件QNAP威联通TERRA MASTER铁威马 海康威视其他品牌NAS其他硬件NTX主机优点:硬件配置以完善,后期可以自己更换内存,cpu,硬盘DIY组装-略树莓派不推荐-对小白不友好(部署难-维护难)用的Linux系统性能强补充对于硬件的选购,用户要自己斟酌 怕麻烦/计算机小白等用户建议直接用矿机和集成NAS 预算不高(30-1k¥)推荐买集成nas矿机 预算普通(1k-6k¥)推荐集成NAS 动手能力强+会Linux基本操作建议DIY组装和NTX主机和树莓派优点:用最便宜的硬件达到最强的性能(性价比高)安装/后期软件/后期硬件等维护方便可玩性高-想怎么搞你说了算缺点:吃技术(技术知识不精者请勿请勿尝试)总结 品牌NAS机 缺点:贵 优点:直接使用即可,什么都不用操心,就当云盘使用就可以了。 DIY 优点:便宜,性价比高,可玩性高 缺点:对小白不友好,安装,维护耗时间软件安装系统FreeNAS开源项目使用用户最多的系统之一有着完整的存储系统功能,文件监控使用raid组合阵列技术保护数据安全黑群晖顾名思义就是使用群晖的盗版系统群晖生产的硬件和软件是绑定的,要想在非群晖机器上使用群晖系统。这种就叫黑群晖黑群晖洗白(可以登陆群晖账号)网上有教程,淘宝有买服务补充1:有能力还是要支持正版,毕竟正版机器软件有维护更新,真香警告⚠补充2:群晖系统里的软件有不少是收费的补充3:最好用的NAS系统莫属于群晖系统OpenMediaVault推荐up主谈笑有Herald的《一台电脑的NAS之旅》系列教程开源项目使用用户最多的系统之一有着完整的存储系统功能,文件监控使用raid组合阵列技术保护数据安全windowswindows文件共享这个大家都明白就是使用windows系统的文件共享使用web服务器搭建私有云管理平台:小皮/WAMPwindows性能和安全都不如linuxLinux使用web服务器搭建私有云管理平台LAMP/LNMP/宝塔建站/phpstudy-linux其他NAS系统租用服务器挂载云盘例如:阿里云ES或轻应用服务器挂载OSS。。。网络家用宽带100M带宽-外网下载速度大约在3Mb/s(速度太难-难以接受)500M宽带-外网下载速度大约在18Mb/s(可行-一般下载速度能达到10Mb/s就够用了)缺点:在外网下载受限于家庭宽带的上传带宽(外网下载家nas数据的下载速度==家里nas的最大上传速度)外网访问条件:1.申请公网IP2.内网映射有耗损不建议。映射产品:花生壳专线上传速度==下载速度缺点:专线网络家用太贵资费了解不多,顾不做评价
2020年07月28日
738 阅读
4 评论
1 点赞
2020-07-17
laravel路由笔记
线上正式生产环境测试环境(局域网内,模拟线上环境)开发环境(本地开发)facades(门面xx) 佛萨斯1.通过路由访问 (控制器,视图,闭包,重定向地址)接口降低耦合度容器-目的:不重复造轮子使用指令创建php artisan make:controller HelloController//创建控制器 php artisan make:model Order//创建模型 php artisan make:event OrderPaid//创建事件 中间件在路由和控制之间对接受的字段进行处理。测试路由post时候发现错误注意CSRF 保护不需要csrf保护,在控制器中VerifyCsrfToken.php中接入http完整访问路径,可绕过保护。//生成URLecho $url=route('profile');//生成重定向return redirect()->route('profile');普通路由简单的访问配置Route::get("路由名",“控制器名@方法”);//访问视图(闭包) Route::get('hello', function () { return view('hello'); }); //访问视图 Route::view('hello','hello'); //访问控制器 Route::any('index','IndexController@index'); Route::any('user','user\IndexController@index'); //使用闭包 Route::match(['get','post'],'blog/{id}/{name?}',function($id,$name=''){ return 'blog'.$id.'-'.$name; });路由参数:必填,选填,正则表达式约束,全局属性//正则约束 Route::any('user/{id?}','IndexController@index')->where(['id'=>'[0-5]{2}']);全局变量在http/Providers/RouteServiceProvider.phppublic function boot(){ Route::pattern('id','[0-9]+'); parent::boot(); }特殊路由:重定向路由Route::redirect('/here','/there',301);//参数3默认是302视图路由Route::view('hello','hello');//参数3是[路由参数]推荐使用any ,不推荐match(在接口请求用的多post,get,put)路由起名//往起名的路由中传参 Route::get('test', function () { echo route("yonghu",['id'=>11,'name'=>'bilibili']); echo "<br/>"; echo route("blog",['id'=>12,'name'=>'acfun']); }); //起名 Route::any('user/{id?}','IndexController@index') ->where(['id'=>'[0-5]{2}']) ->name('yonghu'); //起名 Route::match(['get','post'],'blog/{id}/{name?}',function($id,$name=''){ return 'blog'.$id.'-'.$name; })->name('blog');检查路由路由中间件定义中间件指令:php artisan make:middleware CheckAge手动建立<?php namespace App\Http\Middleware; use Closure; class CheckAge { public function handle($request, Closure $next) { if ($request->age <= 200) { return redirect('home'); } return $next($request); } }中间件定义又分为:前置/后置中间件中间件是在请求之前或之后执行,取决于中间件本身// 请求之前执行:执行一些任务 return $next($request);//请求之后执行:$response = $next($request); // 执行一些任务return $response;在ChekAge中填写定义任务,比如:public function handle($request, Closure $next) { if ($request->age <= 200) {//如果age<200使用hello路由 return redirect('hello'); } return $next($request);//否则只用本条路由 }在Http/Kernel.php中添加中间件定义在$routeMiddleware变量中'check' => \App\Http\Middleware\CheckAge::class,最后在路由中使用middlewareRoute::any('index','IndexController@index') ->middleware('\App\Http\Middleware\CheckAge::class'); //或者使用上面routeMiddleware中自定义check //->middleware('check'); //或者使用use(第二行代码简写) //use App\Http\Middleware\CheckAge; //->middleware(CheckAge::class);访问:http://localhost/index?age=201跳转index路由,如果age=200跳转hello路由路由中间件传参//中间件CheckAge方法 public function handle($request, Closure $next,$test) { echo $test.'<br/>'; if ($request->age <= $test) { return redirect('hello'); } return $next($request); } //web路由 Route::any('index','IndexController@index')->middleware('check:100');访问index?age=99,走判断里的hello路由。访问index?age=101,走本身index路由terminable最终中间件-详情见管方手册分组路由Route::middleware('check:100,xiao')//路由参数设置 ->domain('{goods}.laravel.cn')//子域名设置 ->name('admin.')//路由名前缀设置 ->prefix('zx')//路由前缀设置 ->namespace('User')//命名空间设置 ->group(function(){ Route::any('user/{id?}','IndexController@index') ->where(['id'=>'[0-5]{2}']) ->name('yonghu'); Route::match(['get','post'],'blog/{id}/{name?}',function($goods,$id,$name=''){ return 'blog'.$id.'-'.$name.'子域名:'.$goods; })->name('blog'); });回退路由Route::fallback(function(){ echo '404'; });
2020年07月17日
108 阅读
0 评论
0 点赞
2020-07-13
tp5一对一关联
关联查找hasOne主表拥有副表的资源在主表模型层使用hasOne('关联模型名','外键名','主键名',['模型别名定义'],'join类型');直接用主表名::get('id值');belongsTo相对关联在副表模型层使用belongsTo('关联模型名','外键名','关联表主键名',['模型别名定义'],'join类型');直接用副表名::get('id值');关联新增使用正规封装//控制器使用封装模型 $data=[ 'user_name'=>'zhuoxiang123','password'=>md5(123), 'pic_url'=>'aaaa','thumb_url'=>'bbb', ]; $obj=new Member(); $result=$obj->add($data); //模型 public function add($data){ try{ //开启事务 $this->startTrans(); $this->isUpdate(false)->allowField(true)->save($data); $this->logo()->save(['pic_url'=>$data['pic_url'],'thumb_url'=>$data['thumb_url']]); $this->commit(); return true; }catch(Exception $e){ $this->error=$e->getMessage(); $this->rollback(); return false; } }hasOne形式//控制器直接使用(不规范,严谨在项目中使用) $obj=Member::create(['user_name'=>'zhuo','password'=>md5(123)]); $obj->logo()->save(['pic_url'=>'aaa','thumb_url'=>'bbb']);//logo是从表中的方法关联自动写入的定义,需要配合hasOne中的定义方法名//添加主表Member数据 $obj1=New Member(); $obj1->user_name='zhuoxiang2333'; $obj1->password=md5(123); //添加副表Avatar数据 $obj2=New Avatar(); $obj2->pic_url='cccc'; $obj2->thumb_url='cccc'; $obj1->logo=$obj2; $result=$obj1->together('logo')->save(); var_dump($result);关联修改第一种:(不推荐,在项目不要在控制器写逻辑)$obj=Member::get(1024); $result=$obj->logo->save(['thumb_url'=>'cccccc']); var_dump($result);第二种:(常用) //控制器 $data=[ 'user_id'=>1024, 'user_name'=>'zhuo666666', 'password'=>md5(123), 'pic_url'=>'aaaa', 'thumb_url'=>'qqqqqqqqqqq2', ]; $obj=new Member(); $result=$obj->edit($data); //模型层更新封装 public function edit($data){ try{ $this->startTrans(); if(empty($data)){ return false; } $this->isUpdate(true)->allowField(true)->save($data); $this->logo()->save(['pic_url'=>$data['pic_url'],'thumb_url'=>$data['thumb_url']]); $this->commit(); return true; }catch(Exception $e){ $this->error=$e->getMessage(); $this->rollback(); return false; } }第三种:(更改字段少时好用) $obj=Member::get(1025); $obj->password=md5(12345678); $obj->logo->pic_url='1234567.jpg'; $result=$obj->together('logo')->save(); var_dump($result);关联删除方法1:(快速,常用)//控制器(也可以封装到模型) $obj=Member::get(1027); $result=$obj->togetther('logo')->delete(); var_dump($result);方法2:(麻烦)//控制器 $obj=Member::get(1027); $result=$obj->delete();//删主表 $result=$obj->logo()->delete();//删副表 var_dump($result);方法3:使用模型层封装上面的的代码//控制器使用 $result=Member::delete2(1027); var_dump($result); //使用new方式 public function delete2($data){ try{ $this->startTrans(); $obj=Member::get($data);//可以使用$obj=$this->find($data); $obj->delete(); $obj->logo()->delete(); $this->commit(); return true; }catch(Exception $e){ $this->error=$e->getMessage(); $this->rollback(); return false; } } //使用静态方式 public static function delete3($data){ try{ self::startTrans(); $obj=Member::get($data); $obj->delete(); $obj->logo()->delete(); self::commit(); return true; }catch(Exception $e){ self::rollback(); return false; } }
2020年07月13日
197 阅读
0 评论
0 点赞
2020-07-07
tp路由
前言意义:隐藏真实的项目地址(防止非法入侵的人直接获取真实的项目地址) 方便用户的记忆,起到见名之意的效果 更适合搜索引擎的优化注意:1.使用路由定义时,入口文件依然需要在url中来写,如果需要隐藏入口文件,需要配合Apache或者Nginx这类发布容器来进行隐藏,只需要修改配置文件(重写规则)即可;而路由是框架来定义的,所以放到Apache和nginx都好使,所有一般隐藏入口文件用Apache或者nginx的重写功能(Rewrite)来完成;具体的路由都按照框架的路由方式来定义。2.如果要隐藏入口文件,在apache环境下可以使用.htaccess文件来隐藏,但5.6以上版本需要把规则改成RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]规则:多条路由执行时,后面相同规则会覆盖前面的 不用的规则,但解析的结构相同时,先解析的先执行\think\Route::rule('路由表达式','路由地址','请求类型',[路由参数],[变量规则]);tp5路由的三种模式:【普通模式】 path_info访问//设置 'url_route_on' => false, // 按照顺序解析变量 'url_param_type' => 1,路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO 模式访问URL【混合模式】开启路由,并使用路由定义+默认PATH_INFO方式的混合'url_route_on' => true, 'url_route_must'=> false,【强制路由】开启路由,并设置必须定义路由才能访问'url_route_on' => true, 'url_route_must' => true,动态注册think\Route::rule('index/:id','index/News/read')参数1:路由表达式'/' => 'index', // 首页访问路由 'my' => 'Member/myinfo', // 静态地址路由 'blog/:id' => 'Blog/read', // 静态地址和动态地址结合 'new/:year/:month/:day'=>'News/read', // 静态地址和动态地址结合 ':user/:blog_id'=>'Blog/read',// 全动态地址首页:/静态地址:直接以字符串来定义动态地址:以冒号开始后面跟着变量名,相当于给静态地址传入一个pathinfo的参数,参数名就是变量名可选定义:如果像省略不写=》[] 可选参数只能放到路由规则的最后,如果在中间使用可选参数那后面的变量也都变成可选参数(在tp中可能会报错误控制器不存在)完全匹配:如果希望完全匹配,可以在路由表达式最后使用$符号; 如果不加完全匹配,可能出现前半部分与路由表达式匹配成功,后面又添加了一些参数,也能(错误的)匹配成功;//开启路由定义的全局完全匹配 'route_complete_match' => true,额外参数:类似隐式传参,但是通过url方式传递的参数,只是外界看不到,可以进行一些安全的防范;例如:传参配合自动注入+静动态地址结合//route.php \think\Route::rule('path/:id','index/Index/pu'); //Index.php public function pu($id){ echo $id.'<br>'; return '动态注册'; } //访问; shop.com/path/233路由参数(数组)第四个参数的两种写法//方法1 \think\Route::rule('rt/[:id]','index/Index/ob','get',[],['id'=>'\d+'])//rt/11 //方法2 \think\Route::get('rt/[:id]','index/Index/ob',['method' => 'get'],[],['id'=>'\d+'])//rt/11 参数2:路由地址路由到达的目标(代码)5中定义方式:定义方式定义格式方式1:路由到模块/控制器'[模块/控制器/操作]?额外参数1=值1&额外参数2=值2...'方式2:路由到重定向地址'外部地址'(默认301重定向) 或者 ['外部地址','重定向代码']方式3:路由到控制器的方法'@[模块/控制器/]操作'方式4:路由到类的方法'\完整的命名空间类::静态方法' 或者 '\完整的命名空间类@动态方法'方式5:路由到闭包函数闭包函数定义(支持参数传入)方式1和方式3的区别:方式1会初始化模块(通过对模块内的配置想是否读取就能进行验证);方式3仅仅是路由到控制器的方法,模块不会被初始化;换句话这时候控制器类似于普通的类文件方式3会调用应用类方式4只会使用第三方类参数3:请求类型get和postput和Delete{Restful}any(*)请求参数大写多个类型用| 竖线分割。比如GET|POST参数4:路由参数对路由的规则进行参数的限制或者定义详细参数(数组)见tp官方手册https://www.kancloud.cn/manual/thinkphp5/118034行为层必须使用run方法比如建立文件application\behavior\UserCheck.php<?php namespace app\index\behavior; class UserCheck{ public function run(){ echo request()->url(); if('/fn/0' ==request()->url()){ return false; } } }栗子:\think\Route::any('url',function(){ return "url"; },['htpps'=>true]); \think\Route::any('fq',function(){ return "fq"; },['callback'=>'my_check_fun']); \think\Route::any('fqq',function(){ return "fqq"; },['before_behavior'=>'\app\index\behavior\UserCheck']);参数5:变量规则针对的是路由表达式中的动态参数来指定对应参数的规则(参该如何写,通常为正则表达式来设定)全局变量规则:针对每条路由规则中的参数单独定义局部变量规则:针对每条路由规则中的对应参数进行定义完整URL规则:如果要对整个URL进行规则检查,可以进行__url__变量规则,例如:['__url__'=>'new\/\w+$']栗子://方式1 \think\Route::pattern('name','\d+'); //方式2(局部定义-常用) \think\Route::rule('new/:na',function($na){ return "OK:".$na; },'GET|POST',[],['__url__'=>'new\/\w+$']); 组合变量在定义某些特殊路由规则是可以使用组合变量例如Route::get('item-<name>-<id>','index/detail',[],['name'=>'\w+','id'=>'\d+']);使用闭包测试栗子://浏览器输入http://网址/date/abc05 \think\Route::rule('date/<na><id>',function($na,$id){ return $id."=>".$na; },'GET|POST',[],['na'=>'[a-zA-Z]+','id'=>'[0-5]+']); //浏览器输入http://网址/datee/abc-05 \think\Route::rule('datee/<na>-<id>',function($na,$id){ return $id."<=组合变量=>".$na; },'GET|POST',[],['na'=>'\w+','id'=>'[0-5]+']);批量注册方式一:将理由表达式的参数通过数组方式定义,键名为路由表达式,键值为里有地址;规则中的路由地址由空字符串占位,其他参数不遍;方式二:通过配置文件的return数组形式定义,关联数组的键名为路由表达式: 键值为索引数组,形式为[路由地址(5种),路由参数(数组),变量规则(数组)]'__pattern__'为全局变量规则,具体规则用关联数组来定义[变量名=>变量规则]栗子://访问浏览器 //http://地址/blog/15.html //http://地址/bg2.html //http://地址/bg3/abc/15.html return [ 'blog/:id' =>['blog',['ext'=>'html'],['name'=>'[a-zA-Z]+','id'=>'[0-5]+']], 'bg2'=>['@index/Index/bg23',['ext'=>'html'],['name'=>'[a-zA-Z]+','id'=>'[0-5]+']], 'bg3/:name/:id'=>['bg24',['method'=>'get|post','ext'=>'html'],['name'=>'[a-zA-Z]+','id'=>'[0-5]+']], ];快捷路由直接为控制器定义一个路由规则,每个方法的名字为请求类型+方法名(驼峰法命名)// 给Index控制器设置快捷路由 Route::controller('in','index/Index');创建类库文件(自动生成一下方法)>php think make:controller index/Usernamespace app\index\controller; class User { public function getInfo(){} public function getPhone(){} public function postInfo(){} public function putInfo(){} public function deleteInfo(){} } //通过一下方式访问 //get http://localhost/user/info //get http://localhost/user/phone //post http://localhost/user/info //put http://localhost/user/info //delete http://localhost/user/info路由别名路由别名功能可以使用一条规则,批量定义一系列的路由规则。// user 别名路由到 index/User 控制器 \think\Route::alias('user','index/User'); //或者 return [ '__alias__' => [ 'user' => 'index/User', ], ]; //访问方式: //http://serverName/index.php/user/add //http://serverName/index.php/user/edit/id/5 //http://serverName/index.php/user/read/id/5 // user 路由别名指向 User控制器类 Route::alias('user','\app\index\controller\User'); // user 别名路由到 index/user 控制器 Route::alias('user','index/user',['ext'=>'html']);路由别名不支持变量类型和路由条件判断,单纯只是为了缩短URL地址,并且在定义的时候需要注意避免和路由规则产生混淆。路由分组路由分组功能允许把相同前缀的路由定义合并分组,这样可以提高路由匹配的效率,不必每次都去遍历完整的路由规则。我的理解是建立一个2级路由然后组内的路由规则可以统一定义管理方便。设置公共的路由参数栗子://访问浏览器 //http://地址/group/15.html //http://地址/group/bg2.html //http://地址/group/bg3/abc/15.html \think\Route::group('goods',[ 'blog/:id' => ['blog'], 'bg2'=>['@index/Index/bg23'], 'bg3/:name/:id'=>['bg24'], ],['method'=>'get|post','ext'=>'html'],['name'=>'[a-zA-Z]+','id'=>'[0-5]+']);使用闭包方式注册路由分组栗子:\think\Route::group('blog',function(){ Route::any(':id','blog/read',[],['id'=>'\d+']); Route::any(':name','blog/read',[],['name'=>'\w+']); },['method'=>'get','ext'=>'html']); //或者 \think\Route::group(['method'=>'get','ext'=>'html'],function(){ Route::any('blog/:id','blog/read',[],['id'=>'\d+']); Route::any('blog/:name','blog/read',[],['name'=>'\w+']); });路由分组嵌套栗子:\think\Route::group(['method'=>'get','ext'=>'html'],function(){ Route::group('blog',function(){ Route::any('blog/:id','blog/read',[],['id'=>'\d+']); Route::any('blog/:name','blog/read',[],['name'=>'\w+']); } });MISS路由如果希望在没有匹配到所有的路由规则后执行一条设定的路由,可以使用MISS路由功能,只需要在路由配置文件中定义return [ 'new/:id' => 'News/read', 'blog/:id' => ['Blog/update',['method' => 'post|put'], ['id' => '\d+']], '__miss__' => 'public/miss', ]; //或者使用miss方法注册路由 \think\Route::miss('public/miss');也可以写在分组路由配置中路由绑定可以使用路由绑定简化URL或者路由规则的定义不建议用和其他路由规则冲突绑定到模块/控制器/操作// 绑定当前的URL到 index模块 \think\Route::bind('index'); // 绑定当前的URL到 index模块的blog控制器 \think\Route::bind('index/blog'); // 绑定当前的URL到 index模块的blog控制器的read操作 \think\Route::bind('index/blog/read');绑定到命名空间// 绑定命名空间 \think\Route::bind('\app\index\controller','namespace'); //访问http://地址/index/Blog/read绑定到类// 绑定到类 \think\Route::bind('\app\index\controller\Blog','class'); //http://地址/read/id/5入口文件绑定见手册介绍:https://www.kancloud.cn/manual/thinkphp5/118040资源路由\think\Route::resource('blog','index/blog'); //或者 return [ // 定义资源路由 '__rest__'=>[ // 指向index模块的blog控制器 'blog'=>'index/blog', ], // 定义普通路由 'hello/:id'=>'index/hello', ]设置后会自动注册7个里有规则标识请求类型生成路由规则对应操作方法(默认)indexGETblogindexcreateGETblog/createcreatesavePOSTblogsavereadGETblog/:idreadeditGETblog/:id/editeditupdatePUTblog/:idupdatedeleteDELETEblog/:iddelete访问方法:http://域名/blog/http://域名/blog/128http://域名/blog/28/edit创建类库文件(自动生成上面7个方法)>php think make:controller index/UserURL生成ThinkPHP5.0支持路由URL地址的统一生成,并且支持所有的路由方式,以及完美解决了路由地址的反转解析,无需再为路由定义和变化而改变URL生成。Url::build('地址表达式',['参数'],['URL后缀'],['域名'])url('地址表达式',['参数'],['URL后缀'],['域名'])地址表达式和参数//定义一个路由规则 \think\Route::rule('blog/[:abc]$','index/Index/blog2'); \think\Route::rule('ver','@index/Index/ver'); //用以下方式生成url地址 echo Url::build('index/Index/blog2',['abc'=>'aabbcc'],'',true); echo Url::build('@index/Index/ver',['abc'=>'aabbcc'],'',true); //最后输出结果 /* http://shop18/blog/aabbcc http://shop18/ver/abc/aabbcc */使用模块/控制器/操作生成// 生成index模块 blog控制器的read操作 URL访问地址 Url::build('index/blog/read','id=5&name=thinkphp'); // 使用助手函数 url('index/blog/read','id=5&name=thinkphp');使用类的方法生成//定义动态路由规则 \think\Route::rule(['verify','ver'],'\app\index\controller\Index@ver'); \think\Route::rule(['zx','zx'],'\com\zx\Zhuoxiang::showMsg?id=123'); //用以下方式生成url地址 echo Url::build('verify',['name'=>'zhangsan'],'',true); echo Url::build('zx',['name'=>'zhangsan'],'',true); //最后输出结果 //http://shop18/ver/name/zhangsan //http://shop18/zx/name/zhangsanURL后缀//默认情况下,系统会自动读取url_html_suffix配置参数作为URL后缀(默认为html) 'url_html_suffix' => 'shtml' //生成地址为:/index.php/blog/5.shtml //设置支持多个后缀 'url_html_suffix' => 'html|shtml' //指定URL后缀生成 Url::build('index/blog/read','id=5','shtml'); url('index/blog/read','id=5','shtml');域名生成生成锚点隐藏或显示入口文件详情请看tp官方文档:https://www.kancloud.cn/manual/thinkphp5/118041
2020年07月07日
180 阅读
0 评论
0 点赞
2020-06-30
CentOS7手动安装Nginx1.18
系统:CentOS 7请根据自己实际情况进行安装我所用的环境:本地Xshell连接本地虚拟器CenOS7系统进行操作我肯定不会说因为偷懒,使用Xshell可以复制代码。yum部署CenOS 7 自带yum-3.4.3-161查看已经安装好的yum源仓库yum repolist 查询原有的yum rpm -qa |grep yum 删除原有的yum rpm -aq|grep yum|xargs rpm -e –nodeps和rpm -qa |grep yum下载yum wget http://mirrors.163.com/centos/7/os/x86_64/Packages/yum-3.4.3-161.el7.centos.noarch.rpm更换yum源wget -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo //或者 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 清除缓存//清除系统所有yum缓存 yum clean all //生成yum缓存 yum makecache安装编译工具及库文件yum -y install make zlib zlib-devel gcc-c ++ libtool openssl openssl-devel安装PCRE库一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩。https://blog.csdn.net/eddy23513/article/details/81366751或者使用yum安装yum install pcre pcre-devel或者apt-get install libpcre3 libpcre3-dev查看pcre版本pcre-config --version安装zlib库yum安装yum install -y zlib zlib-devel安装Nginxwget安装wget http://nginx.org/download/nginx-1.18.0.tar.gz如果没有wget使用yum安装 yum -y install wget解压tar zxvf nginx-1.18.0.tar.gz进入安装包目录cd nginx-1.18.0编译安装./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35编译make安装make install查看nginx版本nginx -v或者使用yum安装nginx1.18.0yum安装首先配置vim /etc/yum.repos.d/nginx.repo文件[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true安装yum install nginx启停服务service nginx status | stop | start设置开机启动systemctl enable nginx查看版本nginx -v测试访问ip(默认80端口)如果访问失败,请关闭防火墙https://blog.csdn.net/mayancheng7/article/details/106319196/Xshell连接vm虚拟机CentOS系统1.虚拟机网卡使用NAT2.查看CentOS系统ip id addr3.Xshell连接,主机填ip 端口默认22补充-80端口被占用1、根据端口号得到其占用的进程的详细信息netstat -tlnp|grep 802、手工终止进程的运行kill 835如果终止不了,可以强制终止kill -9 5014【参考资料】centos7 安装php5.6+nginx1.11+mysql5.7https://www.jianshu.com/p/837ebf98d47dNginx安装配置(菜鸟)https://www.runoob.com/linux/nginx-install-setup.htmlyum安装Nginx1.18.0https://blog.csdn.net/mayancheng7/article/details/106319196/CentOS安装zlib库https://blog.csdn.net/sirria1/article/details/83115582无聊又漫长的录制操作视频(失效)https://cloud.uuppp.top/#/s/3gfK
2020年06月30日
156 阅读
0 评论
0 点赞
2020-06-21
MySQL索引系列问题
mysql高性能索引问题真题:简单描述mysql中,索引,主键,唯一索引,联合索引的区别对数据库的性能有什么影响?mysql索引的基础和类型什么是索引:在索引中找到对应的值,然后依据匹配的索引找到对应的数据行常用的数据引锁:主键索引、唯一索引、普通索引、全文索引、组合索引索引对性能的影响大大减少服务器需要扫描的数据量帮助服务器避免排序和临时表将随机I/O变顺序I/O大大提高查询速度,降低写的速度、占用磁盘索引的使用场景对非常小的表,大部分情况下全表扫描效率更高中到大型表,索引非常有效特大型的表,建立和使用索引代价将随之增长,可以使用分区技术来解决索引类型普通索引:最基本的索引,没有任何约束限制;唯一索引:与普通索引类似,但是具有唯一性约束;主键索引:特殊的唯一索引,不允许为空值;唯一索引和主键索引的区别:一个表只能有一个主键索引,可以有多个唯一索引。主键索引一定是唯一索引,唯一索引不是主键索引。主键可以与外键构成参照完整性约束,防止数据不一致。组合索引:将多个列组合在一起创建索引,可以覆盖多个列;外键索引:只有InnoDB类型的表才可以使用外键索引,保证数据的一致性,完整性和实现级联操作;全文索引:MySQL自带的全文索引只能用于MyISAM,并且只能对英文进行全文检索mysql索引的创建原则最适合索引的列是出现在where子句中的列,或连接子句中的列而不是出现在select关键字后的列;索引列的基数越大,索引的效果越好;对字符串进行索引,因该指定一个前缀长度,可以节省大量的索引空间;根据情况创建复合索引,复合索引可以提高查询效率;避免创建过多索引,索引会额外占用磁盘空间,降低写操作效率;主键尽可能选择较短的数据类型,可以有效减少索引的磁盘占用提高查询效率;mysql索引的注意事项复合索引遵循前缀原则;like查询,%不能在前,可以使用全文索引;https://www.bilibili.com/video/BV1hE411Y7sB?p=6https://blog.csdn.net/b_x_p/article/details/86434387待补充...
2020年06月21日
192 阅读
0 评论
0 点赞
2020-06-21
MySQL系列基础知识
mysql基础知识整型类型整数字段有tinyint,smallint,mediumint,int,bigint属性有:unsigned(不能为负)INT(11)长度是11位,INT(3)中如果指定zerofill(0填充)输入 1234也是可以存进数据库中的,输入12存入数据库时数据个数不足用0填充,即012实数类型常见实数有float,double,decimalfloat和double小数点之后是有范围的,而decimal无论小数点后面有多少位都可以保存下来。字符串类型常见字符串类型有varchar,char,text,blobvarchar存储可变长度字符串(优点节省空间),使用1/2个额外字节记录字符长度,小于255字节使用1个字节。超出指定长度会截取舍去(有的版本会报错);char存固定长度,使用空格进行填充。超出指定长度也会被截断。(优点:1对于经常变更的数据比varchar不容易产生碎片。2对非常短的列比varchar储存空间更有效率);避免使用text,blob,因为查询使用临时表导致性能开销;时间和日期类型尽量使用timestamp,比datetime空间效率高用整数保存时间戳格式通常不方便处理。储存微秒可以使用bigint(整形)存储mysql基础操作连接和关闭:mysql -u(指定用户名) -p(密码) -h(主机) -P(端口)\G(打印结果垂直显示),\c(取消当前操作),\q(退出mysql),\s(显示mysql状态),\h(帮助信息),\d(特殊符号转换符)mysql数据表引擎InnoDB特点:事务性引擎,最重要最广泛的存储引擎,性能非常优秀。数据储存在共享表空间中(默认叫ibdata1),可以通过配置分开对主键查询的性能高于其他类型的储存引擎内部做了很多优化,从磁盘读取数据时自动在内存构建hash索引,插入数据时自动构建插入缓冲区支持:通过一些机制和工具支持热备份支持奔溃后的安全恢复支持行级锁支持外键MyISAM在5.1版本前,是默认存储引擎拥有全文索引,压缩,空间函数不支持事务和行级锁(支持表锁),不支持崩溃后的安全恢复表存储在两个文件,MYD和MYI设计简单,某些场景下性能很好(比如查询)其他表引擎Archive,Blackhole,CSV,Memorymysql锁机制表锁是日常开发当中常见的问题,当多个查询同一时刻进行数据修改时,就会产生并发控制的问题。分为共享锁(读锁)和排他锁(写锁)读锁共享的,不堵塞,多个用户可以同时读一个资源,互不干扰写锁排他的,一个写锁会堵塞其他的写锁和读锁,这样可以只允许一个人进行写入,防止其他用户读取正在写入的资源。锁粒度表锁,系统性能开销最小,会锁定整张表,MyISAM使用表锁行锁,最大程度地支持并发处理,但是也来了最大的锁开销,InnoDB实现行级锁mysql事务处理mysql提供事务处理的表引擎,InnoDB服务层不管理事务,由下层的引擎实现,所以在同一个事务中使用多种存储引擎不靠谱在非事务的表上执行事务操作不会发出提醒不会报错。mysql存储过程为以后的使用而保存的一条或多条mysql语句的集合存储过程就是有业务逻辑和流程的集合可以在储存过程中创建表,更新数据,删除等等使用场景:通过把处理封装在容易使用的单元中,简化复杂的操作。保证数据的一致性简化对变动的管理mysql触发器触发器提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊存储过程。使用场景:可通过数据库中的相关表实现级联更改(比如:修改一个表触发另一个表同样修改)实时监控某张表中的某个字段的更改而需要做出相应的处理某些业务编号的生成。滥用会造成数据库及应用程序的维护困难
2020年06月21日
166 阅读
0 评论
0 点赞
第20200620期-电脑壁纸-P4
影视-陈芊芊-赵露丝分辨率:1366x768来自视频截图动漫-二刺螈-少女分辨率:2560x1440动漫-崩坏学园3-赤鸢分辨率:1920x1080动漫-二刺螈-少女分辨率:1680x794
2020年06月20日
114 阅读
0 评论
0 点赞
2020-06-17
微信开发流程
JSAPI支付设置支付目录(登录微信支付商户平台(pay.weixin.qq.com)-->产品中心-->开发配置)设置授权域名(网页授权域名,授权回调页面域名)详细情况公众号jsAPI开发填写js安全域名引入js文件通过config接口注入权限验证配置通过ready接口处理成功验证通过error接口处理失败验证微信网页授权填写域名回调地址拉起用户同意界面(OAuth2.0 授权登录接口)获取code用code获取access_token获取用户信息小程序登陆在app.js中onLaunch:function(){}使用wx.logo获取code用code在后台调用登陆凭证校验接口(appid+appsecret+code)获取session_key+openid后台自定义登陆状态与openid,session_key关联,并返回给小程序自定义登陆状态小程序保存登陆状态(wx.storage)使用数据缓存保存openid和session_key返回业务数据
2020年06月17日
134 阅读
0 评论
0 点赞
2020-06-14
图片生成base64数据流
介绍PHP+mysql存储照片有两种方式,1是通过数据库中存储图片的路径来实现图片的存储2是把图片数据存储在数据库中本文介绍就是第2种方法,将图片数据存储在数据库中。方法封装//图片生成Base64数据流 public function base64EncodeImage ($image_file) { $base64_image = ''; $image_info = getimagesize($image_file); $image_data = fread(fopen($image_file, 'r'), filesize($image_file)); $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data)); return $base64_image; }使用方法//图片真实物理路径 $img=ROOT.DS.'public/images.png'; //调用图片生成base64数据流方法 $base64_img = $this->base64EncodeImage($img); //将数据流存储在数据库中 $i=Db::table('lr_wx_info')->where('name','是滑稽啊')->update(['head'=>$base64_img]);数据表的字段类型字段名类型长度小数点允许空值主键headblob00√
2020年06月14日
131 阅读
0 评论
0 点赞
2020-06-09
小程序搜索防抖处理
小程序在搜索处理时候都会考虑输入防抖和节流。在此记录一下我处理防抖功能代码,如果你有更好方案欢迎同我一起交流qwq。主要思路是使用计时器计算,再加上wx.showLoading和 wx.hideLoading等待效果直接扔代码(/= _ =)/~┴┴demo.wxml<view class="container"> <view class="dept-container"> <view class="section"> <input name="keyword" bindinput="bindKeywordInput" placeholder="请输入关键字" confirm-type="搜索" bindconfirm="search"/> </view> </view> <scroll-view scroll-y bindscrolltoupper="upper" bindscrolltolower="lower" bindscroll="scroll" scroll-into-view="{{toView}}" scroll-top="{{scrollTop}}"> <view class="scroll-view-item" wx:for="{{deptsData}}" wx:key="key"> <navigator url="/pages/card/card?class={{item.class}}" open-type="navigate" hover-class="none"> <text class="dept-name">{{item.class}}</text> <text class="dept-count">{{item.count}}</text> <image class="arrow" mode="aspectFit" src="/image/arrow.png"></image> </navigator> </view> </scroll-view> </view>demo.jsPage({ /** * 页面的初始数据 */ data: { keyword: '', deptsData: [], params: '', //搜索条件 countTime:1800, //延迟搜索 时间 searchWaiting: false, //是否等待搜索倒计时中 }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { this.getCustList(); }, /** * 查数据 */ getCustList: function() { var that=this; wx.showLoading({ title: '加载中', }); wx.request({ url: 'https://weixin.uuppp.top/applet/Depar/index', method:'post', data:{ss:that.data.params}, success:function(e){ console.log('成功的回调结果'); console.log(e); var arr=e.data; //关闭loading wx.hideLoading(); that.setData({deptsData:arr}); } }) }, /** * 输入关键字 */ bindKeywordInput: function (e) { this.setData({ countTime:1800, params:e.detail.value, }) //是否处于搜索倒计时中 if (!this.data.searchWaiting){ //console.log(e.detail.value); this.search(); } }, /** * 搜索 * 延迟搜索 */ search: function (e) { var that=this; this.setData({ searchWaiting: true }) let promise = new Promise((resolve, reject) => { let setTimer = setInterval( () => { console.log('搜索倒计时: ' + that.data.countTime); this.setData({ countTime: this.data.countTime - 1000 }) if (this.data.countTime <= 0) { console.log('开始搜索: ' + that.data.params); this.setData({ countTime: 1800, searchWaiting: false, }) resolve(setTimer) } } , 1000) }) promise.then((setTimer) => { that.getCustList();//获取班级列表 clearInterval(setTimer)//清除计时器 }) } }) demo.php(后台处理) /** * 所有班级+人数查询 */ public function index(){ //接值post是否有值:为空则查所有班级,不为空则接参模糊查询 $request=Request::instance(); $post=$request->post(); $arr=''; if($post['ss']!=''){ //trace($post,'搜索不为空传来的值'); $arr = Db::table('lr_wx_info')->field('class')->whereLike('class','%'.$post['ss'].'%')->group('class')->select(); }else { $arr = Db::table('lr_wx_info')->field('class')->group('class')->select(); } $data = [];//存 班级名+人数 foreach ($arr as $k => $v) { $count = Db::table('lr_wx_info')->where('class', $v['class'])->count(); $data[$k] = [ 'class' => $v['class'], 'count' => $count ]; } echo json_encode($data); }后台处理使用的是thinkphp5.0框架mysql
2020年06月09日
196 阅读
1 评论
0 点赞
1
...
3
4
5
...
7