tp手册
<?php https://www.cnblogs.com/dawuge/category/1218800.html ---------------------redis防止大并发下二次写入,redis加锁------------------------------- $redis_key = date('Ymd'); $lock_key = 'LOCK_PREFIX' . $redis_key; $is_lock = $redis->setnx($lock_key, 1); // 加锁 if($is_lock == true){ // 获取锁权限 // 设置过期时间,防止死任务的出现 echo 'success'; $redis->expire($lock_key, 5); } else { echo 'error'; // return true; // 获取不到锁权限,直接返回 } -------------------性能测试--------------------------------------------- set_time_limit(0); ini_set('memory_limit','1024M'); function gTime($star,$end = '') { static $info = array(); if (!empty($end)) { $info[$end] = microtime(true); $sconds = $info[$end] - $info[$star]; echo $sconds,"ms<br/>"; } else { $info[$star] = microtime(true); } } //https://www.cnblogs.com/loveyouyou616/p/5415552.html $redis = new Redis(); gTime('1'); $redis->connect('127.0.0.1'); //不具备原子性 ,管道 $redis->pipeline(); for ($i=0;$i<100000;$i++) { $redis->set("test_{$i}",pow($i,2)); $redis->get("test_{$i}"); } $redis->exec(); $redis->close(); gTime('1','e'); -------------------文件锁----------------------------------------------- $fp = fopen("lock.txt", "w+");//读写模式,将文件大小截为零写进头部,没有文件则创建之 if(!flock($fp,LOCK_EX | LOCK_NB)){ //以排他锁或非阻塞模式锁定文件失败,表明【下单正在进行中。。。】 //将下面两行注释,即可编程阻塞(等待)模式 echo "系统繁忙,请稍后再试"; return; } //下单、减库存操作,其中事务操作成功与不成功都需要进行释放锁(强烈建议使用事务) if("减库存成功"){ //exit('库存减少成功'); flock($fp,LOCK_UN);//释放锁 }else{ //exit('库存减少失败'); flock($fp,LOCK_UN);//释放锁 } fclose($fp); -------------------数组排序--------------------------------------------- array_multisort(array_column($temp_num, 'first_price'), SORT_DESC, $temp_num); $new= array_column($data,'time');//选中id列为一个数组 array_multisort($new,SORT_DESC,$data);//以数组中$new顺序的方式对$froms进行排序 ----------------------展示--------------------------------------------- $firstname = "Peter"; $lastname = "Griffin"; $age = "41"; $result = compact("firstname", "lastname", "age"); ----------------------关联数据删除------------------------------------------ $article = Article::with('comments')->find(1); $article->together(['comments'])->delete(); -----------------------mysql打印----------------------------------------------- echo SchoolClassModel::getLastSql(); //打印sql日志 ---------------------显示 隐藏--------------------------------------------------- $list->hidden(['profile' => ['address','phone','email']])->toArray(); $list->hidden(['profile.email'])->toArray(); $list->visible(['profile' => ['address','phone','email']])->toArray(); append(); -----------------------搜索器------------------------------------------------------ $list = SchoolClassModel::withSearch(['grade_id'], ['grade_id' => $data['grade_id']]) ->paginate($limit, false, ['query' => $data]); $data = []; foreach ($list as $key => $val) { $data[$key] = $val; //$data[$key]['birthday'] = date("Y-m-d", $val['birthday']); } return ['list' => $data, 'count' => count($data)]; public function searchGradeIdAttr($query, $value, $data) { $value && $query->where('grade_id', $value); } ------------------------api data----------------------------------------- { "type": "object", "properties": { "total_price": { "type": "string", "description": "id" } }, "required": [ "id" ] } ----------------------------查询----------------------------------------------- UserMessageModel::alias('um') ->join('user u','u.id = um.user_id') ->field('um.id,um.message,um.is_anonymous,um.create_time,um.imgs,u.avatar_id,u.nickname') ->where('um.merchant_id',$id) ->where($where) // ->append(["imgs"]) ->order('um.id desc') ->limit(intval($limit)) ->page(intval($page)) ->select()->toArray(); Db::name('user')->where('id','between','1,8')->select(); Db::name('user')->whereBetween('id','1,8')->select(); -------------------------图片-------------------------------------------------- request()->domain().'/'.PlatformImagesModel::where('id',$img)->value('path'); ------------------------监听-------------------------------------------------- php think make:event UserLogin event('SendNotice', ['data' => $parents,'school_id' => $school_id,'nid'=>$id]); public function onSendNotice($paraem) { } public function subscribe(Event $event) { $event->listen('SendNotice',[$this,'onSendNotice']); } -----------------------345------------------------------------------------------- use think\facade\Request; Request::param('name'); Request::param();全部请求变量 返回数组 Request::param(['name', 'email']); 多个变量 Request::param('a','1') $a不存在使用默认值1 Request::param('username','','strip_tags'); 参数过滤 去掉html标签 htmlspecialchars转换成实体入库 strtolower小写 Request::header(); 请求头数组,支持单个 cookie input("name"); Request::session();获取 $_SESSION 变量 Request::cookie();获取 $_COOKIE 变量 Request::server();获取 $_SERVER 变量 Request::env();返回env数组 Request::file();获取 $_FILES 变量 Request::baseUrl(); /index/index Request::host(true); 域名:www.baidu.com,默认无参数包含端口:80 Request::url(1); 完整域名和地址 http://tp6.api.shanliwawa.top:80/index/index Request::domain(1) http://tp6.api.shanliwawa.top Request::time() 请求时间戳 Request::app() 应用名 index Request::controller() 控制器 Index 参数true小写 Request::action() 操作 index 参数true 小写 Request::method(true); 请求类型获取 GET isGet isPost isPut isDelete isAjax isMobile isHead 判断是否某种类型 Request::has('id','get'); 检测变量id是否存在 url('index/hello', ['id'=>5,'name'=>'李白'],'do'); http://tp6.api.shanliwawa.top/index/hello/李白.do?id=5 url('index/hello#aa'); 锚点 Cache::set('name', $value, 3600); 1小时后过期 Cache::get('name'); 获取缓存 多缓存类型配置 return [ // 缓存类型为File 'type' => 'redis', // 全局缓存有效期(0为永久有效) ,开发下一定要设置-1 否在刷新后 还在 'expire'=> -1, // 缓存前缀 'prefix'=> 'think', // 缓存目录 'host' => '127.0.0.1', ]; return [ // 使用复合缓存类型 'type' => 'complex', // 默认使用的缓存 'default' => [ // 驱动方式 'type' => 'file', // 缓存保存目录 'path' => '../runtime/default', ], // 文件缓存 'file' => [ // 驱动方式 'type' => 'file', // 设置不同的缓存保存目录 'path' => '../runtime/file/', ], // redis缓存 'redis' => [ // 驱动方式 'type' => 'redis', // 服务器地址 'host' => '127.0.0.1', ], ]; use think\facade\Cache; Cache::store('file')->set('name','123',0); $v = Cache::store('redis')->get('name'); Cache::store('default')->get('name');文件缓存 Cache::delete('name'); Cache::clear(); Cache::set('name', [1,2,3]); Cache::push('name', 4); Cache::remember('start_time', time()); 不存在则创建 Cache::inc('name',1); 自增1 Cache::dec('name',1); 自减1 $redis = Cache::handler(); redis对象 配置redis session return [ 'type' => 'redis', 'prefix' => 'think', 'auto_start' => true, // redis主机 'host' => '127.0.0.1', // redis端口 'port' => 6379, // 密码 'password' => '', ] session('name', ['thinkphp']); 设置支持字符串 数组 session('name');获取 session('name', null);删除 session(null);清空 cookie('name', 'value', 3600); 设置不支持数组,序列化后存储 cookie('name'); cookie('name', null); cookie('think_lang','en-us');//设置语言类型 lang('add user error');//翻译 config('cache.type') 读取配置 验证 {:token_field()} 模板中输出令牌 {:token_meta()} ajax提交 $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); Route::post('blog/save','blog/save')->token(); 路由中使用验证 think\facade\Validate $rule = [ 'name' => 'require|max:25', 'age' => 'number|between:1,120', 'email' => 'email', ]; $msg = [ 'name.require' => '名称必须', 'name.max' => '名称最多不能超过25个字符', 'age.number' => '年龄必须是数字', 'age.between' => '年龄只能在1-120之间', 'email' => '邮箱格式错误', ]; $data = [ 'name' => 'thinkphp', 'age' => 10, 'email' => 'thinkphp@qq.com', ]; $validate = Validate::rule($rule)->message($msg); $result = $validate->check($data); if(!$result) { dump($validate->getError()); } 路由 Route::get('new/<id>','News/read'); // 定义GET请求路由规则 Route::post('new/<id>','News/update'); // 定义POST请求路由规则 Route::put('new/:id','News/update'); // 定义PUT请求路由规则 Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则 Route::any('new/:id','News/read'); // 所有请求都支持的路由规则 ->allowCrossDomain();跨域 输出响应 $data=['code'=>200,'msg'=>'信息提示','list'=>['中国']]; json($data); jsonp($data); xml($data); redirect('http://www.thinkphp.cn'); redirect('/index/hello/name'); //站内跳转 download('./static/2.xlsx'); 下载 数据库 use think\facade\Db; $rs =Db::name('user')->where('id',1)->find(); 查询一条记录 name不含前缀 $rs =Db::table('ims_user')->where('sex', 2)->select(); 多条数据 table含前缀 $rs1 =Db::name('user')->where('id', 1)->value('name'); 查询某个字段值 $rs =Db::table('ims_user')->where('sex', 2)->column('name,id','id'); 返回name,id列,后面是key $userId = Db::name('user')->insertGetId($data);//插入数据返回id Db::name('user') ->limit(100) ->insertAll($data); 插入多条数据,分每次100 Db::name('user') ->where('id', 1) ->update(['name' => 'thinkphp']); 更新 Db::table('think_user')->delete(1); Db::table('think_user')->delete([1,2,3]); Db::table('think_user')->where('id',1)->delete(); Db::name('user')->delete(true);//清空数据 where('id','<>',1) 不等于1 > >= like where("id=:id and username=:name", ['id' => 1 , 'name' => 'thinkphp']) field('id,title,content') 指定字段 limit(10,25) 第十条开始25条 单数字返回数据条数 page(1,10) 第一页十条 order(['id'=>'desc','sex'=>'desc']) 排序 group('user_id,test_time') 分组 count() max('id') min() avg() sum() 聚合函数 whereTime('birthday', '>=', '1970-10-1') 支持< = whereTime('create_time','-2 hours') 查询2小时 whereBetweenTime('create_time', '2017-01-01', '2017-06-30') 查询时间段 whereYear('create_time') 今年 whereYear('create_time','2018') last year 去年 whereMonth('create_time') last month上月 2018-06 具体月份 whereWeek('create_time') last week 上周 whereDay('create_time')今天 yesterday昨天 2018-11-1具体 Db::query("select * from think_user where status=1"); 原生查询 Db::execute("update think_user set name='thinkphp' where status=1");//更新插入删除 Db::query("select * from think_user where id=? AND status=?", [8, 1]);//绑定 $list = Db::name('user')->where('status',1)->paginate(10); 分页每页10条 模型 定义全局常量 define('__URL__',\think\facade\Request::domain(1)); http://tp6.api.shanliwawa.top define('__ROOT__',\think\facade\app::getRootPath()); 系统根目录 C:\www\tp6\ define("PRE",config('database.prefix')); 表前缀 绝对路径获取 \think\facade\app::getRootPath() 根目录C:\www\tp6\ \think\facade\app::getAppPath() 应用路径 C:\www\tp6\app\index\ \think\facade\app::getConfigPath() 配置路径C:\www\tp6\config\ \think\facade\app::version() 核心版本 模板视图 use think\facade\View; View::assign([ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); View::assign('data',[ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); View::fetch('index'); 助手函数 view('index', [ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]); 模板输出 {$name} {$data.name} 等价 {$data['name']} {:dump($data)} 使用函数 :开头 {$user.nickname|default="这家伙很懒,什么也没留下"} {$Think.cookie.name} // 输出$_COOKIE['name']变量 {$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量 {$Think.session.user_id} // 输出$_SESSION['user_id']变量 {$Think.get.page} // 输出$_GET['page']变量 {$Request.param.name} 获取name {$data.name|raw} 不转义输出 {$data.create_time|date='Y-m-d H:i'} {literal} Hello,{$name}! 原样输出 {/literal} {load href="/static/js/common.js,/static/js/common.css" /} 加载js,css {php}echo 'Hello,world!';{/php} {/* 注释内容 */ } 或 {// 注释内容 } {include file="public/header" /} 模板包含 {include file="Public/header" title="$title" keywords="开源WEB开发框架" /} 传入参数 {foreach $list as $key=>$vo } {$vo.id}:{$vo.name} {/foreach} {for start="开始值" end="结束值" comparison="" step="步进值" name="循环变量名" } {/for} {if 表达式}value1 {elseif 表达式 /}value2 {else /}value3 {/if} 记录日志 log.php 可添加 'json' => 1 表示json格式 trace("日志信息") app.php中 'app_trace' => true, trace.php改为默认html 'type' => 'Console', 上传 $file = request()->file('image'); 移动到框架应用根目录/uploads/ 目录下 $info = $file->move( '../uploads'); if($info){ 成功上传后 获取上传信息 输出 jpg echo $info->getExtension(); 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg echo $info->getSaveName(); 输出 42a79759f284b767dfcb2a0197904287.jpg echo $info->getFilename(); }else{ 上传失败获取错误信息 echo $file->getError(); } 多文件xphr foreach($files as $file){} 验证,生成带md5文件名 $info = $file->rule('md5')->validate(['size'=>15678,'ext'=>'jpg,png,gif'])->move( '../uploads');