web异步任务问题

chris_fang

我想咨询一下,在web端,前端post了一个任务请求,
后端拿到请求后,通过workerman能新开一个进程或者work
来执行我一个比较耗时间的任务么?
然后当前的主进程去响应前端,
任务结束后自主关闭或者交给系统回收,
因为此时主进程的http结束了。

有相关的代码示例么?
而且我更想问的是,目前看到的是相当于创建了一个服务器
所以是否有这个开启新进程的方法。

阅读 339
4个回答

2548a

这个你可以一开始就运行一个进程在那,后端拿到请求后,通过内部通讯,把信息发过去,那边进程收到消息后,根据消息判断去执行操作.我以前就是一直这样操作的.

  • chris_fang 2021-08-25

    这个方法我明白适用于不同的服务之间解耦合,创建一个服务用来在线处理这种外部第三方之类的相关任务,
    但是我这里是内部的耦合度有一点高。我在我的任务函数内,还会调用内部的一些函数,暂时无法做到外部共享之类的一些内容

chris_fang

服务端
$worker = new Worker('Text://0.0.0.0:12345');

后台发送任务的时候,发送了 函数名和参数,但是实际执行的任务需要用到的环境不同,这个怎么处理的啊
我想问问 这样的形式,如果传递的参数和方法,在不同服务器之间没办法共享数据函数内部资源
如附件图中的execution在后台发送处理任务
然后我想让这个在后台处理,然后快速响应前台内容
但是如果开启新的脚本做服务的话,不同文件数据方法,还有引入文件无法做到完全共享一些函数方法等的存在。。。

  • 暂无评论
dignfei

直接fork就行了。子进程执行你的任务。主进程执行:```php
ignore_user_abort();ob_flush();

  • chris_fang 2021-08-30

    我最后还是将耦合的部分拆分了,fork不行我试过在web端,fork linux进程会和主进程直接消失。但是我自己写写的脚本就没问题,这应该就是在web端的应用吧问题吧,
    ignore_user_abort(True) 有时候可行,有时候任务存在问题
    花了漫长时间,重构了项目,现在用接口形式,异步任务处理了,
    workerman 作为服务端,然后通过 接口形式,做任务交互。这样就不用特意在乎环境问题了

  • dignfei 2021-08-30

    @8223: ignore_user_abort(True)不会有时有用有时没用,你应该没设置超时时间设为永不超时。 你不是说需要调用原进程的函数和一些变量吗,用这个很合适

  • chris_fang 2021-08-30

    @6279:一些参数都设置过,例如超时时间、增加内存、还有nginx缓存刷新,等等参数设置例如你说的这个set_time_limit(0),
    但是存在一些问题,例如前端页面直接空白,后端任务直接消失,进程中断之类的一些问题。
    我还参考过在php-fpm中运行的fastcgi_finish_request 在脚本的例子中有效,
    但是在web端无效的情况,很多很多尝试

  • dignfei 2021-09-01

    ini_set("max_execution_time", "0"); 前端页面直接空白,是因为你没有用ob_flush() 把内容推送给浏览器。
    不需要fork,只要ob_flush() 把内容推送给浏览器。然后接下来执行你的任务就行了。

nitron

队列不行么?

  • chris_fang 2021-08-30

    这个问题和参数之类的无关,是和环境有点关系,因为内部代码耦合度很高,队列无法将一个个所有的当前请求进程缓存进队列,所以就会造成了这种情况,如论是redis还是rabbitmq中间件,除非是fork这样开一个进程,一样的环境,不然比较困难,内部的函数参数,无法正确引用,会因为路径还有运行的差异出现一些问题
    所以我就拆分了项目重构了一下