首页 文章 精选 留言 我的

精选列表

搜索[thinkphp],共465篇文章
优秀的个人博客,低调大师

ThinkPHP实现统计在线用户的几种方式

关于统计在线用户的功能。以前也做过,用的一些比较简单的方法,但是缺点也很明显:精确统计和服务器、数据库压力之间要做出平衡。 所以想找一个既能精确统计又能不占用太多服务器资源的方法。先说说一些平常的做法: 一,每次用户操作更新其在线时间 这个方法很直接,在用户表里加一个字段update_time,每次用户进行操作,都更新这个字段为当前时间,一般是在一个被所有Action继承的基类里写这个操作。 然后定义一个过期时间,比如10分钟,表示10分钟没进行任何操作的用户默认为不在线。这样,统计当前在线用户的sql语句大概是这样 selectcount(*)fromthink_userwhereupdate_time>now()-10*60 优点:实现简单,通俗易懂 缺点:1,对“在线”的定义模糊,万一用户看一篇文章时间比较长,10分钟内没进行任何操作,他就被忽略了; 2,如果user表数据量很大,那效率将极差. 二,将在线用户单独放入一张表 对于方法一的改进。新建一张表think_inline,字段有user_id、update_time,每次用户操作时,先判断表里有没有该用户的记录,没有则新增,有就更新update_time。 并同时加上删除失效数据操作 这样,统计在线就可以直接count这张表就行了。而且这表的数据量不会很大(至少要比用户表小的多) deletefromthink_inlinewhereupdate_time 优点:减少数据库压力 缺点:仍然对“在线”的定义不准确 三,用JS定时器 这个方法是综合了一和二。新建一张表think_inline,也是在基类中定义每次用户操作时更新时间,参考二的做法。 不同之处是,在每个html模板里,加上一个js定时器,setInterval('updateTime', 10*3600);每隔10分钟发送一次ajax请求,更新update_time字段。这样,即使用户在一个页面停留时间过长,也不会被误认为不在线了。并且可以通过减少请求的间隔,来增加精确度,当然了,对服务器的压力就更大了。 优点:对在线的判断较为准确缺点:仍然不能既精确又不增加服务器压力,必须在两者之间进行取舍。 四,使用TP的SessionDb驱动进行最优化设计 这也就是网上有人说的session存入数据库的方法,这种方法优点很多。具体做法是。。。 1,为什么要将session存入数据库? session是存储在服务器的一组临时数据。一般情况下,我们在做用户登录时,会将用户数据存入session。这样,在任何页面都可以方便调用,而且 每个客户端会产生唯一的session_id,不会混肴。并且在关闭浏览器后,服务器会有session回收机制,自动删除过期session。 这是session的优点:唯一性、方便调用、不会过多占用资源。但是也有缺点:在客户端是以cookie方式保存的,禁用cookie就没用了。 那么,服务器是如何存放session的呢?他是默认将session以文件的方式保存在硬盘上的。可是,对于我们码农来说,操作数据库要比读文件方便的多,并且可以对session数据进行各种操作。 而统计在线用户人数就是通过统计有多少条session记录来实现的。2,如何把session存入数据库? TP的SessionDb驱动就实现了这个功能。原理就是通过改写PHP默认的session操作来实现,核心函数session_set_save_handler(),有兴趣的可以研究一下。该驱动将session的增、读、取、和删都放入了数据库。 使用方法也很简单: 1,建表,驱动的注释里的sql语句运行下就好 2,添加配置: //Session配置'SESSION_TYPE'=>'db',//数据库存储session'SESSION_TABLE'=>'think_session',//存session的表'SESSION_EXPIRE'=>600,//session过期 这样,只要我们在程序里使用了session()函数,数据库里就会有记录。 3,利用数据库session实现统计在线用户 1,统计在线总人数 $map=array('session_expire'=>array('gt',NOW_TIME));$inline=D('Session')->where($map)->count(); 2,统计游客(未登录)人数 $map=array('session_expire'=>array('gt',NOW_TIME),'session_data'=>array('eq',''));$huiyuan=D('Session')->where($map)->count(); 3,统计会员(已登录)人数 $map=array('session_expire'=>array('gt',NOW_TIME),'session_data'=>array('neq',''));$huiyuan=D('Session')->where($map)->count(); 4,判断一个用户是否在线。 在用户表里新增一个字段:session_id。 (1)在登录操作里,保存该用户的session_id, $session_id=session_id();D('User')->where(array('id'=>$user_id))->save('session_id'=>$session_id); (2)检查session表里是否存在该session_id,未过期并且有值, $map=array('session_id'=>$session_id,'session_expire'=>array('gt',NOW_TIME),'session_data'=>array('neq',''));$res=D('Session')->where($map)->find(); 4,总结1,实现步骤:用户表新增字段保存session_id;使用TP的SessionDb驱动。是不是很简单?2,优点: (1)比上面三种方法对数据库和服务器的压力都小,操作简单 (2)能够区分在线用户是会员还是游客(session_data字段是否有值),discuz就是这样做的 (3)可以通过删除某用户的session记录,实现将其“踢下线”的功能3,缺点: (1)仍然不能精确统计,只能说,XX秒内在线多少人4,注意事项: (1)由于该方法的SessionDb驱动必须使用session()函数才能触发,所以必须配置自动开启session(默认就是开启)。TP在执行流程里会使用session()函数,所以你什么都不写,session数据也会存入数据库。 (2)因为数据库的session数据是不会自己删除的,所以对于过期的数据,必须调用session()方法才会删。 这也就意味着,如果你的网站一个人都没有访问,那么数据库的过期session记录会一直存在。 也就是由于这种机制,对于一些突发事件(用户直接X浏览器、直接关机、发生地震……),在其关闭浏览器的一段时间(session过期时间)后,其他用户对网站的访问,会触发session回收,删除过期记录。所以,就不怕统计出来的数据不准确了。 当然了,就算没人访问,你也可以在count时加上session_expire>time()来统计。 但是也有误差,就是session过期时间,5分钟后过期,就有5分钟的误差。时间设的越小,对数据库的操作就越频繁;越大,精确度就越低。 (3)这个session过期时间就意味着,如果用户5分钟内不进行任何操作,其就会自动退出登录。所以,为了用户体验好,请加上cookie自动登录功能。目前官网就是这么做的。 (4)评论里有人提到,验证码也会存入session,所以我们判断的时候,就不能值统计有值的记录了。 需要先获取有值的数据,再判断里面有没有保存用户信息的参数名。虽然session_data字段是用二进制存储的,但是查询出来就是一个字符串。 比如,我们用的user下标来保存的用户信息, session(,$data); (5)由于每种浏览器都有各自的session机制,所以,如果一个人在一台电脑上同时开了5种浏览器,则数据库会保存5条不同的记录 实际使用时,仍需要考虑搜索引擎的误差。在其抓取我们的页面时,也会产生session。五,最终结论 由于HTTP协议的限制:请求完成后就会断开与客户端的连接。所以实际上, 我们根本无法精确而实时地统计在线人数 !尽管有各种各样的方法来增加统计的精确度,然而都是治标不治本。唯有放弃HTTP协议,使用“长连接”的链接方式,才能精确判断用户在还是离。

优秀的个人博客,低调大师

ThinkPHP 6.0.2 版本发布——2020 新年快乐!

V6.0.2版本发布,祝大家2020新年快乐! 本次更新包含一个可能的Session安全隐患修正,建议更新。 主要更新: 改进设置方法后缀后的操作名获取问题 修正optimize:schema指令 修正Request类inputData处理 改进中间件方法支持传多个参数 修正sessionid检查的一处隐患 完善对15位身份证号码的校验 增加远程多对多关联支持 增加MongoDb的事务支持(mongodb版本V4.0+) 改进insertAll的replace支持 安装和更新 V6版本开始仅支持Composer安装及更新,支持上个版本的无缝更新,直接使用 composer update 更新到最新版本即可。 如果需要全新安装,使用: composer create-project topthink/think tp 官方文档 官方6.0完全开发手册 6.0入门必读教程

优秀的个人博客,低调大师

ThinkPHP V8.0.2 发布 —— 修正版本

V8.0.2版本为修正版本,主要修正了: 改进版本号获取指令(App类VERSION常量废弃) 修正Http类dispatchToRoute方法 改进请求对象获取根域名方法 Feat: 自动获取 php 命令路径,而不是固定用 php fix: is_executable() 的参数不正确 直接使用PHP_BINARY常量 缓存类set方法有效期参数兼容DateTimeInterface参数 修正日志监听事件处理 由于之前PSR规范的原因导致6.*不能完全无缝升级的问题已经解决。 另外,框架版本号获取的机制调整为读取Composer包的版本(php think version指令直接读取composer包的版本号,如果安装的是开发版本,则为8.0.x-dev),因此App类的VERSION常量已经正式废弃。 官方文档 完全开发手册 官方服务 轻言服务正式上线——产品反馈互动轻社区

优秀的个人博客,低调大师

ThinkPHP V6.0.7 发布——修正版本

V6.0.7版本发布,本版本主要针对上个版本做了一些路由修正,还意外收获了一些性能提升,是一个建议更新的版本。 主要更新 修正Validate类的PHP8兼容性 改进redis驱动的append方法 修正路由匹配检测问题 优化路由变量正则规则生成 改进responseView的内容渲染 安装和更新 V6版本开始仅支持Composer安装及更新,支持上个版本的无缝更新,直接使用 composer update 更新到最新版本即可。 如果需要全新安装,使用: composer create-project topthink/think tp 官方文档 官方6.0完全开发手册 6.0入门必读教程 官方服务 应用服务市场|ThinkAPI——统一API服务

优秀的个人博客,低调大师

Thinkphp5.0 PHPExcel 数据表格导出导入

1、先在github里面下载PHPexcel这个类库 或者通过以下链接下载PHPexcel类库。 http://www.php.cn/xiazai/leiku/1491 2、解压之后把它复制到extend里面 控制器代码如下: /** * Created by PhpStorm. * User: luxiao * Date: 2017/5/8 * Time: 16:49 */ namespace app\index\controller; use think\Loader; use think\Controller; class Excel extends Controller { function excel() { $path = dirname(__FILE__); //找到当前脚本所在路径 Loader::import('PHPExcel.Classes.PHPExcel'); //手动引入PHPExcel.php Loader::import('PHPExcel.Classes.PHPExcel.IOFactory.PHPExcel_IOFactory'); //引入IOFactory.php 文件里面的PHPExcel_IOFactory这个类 $PHPExcel = new \PHPExcel(); //实例化 $PHPSheet = $PHPExcel->getActiveSheet(); $PHPSheet->setTitle("demo"); //给当前活动sheet设置名称 $PHPSheet->setCellValue("A1","姓名")->setCellValue("B1","分数");//表格数据 $PHPSheet->setCellValue("A2","张三")->setCellValue("B2","2121");//表格数据 $PHPWriter = \PHPExcel_IOFactory::createWriter($PHPExcel,"Excel2007"); //创建生成的格式 header('Content-Disposition: attachment;filename="表单数据.xlsx"'); //下载下来的表格名 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); $PHPWriter->save("php://output"); //表示在$path路径下面生成demo.xlsx文件 } } 调用excel方法就可以生成一个表格了,后续的根据自己的需要自己去写代码. PHPexcel 表格数据导入数据库 city 表,在这之前自己先创建好表单,我这次用的都是地址数据表做的测试: { Loader::import('PHPExcel.Classes.PHPExcel'); Loader::import('PHPExcel.Classes.PHPExcel.IOFactory.PHPExcel_IOFactory'); Loader::import('PHPExcel.Classes.PHPExcel.Reader.Excel5'); //获取表单上传文件 $file = request()->file('excel'); $info = $file->validate(['ext' => 'xlsx'])->move(ROOT_PATH . 'public' . DS . 'uploads'); //上传验证后缀名,以及上传之后移动的地址 if ($info) { // echo $info->getFilename(); $exclePath = $info->getSaveName(); //获取文件名 $file_name = ROOT_PATH . 'public' . DS . 'uploads' . DS . $exclePath; //上传文件的地址 $objReader =\PHPExcel_IOFactory::createReader('Excel2007'); $obj_PHPExcel =$objReader->load($file_name, $encode = 'utf-8'); //加载文件内容,编码utf-8 echo "<pre>"; $excel_array=$obj_PHPExcel->getsheet(0)->toArray(); //转换为数组格式 array_shift($excel_array); //删除第一个数组(标题); $city = []; foreach($excel_array as $k=>$v) { $city[$k]['Id'] = $v[0]; $city[$k]['code'] = $v[1]; $city[$k]['path'] = $v[2]; $city[$k]['pcode'] = $v[3]; $city[$k]['name'] = $v[4]; } Db::name('city')->insertAll($city); //批量插入数据 } else { echo $file->getError(); } 前端代码: <html> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="http://localhost/chexian5.0/index.php/index/excel/intoexcel" enctype="multipart/form-data" method="post"> <input type="file" name="excel" /> <input type="submit" value="导入"> </form> </body> </html> 以上就是TP5.0 PHPExcel 数据表格导出导入的详细内容,更多请关注极客园其它相关文章!本篇文章转自极客园:https://www.jikeyuan.cn/a/29.html

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册