php后台处理大规模运算,如何处理?

无敌PHP 发布于 2017/01/13 14:26
阅读 1K+
收藏 1
PHP
项目中要根据用户请求使用php查询处理数据库大量数据(oracle 800G数据,交并差补运算),等待时间长且不一定。

我们知道php是『单线程』的非阻塞的模式运行,在等待的过程中:
1、用户一直处于等待状态,体验非常差(因为程序在等待数据库返回);
2、其他用户无法打开网站(因为程序在等待数据库返回);

使用什么技术可以让php程序在接收到用户的运算指令后在后台运算并立即返回一个『任务ID』存入数据库,前台用户随时根据过该『任务ID』获取运算状态及结果信息。

即:PHP以类似『多线程』的模式运行,不影响前台用户使用。

JAVA很好可以满足该功能,但是我们的项目已经用PHP做好了,现在移植不太现实,不知道各位大神有没有使用PHP制作后台服务的经验。

在此求教了。
更多
加载中
0
xinson
xinson
不是即时返回数据的话可以考虑使用异步方式处理。像你说的任务储存到数据库(也可以保存到队列),然后在服务器设定时跑php-cli处理这些任务(也可以使用super)。


php多线程可以使用swoole扩展来实现。这个比较复杂。
xinson
xinson
回复 @无敌PHP : swoole和队列同时使用
xinson
xinson
回复 @无敌PHP : 队列可以理解成放任务的地方,处理任务不是队列处理的。swoole是实现不阻塞。
无敌PHP
无敌PHP
回复 @xinson : swool异步执行只能CLI模式下。但是我的业务逻辑是要用户在WEB上触发,不能在CLI下面呀~!
无敌PHP
无敌PHP
回复 @xinson : 同事问下,swool异步执行,与消息队列组件,我改如何选择?
无敌PHP
无敌PHP
回复 @xinson : 好的,谢谢你,这方面我还是第一次接触。请问『消息队列』是不是仅仅是『数据传递』,然其他PHP运算服务器接收消息,而队列本身不能进行运算。我这样理解对吗?swool可以当做队列组件使用吗?
下一页
0
hylent
hylent
你当那么多实时计算平台是摆设啊。。
无敌PHP
无敌PHP
那你倒是给我推荐一个啊~!!!
0
eechen
eechen
一个 fastcgi_finish_request() 搞定.
<?php
$db = new PDO('sqlite:/dev/shm/task.sqlite3');
$sql = "INSERT INTO task(user_id, return) VALUES(?, '')";
$stmt = $db->prepare($sql);
$stmt->execute(array($user_id));
//返回插入task表里的任务ID(自增主键)
//前台只需根据任务编号$tast_id即可查询自己的任务时候已经完成.
$task_id = $db->lastInsertId();
echo $task_id;
$db = null;
//PHP-FPM返回数据给浏览器,结束请求
fastcgi_finish_request();
//虽然请求已经结束,但PHP-FPM仍然会继续执行下去

$db = new PDO($dsn_oracle, 'user', 'pass');
$sql = '你的很耗时的要给Oracle执行的SQL';
$return = serialize($db->query($sql)->fetchAll(PDO::FETCH_NUM));
$db = null;

//把Oracle查询结果更新到task里
$db = new PDO('sqlite:/dev/shm/task.sqlite3');
$sql = "UPDATE task SET return = ? WHERE id = ?";
$stmt->execute(array($return, $task_id));
$db = null;
?>
无敌PHP
无敌PHP
fastcgi 就是不阻塞的运行对吧?
0
老陌
老陌

这里 你也提到了 后台运行,用户随时查询。用任务队列处理最合适:

用户端: 用户提交请求后写入队列立即返回

后端:运行队列处理程序处理任务,处理完成后将结果放到数据库供用户查询

比较出名的消息队列就是 kafka了,但毕竟重量级。轻量级的用redis/memcache实现

无敌PHP
无敌PHP
谢谢你。我找了一个php-reque 不知道行不行,我先去试试
0
hylent
hylent
回复 @无敌PHP : 额,我的意思是,这种大数据计算不适合用php/oracle做,php就是个前台,提交任务直接返回,然后轮询坐等任务跑完;真正干活的,是我说的“实时计算平台”。厂里我们部门最近好像在推spark,也听过dstream,也记得一个“头条”项目宣讲说是自己用c++搞了一个贴近业务的实时计算。就phper来说,如果不想碰java,可以试试es、xunsearch,或者自己写个服务端程序,跑你说的“交集并集”,当然还得看具体业务。总的来说,你的数据存单台数据库里,这样复杂查询必然慢,优化,那就升级硬件、热数据放内存、设计更好的数据结构和算法啊,等等。
无敌PHP
无敌PHP
es xunsearch 我去了解一下
0
notreami
notreami

重写吧,反正以后还是要重写

无敌PHP
无敌PHP
太残忍了点吧
0
geminiblue
无敌PHP
无敌PHP
这个是队列组件吗?
0
可可西里熊
这个慢应该是处理数据的过程慢吧,可以先将原始数据插入数据库后,返回id,然后通过curl模拟异步请求去处理计算。
0
大賢者
大賢者
高强度计算c++首选,php做前端接收,保存数据db,c++后端专门搞服务的
0
mirai_
mirai_

先理解PHP运行模式

PHP不会出现一个页面阻塞,导致所有页面打不开好吧

把需要长时间处理的任务放入队列,不要告诉你不知道队列是什么?

返回顶部
顶部