PHP 如何在 return 后继续执行后续脚本

2019-11-08 03:25:49 +08:00
 JingNi

我是想在用户提交查询后返回一段 JSON 传递 KEY 后台继续执行脚本命令,直到执行完毕后根据 KEY 入库,写入对应结果。 用户接收到 key 之后,前端 AJAX 会定时通过 key 请求 key 对应接口返回数据

但是,return 后则不会执行后面的代码了, 不能通过 echo 的方式来解决, 用的是框架,key 是模型查询返回给控制器,控制器返回给用户。

如果另外写一个 PHP 主动去监控数据库未完成数据,会不会有点浪费了。

语言:PHP 框架:THINKPHP5.1 THINKPHP 有提供这样的方法吗?我翻了文档看不到

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/617427

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX