最近有一个小需求,主要是我想在 web 上执行一些时间比较长的命令
在 github 上找了一圈,没发现能满足这些条件的(也可能是我英文太差了),主要是不能返回真是的 pid ,尤其是 windows 下的,所以找了很多资料,在 stackoverflow 上终于发现了 windows 下的解决方法,遂造了个小轮子!
之所以不用队列,是因为队列需要我多维护一个服务,太麻烦
github 传送门: https://github.com/imdgr/php-nohup
1
gouchaoer 2017-04-20 14:44:58 +08:00
symphony/process 组件可以,不过不能再 php-fpm 中运行(实际上你最好不要在 php-fpm 中开进程),你需要自己开 php-cli 作为 master 进程,然后主进程再用 symfony/process 组件去开 php-cli 作为 worker 进程
process 组件兼容 windows/linux ,不过我用下来发现一个问题就是,有时候 worker 进程都退出了, master 进程中却仍然看到没退出,要一段时间后才能看到 worker 进程退出,不太准时。 至于队列,你需要一个 redis 就 ok 了。。。 php-fpm 中传递任务到 redis , php-cli 的 master 进程抢占任务去开 worker 进程,这是我经验里最省事的方案。 |
2
gouchaoer 2017-04-20 14:51:02 +08:00
那个库的方法有点那啥。。。 posix_getsid 这个依赖 posix 扩展了吧,在 win 下用 wmic 来查 pid 。。。你这个能在 php-fpm 里跑么?
|
3
R18 2017-04-20 14:56:07 +08:00
pcntl 不能满足你?
|
5
cszchen OP @gouchaoer symfony/process 也是后台执行的啊,主进程不会等子进程的,不过在 windows 下,他返回的是父进程的 pid 。
|
9
gouchaoer 2017-04-20 15:39:36 +08:00
@cszchen 所以说你干掉那个 conhost 进程那 php-cli 就退出了啊
wmic 这种比较耗 cpu ?你为了得到真正的 php-cli 进程的 pid 就是为了干掉它吧 |
11
mpanda 2017-04-20 16:31:30 +08:00
swoole?
|
12
8355 2017-04-21 14:10:37 +08:00
推荐一个现在在用的包 https://github.com/lavary/crunz
你看看能不能满足你的需求 |