我是想在用户提交查询后返回一段 JSON 传递 KEY 后台继续执行脚本命令,直到执行完毕后根据 KEY 入库,写入对应结果。 用户接收到 key 之后,前端 AJAX 会定时通过 key 请求 key 对应接口返回数据
但是,return 后则不会执行后面的代码了, 不能通过 echo 的方式来解决, 用的是框架,key 是模型查询返回给控制器,控制器返回给用户。
如果另外写一个 PHP 主动去监控数据库未完成数据,会不会有点浪费了。
语言:PHP 框架:THINKPHP5.1 THINKPHP 有提供这样的方法吗?我翻了文档看不到
1
ysc3839 2019-11-08 04:04:22 +08:00 via Android
这是 PHP CGI 模式的限制。传统 CGI 程序是从头执行到尾,进程结束代表处理完成,没办法继续运行的。
|
2
leishi1313 2019-11-08 06:49:34 +08:00 1
常规做法是上 MQ,别在语言或者框架层面上找解决方案
|
3
shehuizhuyi 2019-11-08 06:52:41 +08:00
队列?
|
4
GreatHumorist 2019-11-08 06:57:42 +08:00 via iPhone 1
fastcgi_finish_request()
|
5
mafeifan 2019-11-08 08:00:13 +08:00 via Android
好像是异步操作,建议试试 swoole
|
6
NoobPhper 2019-11-08 08:14:56 +08:00 via Android
回去上个三本 cs 相关专业吧,有点 cs 基础的都不会这样问,
|
7
killerv 2019-11-08 09:14:13 +08:00 1
return 后继续执行?,监控数据库?,路子太野了。
看你需求就是个耗时操作,这种肯定走消息队列,异步处理。楼上说的 fastcgi_finish_request 也是个方法,但是不建议,虽然 fastcgi_finish_request 对于当前请求是直接返回了,但是进程还在处理任务,这个进程依然是无法处理下一个请求。 |
8
secsilm 2019-11-08 09:18:53 +08:00 via Android
Python 也有这个需求,接收到请求后 return 已收到,然后得继续处理数据,处理时间比较长,所以异步开了一个进程来处理
|
9
littleylv 2019-11-08 09:28:24 +08:00 1
这种应该是很基础的东西了,有时候你一个动作需要做很长时间( 30 秒,1 分钟,2 分钟……)的时候,不可能让前端用户在那转圈等待,会直接返回,动作交给消息队列去做,前端定时往后台查询动作的结果
|
10
Seanfuck 2019-11-08 09:47:24 +08:00 via iPhone
简单点的做法可以 return 前主动发出一个处理请求,比如请求自身不要求返回,php 有相关函数
|
11
JingNi OP @NoobPhper 你可以在回答我的问题后,以你理应具有的优越感来批评我,我会由衷的感谢。或者当个不能提供建议的路人默默路过,毕竟这并不会影响到你的生活。
|
13
wlkq 2019-11-08 10:50:43 +08:00 1
register_shutdown_function 这个函数可以试一试
|