PHP 执行后台进程,兼容 windows, Linux , Mac osx

2017-04-20 14:29:57 +08:00
 cszchen

最近有一个小需求,主要是我想在 web 上执行一些时间比较长的命令

在 github 上找了一圈,没发现能满足这些条件的(也可能是我英文太差了),主要是不能返回真是的 pid ,尤其是 windows 下的,所以找了很多资料,在 stackoverflow 上终于发现了 windows 下的解决方法,遂造了个小轮子!

之所以不用队列,是因为队列需要我多维护一个服务,太麻烦

github 传送门: https://github.com/imdgr/php-nohup

2835 次点击
所在节点    PHP
12 条回复
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 进程,这是我经验里最省事的方案。
gouchaoer
2017-04-20 14:51:02 +08:00
那个库的方法有点那啥。。。 posix_getsid 这个依赖 posix 扩展了吧,在 win 下用 wmic 来查 pid 。。。你这个能在 php-fpm 里跑么?
R18
2017-04-20 14:56:07 +08:00
pcntl 不能满足你?
cszchen
2017-04-20 15:04:00 +08:00
@gouchaoer 还没在 php-fpm 里试过
cszchen
2017-04-20 15:05:54 +08:00
@gouchaoer symfony/process 也是后台执行的啊,主进程不会等子进程的,不过在 windows 下,他返回的是父进程的 pid 。
cszchen
2017-04-20 15:08:57 +08:00
@R18 好像可以
cszchen
2017-04-20 15:09:47 +08:00
@gouchaoer wmic 查 pid 是有什么不妥吗
cszchen
2017-04-20 15:11:12 +08:00
@gouchaoer 如果你想等子进程执行,需要用 Process 的 wait 方法
gouchaoer
2017-04-20 15:39:36 +08:00
@cszchen 所以说你干掉那个 conhost 进程那 php-cli 就退出了啊
wmic 这种比较耗 cpu ?你为了得到真正的 php-cli 进程的 pid 就是为了干掉它吧
cszchen
2017-04-20 16:19:24 +08:00
@gouchaoer 主要是想通过 pid 看看他是不是执行完退出了
mpanda
2017-04-20 16:31:30 +08:00
swoole?
8355
2017-04-21 14:10:37 +08:00
推荐一个现在在用的包 https://github.com/lavary/crunz
你看看能不能满足你的需求

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

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

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

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

© 2021 V2EX