V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cszchen
V2EX  ›  PHP

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

  •  
  •   cszchen · 2017-04-20 14:29:57 +08:00 · 2851 次点击
    这是一个创建于 2785 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    • 能够在 php 中执行后台任务
    • 能够得到真实的 pid ,以便可以随时查看状态或者杀死它
    • 能够把输出重定向到指定文件
    • 兼容至少 windows 和 linux

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

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

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

    12 条回复    2017-04-21 14:10:37 +08:00
    gouchaoer
        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 进程,这是我经验里最省事的方案。
    gouchaoer
        2
    gouchaoer  
       2017-04-20 14:51:02 +08:00
    那个库的方法有点那啥。。。 posix_getsid 这个依赖 posix 扩展了吧,在 win 下用 wmic 来查 pid 。。。你这个能在 php-fpm 里跑么?
    R18
        3
    R18  
       2017-04-20 14:56:07 +08:00
    pcntl 不能满足你?
    cszchen
        4
    cszchen  
    OP
       2017-04-20 15:04:00 +08:00
    @gouchaoer 还没在 php-fpm 里试过
    cszchen
        5
    cszchen  
    OP
       2017-04-20 15:05:54 +08:00
    @gouchaoer symfony/process 也是后台执行的啊,主进程不会等子进程的,不过在 windows 下,他返回的是父进程的 pid 。
    cszchen
        6
    cszchen  
    OP
       2017-04-20 15:08:57 +08:00
    @R18 好像可以
    cszchen
        7
    cszchen  
    OP
       2017-04-20 15:09:47 +08:00
    @gouchaoer wmic 查 pid 是有什么不妥吗
    cszchen
        8
    cszchen  
    OP
       2017-04-20 15:11:12 +08:00
    @gouchaoer 如果你想等子进程执行,需要用 Process 的 wait 方法
    gouchaoer
        9
    gouchaoer  
       2017-04-20 15:39:36 +08:00
    @cszchen 所以说你干掉那个 conhost 进程那 php-cli 就退出了啊
    wmic 这种比较耗 cpu ?你为了得到真正的 php-cli 进程的 pid 就是为了干掉它吧
    cszchen
        10
    cszchen  
    OP
       2017-04-20 16:19:24 +08:00
    @gouchaoer 主要是想通过 pid 看看他是不是执行完退出了
    mpanda
        11
    mpanda  
       2017-04-20 16:31:30 +08:00
    swoole?
    8355
        12
    8355  
       2017-04-21 14:10:37 +08:00
    推荐一个现在在用的包 https://github.com/lavary/crunz
    你看看能不能满足你的需求
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5831 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:43 · PVG 10:43 · LAX 18:43 · JFK 21:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.