【问题标题】:supervisord process does not reload new php codesupervisord 进程不会重新加载新的 php 代码
【发布时间】:2014-06-22 04:45:36
【问题描述】:

对于同步处理,我们使用带有 beanstalkd 队列的 supervisord。应用程序和工作程序代码全部用 php 编写(使用SlmQueue)。我注意到当我们部署新代码时,新代码不适用于工作进程。我不太确定是什么原因,但我确实发现了:

  1. service supervisor restart不重启进程(PID保持不变)
  2. supervisorctl reload 会重新加载所有进程,新代码暂时使用
  3. supervisorctl 无法(据我了解)仅重新加载一个程序并保持其他程序仍在运行

我正在寻找一种部署新代码的方法(通过 ansible 和 git checkout 工作)并且无需重新启动完整的主管进程及其所有子进程。我们使用 PHP 5.5 运行 Ubuntu 12.04 机器。我猜操作码缓存可能会起作用,但我不确定如何触发这些特定文件的刷新。

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

【问题讨论】:

    标签: php supervisord


    【解决方案1】:

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

    supervisorctl -c /etc/supervisord/supervisord.conf
    

    进入主管子shell 后,您可以使用statusrestart 重新加载您的工作。 考虑以下我重新加载花的示例

    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
    

    现在,如果您再次执行 status,您将看到 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 即可退出supervisord shell。 如果您检查 status 的输出,您将看到作业的 pid 已更改并且正常运行时间计数已重新开始。

    【讨论】:

    • 所以你必须手动进入supervisor交互子shell。我打赌 OP 想要自动化它,因此交互式并不是他真正需要的。
    【解决方案2】:

    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.
    

    例如supervisorctl restart my_program 现在可以正常工作了。

    关于如何刷新 PHP 的 opcache 的相关问题,以下内容应该有所帮助:

    一种通用的方法是创建一个包含内容的 .php 文件:

    <?php
    opcache_reset();
    

    然后通过您的网络服务器调用它,例如通过curl https://example.com/flush_cache.php。通过您的网络服务器进行opcache_reset() 调用以刷新正确的缓存非常重要。通过 php cli 命令调用它是行不通的。

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

    【讨论】:

      猜你喜欢
      • 2011-04-17
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 2020-10-26
      相关资源
      最近更新 更多