supervisord进程不会重新加载新的PHP代码

时间:2014-05-05 19:12:23

标签: php supervisord

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

  1. service supervisor restart不重启过程(PID保持不变)
  2. supervisorctl reload会重新加载所有进程,新代码现在用于
  3. supervisorctl无法(据我所知)重新加载一个程序并让其他程序继续运行
  4. 我正在寻找一种部署新代码的方法(通过ansible和git checkout工作),无需重启整个主管进程及其所有子进程。我们用PHP 5.5运行Ubuntu 12.04机器。我想操作码缓存可能起作用,但我不确定如何触发这些特定文件的刷新。

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

2 个答案:

答案 0 :(得分:0)

您可以使用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

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

答案 1 :(得分:0)

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.

E.g。 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中刷新而不重新启动进程,并提供获取统计信息的命令。