supervisord进程不重新加载新的php代码

supervisord进程不重新加载新的php代码,php,supervisord,Php,Supervisord,对于同步处理,我们将supervisord与beanstalkd队列一起使用。应用程序和工作程序代码都是用php编写的(使用)。我注意到,当我们部署新代码时,新代码不适用于工作进程。我不太清楚原因是什么,但我发现: service supervisor restart不会重新启动进程(PID保持不变) supervisorctl reload会重新加载所有进程,现在使用新代码 supervisorctl无法(据我所知)只重新加载一个程序,而保持其他程序仍在运行 我正在寻找一种方法来部署新代码(通

对于同步处理,我们将supervisord与beanstalkd队列一起使用。应用程序和工作程序代码都是用php编写的(使用)。我注意到,当我们部署新代码时,新代码不适用于工作进程。我不太清楚原因是什么,但我发现:

  • service supervisor restart
    不会重新启动进程(PID保持不变)
  • supervisorctl reload
    会重新加载所有进程,现在使用新代码
  • supervisorctl
    无法(据我所知)只重新加载一个程序,而保持其他程序仍在运行
  • 我正在寻找一种方法来部署新代码(通过ansible和git签出进行工作),而无需重新启动所有子进程的完整监管进程。我们使用PHP5.5运行Ubuntu12.04机器。我想操作码缓存可能会起作用,但我不确定如何触发这些特定文件的刷新


    是否有任何方法可以优雅地重新加载进程,而不是完全重新加载所有supervisord子进程?或者,如果原因可能是操作码缓存,是否可以使用某个触发器刷新缓存?

    您可以使用supervisorctl仅重新启动一个进程

    supervisorctl -c /etc/supervisord/supervisord.conf
    
    进入supervisor子shell后,可以使用
    状态
    重新启动
    重新加载作业。 考虑下面的例子,我重新装入花卉

    supervisor> status
       beat_worker:beat_worker_00          RUNNING   pid 32274, uptime 0:27:45
       flower                              RUNNING   pid 32275, uptime 0:27:45
       workers:worker_wkrone_00            RUNNING   pid 32278, uptime 0:27:45
       workers:worker_wkrtwo_00            RUNNING   pid 32276, uptime 0:27:45
       workers:worker_wkrthree_00          RUNNING   pid 32277, uptime 0:27:45
    
    supervisor> restart flower
       flower: stopped
       flower: started
    
    现在,如果您再次执行状态,您将看到
    flower
    的pid已更改

    supervisor> status
       beat_worker:beat_worker_00          RUNNING   pid 32274, uptime 0:28:13
       flower                              RUNNING   pid 32713, uptime 0:00:08
       workers:worker_wkrone_00            RUNNING   pid 32278, uptime 0:28:13
       workers:worker_wkrtwo_00            RUNNING   pid 32276, uptime 0:28:13
       workers:worker_wkrthree_00          RUNNING   pid 32277, uptime 0:28:13
    
    然后只需执行
    ctrl-d
    即可退出SupervisorShell。
    如果检查状态输出,您将看到作业的pid已更改,正常运行时间计数已重新启动。

    Supervisord 3.0附带的supervisorctl允许将单个程序(或程序组)作为单个非交互式命令重新启动

    # supervisorctl help restart
    restart <name>          Restart a process
    restart <gname>:*       Restart all processes in a group
    restart <name> <name>   Restart multiple processes or groups
    restart all             Restart all processes
    Note: restart does not reread config files. For that, see reread and update.
    
    然后通过Web服务器调用它,例如通过
    curlhttps://example.com/flush_cache.php
    。通过Web服务器执行
    opcache\u reset()
    调用以刷新正确的缓存非常重要。通过PHPCLI命令调用它将不起作用


    根据您运行PHP的方式,还有其他一些方法可以刷新它。对于使用mod_php的Apache,您可以通过
    apachectl
    (或类似工具)重新加载Apache。对于PHP-FPM,您可以通过
    服务PHP FPM reload
    (或类似服务)重新加载FPM进程。另一个选项是使用,它允许在不重新启动进程的情况下从cli刷新,还提供了获取统计信息的命令。

    因此您必须手动输入supervisor interactive subshell。我打赌OP想要自动化它,因此交互并不是他真正需要的。
    <?php
    opcache_reset();