逆向思维在项目开发中真的很重要

  最近一直和我的小组开发一个投资类型的网站,网站的整体已经完成得差不多了,客户今天突然提出了一个要求,希望能够在所有人退出当前聊天大厅后,后面进入的人不能够看到之前用户的聊天记录(原来是可以看到的)。由于聊天室代码是别人写的,且基本算木有注释,也木有相关的文档。研究源码太耗时间了,由于聊天数据比较小,聊天室窗口是从messages表中读取的数据,所以打算当用户退出时,执行某一机制将Ajax_chat_messages表中对应聊天室的数据copy到一个新的Chat_messages表中,同时清除Ajax_chat_messages表中这部分数据。

  由于先入为主的思维定式,一直想的是当最后一个用户退出该聊天大厅后,应该采取一个机制达到这一目的。所以打算通过php的igonre_user_abort()和set_time_limit()函数每隔一段时间执行某一段代码,来检查online(在线用户表)表,查看该大厅是否没有用户了。然而这样的话一是如果前面的用户在函数执行间期退出,新用户也在这个时候登陆,这样这个函数原来的初衷就无法达到,再就是每隔一段时间就对数据库进行查询有点浪费资源。不过我还是尝试了一把^_^:

ignore_user_abort(); // 后台运行
set_time_limit(0); // 永远执行
$interval=60*1; // 每分钟执行一次
$start = 1;
$chat = M(‘Messages‘);
do{
    $start += 2;
    $data[‘userID‘]=‘1‘;
    $data[‘userName‘]=‘user‘;
    $chat->add($data);
    sleep($interval);
}while(true);  

  程序一直在向数据表中插入数据了,嗯,还不错!可是当我想停止的时候,悲剧了!我删除了这段代码,程序在运行,清除缓存关闭浏览器,程序也没停止,还在向数据库添加数据,最后直到我重启了Apache服务器,程序才停止。汗!如果数据量大,估计我数据库就要熄火了。感觉这个自动的东西还是比较危险的,需要精确的控制,稍有不慎就会造成很严重的后果,还是触发机制比较好,我要用了才执行你,不用的时候你就乖乖的在旁边呆着。唉~话痨病又犯了!-_-!!!

  左思右想,也没想出个可以确定用户全部退出的好法子。突然(有时候就是这么突然)灵光一闪,既然我确定不了所有用户退出的确切的时间,但是我可以确定每个用户登录的时间啊(用户在进入聊天大厅的时候要在验证界面输入一遍大厅的密码)。于是我在用户进入验证界面的时候调用了下面的函数,先判断大厅里是否有人,如果没有,视为第二次进入,触发预订机制把前一次的聊天记录copy到chat_messages,并清除原表里对应大厅的聊天数据。问题解决。

 1     //这里判断先判断大厅是否有人,如果没有视为第二次进入,
 2     //则触发预订机制把前一次的聊天记录cp到tr_chat_messages,并清除原表里对应大厅的聊天数据
 3     public function cpMessage($channel){
 4         $m = M(‘Ajax_chat_online‘);
 5         $chat = M(‘Ajax_chat_messages‘);
 6         $newchat = M(‘Chat_messages‘);
 7         $arr = $m->where(‘channel=‘.$channel)->select();
 8         if($arr == null){
 9             $res = $chat->where(‘channel=‘.$channel)->order(‘dateTime desc‘)->select();
10             for($i=0;$i<count($res);$i++){
11                 $a = $newchat->add($res[$i]);
12                 if($a){
13                     $chat->where(‘channel=‘.$channel)->delete();
14                 }
15             }
16         }
17     }

  当然,这是取巧了,如果聊天大厅数据量庞大的话,这样做就不可取了。但是解决问题是前提,这里我想说的是在遇到问题的时候,换个思路,也许问题就能迎刃而解。记在这里,也提醒着自己在未来不要忘了这灵光一闪的感触。更优的法子等得空了再来想。

逆向思维在项目开发中真的很重要,布布扣,bubuko.com

时间: 2024-12-15 20:19:35

逆向思维在项目开发中真的很重要的相关文章

在复杂的项目开发中使用结对编程

在复杂的项目开发中使用结对编程 卢占辉译 在开发软件项目时,不仅写出相应功能的模块很重要:确保写出的模块的易维护性(bug 修复,代码重构)也同样重要. 主打互联网技术和门户网站的Perpetuum 手机公司曾开展了一个长期的软件项目,以研制出一套基于web的内容管理软件.Perpetuum公司的许多开发者都参与了这个项目.项目中大部分复杂的模块都是完全靠个人开发的(非多人协作完成).维护这些模块(即非多人协作完成的模块)非常困难.因为开发某一模块的人还需要开发新的模块或者维护另一既有模块,这需

SSH项目开发中,将jsp页面放在WEB-INF的原因解析

 在一些安全型要求比较高的项目开发中,我们经常看到jsp页面都被放在WEB-INF下面了.这是出于对安全性的考虑, 是为了代码的安全.这样实现起来虽然麻烦了点,而且页面跳转很不方便.但是整个项目的安全性就提高上去了!所 以还是建议在一些安全性要求比较高的项目里使用这种做法! 这是我写的一个例子,我就是将所有的JSP页面都放在WEB-INF下面,然后按照模块进行分配,course文件夹就是放和 课程信息管理相关的JSP页面.假如我们输入https://localhost:8080/项目名称/p

项目开发中常用的PHP函数

日期操作 为了便于存储.比较和传递,我们通常需要使用strtotime()函数将日期转换成UNIX时间戳,只有在显示给用户看的时候才使用date()函数将日期转换成常用的时间格式. strtotime()  函数将任何英文文本的日期时间描述解析为 Unix 时间戳 eg: <?php echo(strtotime("now")); echo(strtotime("3 October 2005")); echo(strtotime("+5 hours&

项目开发中db设计

项目开发中db设计 0.根据原型分析出数据的由来和数据间的关系(实体关系); 1.提取字段,通过powerDesigner设计表; 2.先不加约束,先只建立数据上的单向关联,有需要时在建立双向关联或中间表;3.也可以先建立外键关系,最后删除外键关系;(方便查看表的关系);4.对实体对象通常会补充的字段:     id         主键    entity        关联实体/自己    isDelete varchar(1)  Null    #是否删除    CreateEmpId v

项目开发中对设计模式的思考

前言: 做项目的时候经常会这样的体会:我的代码实现需求了,代码重用性也可以.由于前期需求分析不彻底,只考虑到一种情况,做出来的东西给用户测试的时候,发现又需要改动,这个时候又会觉得前期的设计太过复杂,改动也比较麻烦.当然问题的根本原因是需求分析不彻底,或者对业务敏感度不够.面向对象的封装特性的核心是封装变化点,由于没有察觉到业务变化点,也就无法封装变化点.基于这个问题,我总结的方法是(1)多考虑用户的潜在需求 (2)无法感知用户潜在需求的情况下,代码设计尽量简单,不要做过多设计和封装,在重构的时

项目开发中自定义字段设计原则

在开发系统过程中,做到自定义字段策略设置,目前这种功能是很多系统的标准配置,这样子可以简化后续增加字段的难度,并对自定义字段做管理. 自定义字段功能要注意到以下几点: 1.批量规划好要自定义字段的数据表.2.对自定义字段存放的表字典表做设计3.对自定义字段做不同的属性设计4.自定义字段的扩展设计 1.明确是哪个表需要自定义字段.如果是开发一套易用的系统,做开发的时候对用到的主表做统一的自定义字段设计.这样子方便在以后的开发应用中直接操作自定义功能就能增加字段.很多程序员在初写程序的时候,增加字段

记录在一次前后端分离的项目开发中遇到的坑

问题如下图: 在一次实际的项目开发中,我负责前端开发,使用的是vue+axios,后台使用的是php,由于我们的开发环境处于不同的域名和端口下, 所以出现了跨域问题,当然php服务端 可以直接解决这个问题,但是后端设置之后,前端每次都会先发出options请求,然后再post请求, 这说白了,就是每个接口请求两次.我们来分析下原因: 出于安全考虑,并不是所有域名访问后端服务都可以.其实在正式跨域之前,浏览器会根据需要发起一次预检(也就是option请求),用来让服务端返回允许的方法(如get.p

iOS项目开发中的知识点与问题收集整理(Part 一)

前言部分 注:本文并非绝对原创 大部分内容摘自 http://blog.csdn.net/hengshujiyi/article/details/20943045 文中有些方法可能已过时并不适用于现在的开发环境. 1.Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view  [[self.searchBar.subviews objectAtIndex:0]

软件项目开发中需求分析与设计时间和开发时间的比例分配的问题

从毕业到现在做开发已经有近7年了,大大小小的项目也经历了几十个了.在项目开发的过程中很少有项目在设计阶段投入很多时间的, 有很多情况下,甚至都没有怎么做设计就直接开始编码了,处于一种边开发边设计到状态,还有些时候,设计就是完成一些文档来应付下,很 少有认认真真做设计,然后就直接开始编码,如果遇到需求上问题,再确认.还有些时候,是一边确认需求,一边开始做原型,然后再进入开 发,这种方式倒是比较好,至少可以在前期发现很多问题,避免后续的重大问题出现的几率. 其实从我个人的角度来观察,很多时候我们重开