对于同步处理,我们使用带有beanstalkd队列的supervisord。应用程序和工作程序代码都是用php编写的(使用SlmQueue)。我注意到,当我们部署新代码时,新代码不适用于工作进程。我不太确定是什么原因,但我发现了什么:
service supervisor restart
不重启过程(PID保持不变)supervisorctl reload
会重新加载所有进程,新代码现在用于supervisorctl
无法(据我所知)重新加载一个程序并让其他程序继续运行我正在寻找一种部署新代码的方法(通过ansible和git checkout工作),无需重启整个主管进程及其所有子进程。我们用PHP 5.5运行Ubuntu 12.04机器。我想操作码缓存可能起作用,但我不确定如何触发这些特定文件的刷新。
有没有办法优雅地重新加载进程而不是完全重新加载所有的supervisord子进程?或者如果原因可能是操作码缓存,是否可以使用某个触发器刷新缓存?
答案 0 :(得分:0)
您可以使用supervisorctl仅重启一个进程。
supervisorctl -c /etc/supervisord/supervisord.conf
进入主管子shell后,您可以使用status
和restart
重新加载作业。
请考虑以下示例,其中我重新加载花
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中刷新而不重新启动进程,并提供获取统计信息的命令。