我想咨询一下,在web端,前端post了一个任务请求, 后端拿到请求后,通过workerman能新开一个进程或者work 来执行我一个比较耗时间的任务么? 然后当前的主进程去响应前端, 任务结束后自主关闭或者交给系统回收, 因为此时主进程的http结束了。
有相关的代码示例么? 而且我更想问的是,目前看到的是相当于创建了一个服务器 所以是否有这个开启新进程的方法。
这个你可以一开始就运行一个进程在那,后端拿到请求后,通过内部通讯,把信息发过去,那边进程收到消息后,根据消息判断去执行操作.我以前就是一直这样操作的.
这个方法我明白适用于不同的服务之间解耦合,创建一个服务用来在线处理这种外部第三方之类的相关任务, 但是我这里是内部的耦合度有一点高。我在我的任务函数内,还会调用内部的一些函数,暂时无法做到外部共享之类的一些内容
服务端 $worker = new Worker('Text://0.0.0.0:12345');
后台发送任务的时候,发送了 函数名和参数,但是实际执行的任务需要用到的环境不同,这个怎么处理的啊 我想问问 这样的形式,如果传递的参数和方法,在不同服务器之间没办法共享数据函数内部资源 如附件图中的execution在后台发送处理任务 然后我想让这个在后台处理,然后快速响应前台内容 但是如果开启新的脚本做服务的话,不同文件数据方法,还有引入文件无法做到完全共享一些函数方法等的存在。。。
直接fork就行了。子进程执行你的任务。主进程执行:```php ignore_user_abort();ob_flush();
我最后还是将耦合的部分拆分了,fork不行我试过在web端,fork linux进程会和主进程直接消失。但是我自己写写的脚本就没问题,这应该就是在web端的应用吧问题吧, ignore_user_abort(True) 有时候可行,有时候任务存在问题 花了漫长时间,重构了项目,现在用接口形式,异步任务处理了, workerman 作为服务端,然后通过 接口形式,做任务交互。这样就不用特意在乎环境问题了
@8223: ignore_user_abort(True)不会有时有用有时没用,你应该没设置超时时间设为永不超时。 你不是说需要调用原进程的函数和一些变量吗,用这个很合适
@6279:一些参数都设置过,例如超时时间、增加内存、还有nginx缓存刷新,等等参数设置例如你说的这个set_time_limit(0), 但是存在一些问题,例如前端页面直接空白,后端任务直接消失,进程中断之类的一些问题。 我还参考过在php-fpm中运行的fastcgi_finish_request 在脚本的例子中有效, 但是在web端无效的情况,很多很多尝试
ini_set("max_execution_time", "0"); 前端页面直接空白,是因为你没有用ob_flush() 把内容推送给浏览器。 不需要fork,只要ob_flush() 把内容推送给浏览器。然后接下来执行你的任务就行了。
队列不行么?
这个问题和参数之类的无关,是和环境有点关系,因为内部代码耦合度很高,队列无法将一个个所有的当前请求进程缓存进队列,所以就会造成了这种情况,如论是redis还是rabbitmq中间件,除非是fork这样开一个进程,一样的环境,不然比较困难,内部的函数参数,无法正确引用,会因为路径还有运行的差异出现一些问题 所以我就拆分了项目重构了一下
这个你可以一开始就运行一个进程在那,后端拿到请求后,通过内部通讯,把信息发过去,那边进程收到消息后,根据消息判断去执行操作.我以前就是一直这样操作的.
这个方法我明白适用于不同的服务之间解耦合,创建一个服务用来在线处理这种外部第三方之类的相关任务,
但是我这里是内部的耦合度有一点高。我在我的任务函数内,还会调用内部的一些函数,暂时无法做到外部共享之类的一些内容
服务端
$worker = new Worker('Text://0.0.0.0:12345');
后台发送任务的时候,发送了 函数名和参数,但是实际执行的任务需要用到的环境不同,这个怎么处理的啊
我想问问 这样的形式,如果传递的参数和方法,在不同服务器之间没办法共享数据函数内部资源
如附件图中的execution在后台发送处理任务
然后我想让这个在后台处理,然后快速响应前台内容
但是如果开启新的脚本做服务的话,不同文件数据方法,还有引入文件无法做到完全共享一些函数方法等的存在。。。
直接fork就行了。子进程执行你的任务。主进程执行:```php
ignore_user_abort();ob_flush();
我最后还是将耦合的部分拆分了,fork不行我试过在web端,fork linux进程会和主进程直接消失。但是我自己写写的脚本就没问题,这应该就是在web端的应用吧问题吧,
ignore_user_abort(True) 有时候可行,有时候任务存在问题
花了漫长时间,重构了项目,现在用接口形式,异步任务处理了,
workerman 作为服务端,然后通过 接口形式,做任务交互。这样就不用特意在乎环境问题了
@8223: ignore_user_abort(True)不会有时有用有时没用,你应该没设置超时时间设为永不超时。 你不是说需要调用原进程的函数和一些变量吗,用这个很合适
@6279:一些参数都设置过,例如超时时间、增加内存、还有nginx缓存刷新,等等参数设置例如你说的这个set_time_limit(0),
但是存在一些问题,例如前端页面直接空白,后端任务直接消失,进程中断之类的一些问题。
我还参考过在php-fpm中运行的fastcgi_finish_request 在脚本的例子中有效,
但是在web端无效的情况,很多很多尝试
ini_set("max_execution_time", "0"); 前端页面直接空白,是因为你没有用ob_flush() 把内容推送给浏览器。
不需要fork,只要ob_flush() 把内容推送给浏览器。然后接下来执行你的任务就行了。
队列不行么?
这个问题和参数之类的无关,是和环境有点关系,因为内部代码耦合度很高,队列无法将一个个所有的当前请求进程缓存进队列,所以就会造成了这种情况,如论是redis还是rabbitmq中间件,除非是fork这样开一个进程,一样的环境,不然比较困难,内部的函数参数,无法正确引用,会因为路径还有运行的差异出现一些问题
所以我就拆分了项目重构了一下