项目中要根据用户请求使用php查询处理数据库大量数据(oracle 800G数据,交并差补运算),等待时间长且不一定。我们知道php是『单线程』的非阻塞的模式运行,在等待的过程中:
1、用户一直处于等待状态,体验非常差(因为程序在等待数据库返回);
2、其他用户无法打开网站(因为程序在等待数据库返回);使用什么技术可以让php程序在接收到用户的运算指令后在后台运算并立即返回一个『任务ID』存入数据库,前台用户随时根据过该『任务ID』获取运算状态及结果信息。即:PHP以类似『多线程』的模式运行,不影响前台用户使用。JAVA很好可以满足该功能,但是我们的项目已经用PHP做好了,现在移植不太现实,不知道各位大神有没有使用PHP制作后台服务的经验。在此求教了。

解决方案 »

  1.   

    可以先创建任务,把查询条件保存入数据库。生成任务id
    task表结构如下
    id        任务id 自增
    uid      用户id
    name 任务描述
    content 查询条件,可用json格式保存
    result 保存查询结果,可以是文件路径或内容
    status     状态 0:未开始 1:进行中 2:已完成 3:失败
    addtime 创建时间
    lastmodify 最后更新时间1.当用户需要查询时,先在task创建一条记录,然后返回任务id。
    2.使用linux的定时任务,每分钟去执行一个php,参考:http://blog.csdn.net/fdipzone/article/details/7263361?locationNum=4&fps=1
    这个php就是执行任务的,具体流程如下
      1.先判断是否有进行中的任务,如果有则返回,不做处理,等下一分钟再
      2.如果没有进行中的任务,则获取是否有未开始的任务,选最早的一条
      select * from task where status=0 order by addtime limit 1;
      3.把选出的这条记录更新为status=1进行中
      4.执行查询操作,最后根据查询结果更新status为2 or 3,并把查询结果保存到文件或其他位置3.用户需要查看任务进度
    select * from task where uid=用户id;
    然后根据status显示任务状态