Recentemente, a empresa precisou substituir e migrar servidores antigos. Ao diminuir o contêiner, de repente me ocorreu que muitos processos residentes no projeto não executam processamento de sinal. Isso fará com que o processo seja eliminado diretamente quando o contêiner parar, resultando em situação de perda de dados ou interrupção lógica, então foi utilizado pcntl_signal, que está registrado aqui.
A partir do PHP 5.3.0, ele suporta a série pcntl_signal de funções de controle de processo, que podem instalar e distribuir sinais.
1. Função de processamento de sinal
- pcntl_signal(): Sinal de instalação;
- pcntl_signal_dispatch(): distribui sinal;
- pcntl_sigwaitinfo(): Aguarde sinal;
2. Categoria de Sinal
- SIGTERM: comando de disparo de sinal: kill pid, kill -15 pid, kill -SIGTERM, etc.;
- SIGINT: Sinal de encerramento (interrupção) do programa, geralmente acionado por ctrl+c;
- SIGHUP: Sinal de desligamento, geralmente enviado ao grupo de processos filho após o término do processo pai;
- SIGALRM: sinal do temporizador;
Para mais categorias de sinais, você pode clicar aqui para visualizar.
Nota: PHP não suporta os sinais 9 e 19, ou seja, SIGKILL e SIGSTOP não são suportados.
3. demonstração
<?php
//信号处理器
class Comm_Pcntl{
public static $exit = false;//是否退出
//安装信号
public static function installSignal() {
pcntl_signal(SIGUSR1, function($signal){
self::$exit = true;
});
pcntl_signal(SIGTERM, function($signal){
self::$exit = true;
});
}
//分发信号
public static function dispatchSignal() {
pcntl_signal_dispatch();
}
}
teste
<?php
Comm_Pcntl::installSignal();//安装信号
while (true) {
Comm_Pcntl::dispatchSignal();
if (Comm_Pcntl::$exit) {
exit("信号退出");
}
}
Usando o código acima, você pode testar se, ao eliminar o pid, "sinal de saída" será gerado.