所谓热重启,就是当服务器相关代码有所变动之后,无需停止服务,而是在服务器仍然运行的状态下更新文件。swoole通过内置的reload函数以及两个自定义信号量实现了这一功能。 首先我讲解一下swoole可用的三个信号:sigterm,sigusr1,sigusr2。sigterm用于停止服务器,sigusr1用于重启全部的worker进程,sigusr2用于重启全部的task worker进程。 那要如何实现热更新代码文件呢?swoole的回调函数中有这个一个回调 onworkerstart ;该回调会在worker进程启动时被调用。因此,当swoole_server收到sigusr1信号并重启全部worker进程后,onworkerstart就会被调用。如果在onworkerstart中require全部的代码文件,每次onworkerstart后都会重新require一次php文件,这样就能实现代码文件的热更新。 来看下代码实现:
public function onstart( $serv ) { cli_set_process_title(reload_master);}public function onworkerstart( $serv , $worker_id) { require_once reload_page.php; test(); // reload_page.php中定义的一个函数}
首先,在 onstart 回调函数中通过php的cli_set_process_title函数设置进程名。 在 onworkerstart 中,require相关的php文件。 然后,新建一个reload.sh文件,输入如下内容:
echo reloading...cmd=$(pidof reload_master)kill -usr1 $cmdecho reloaded
这样,就可以通过执行这个脚本重启服务器了。 点此查看完整源码