php: processamento de sinal pcntl_signal

        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.

おすすめ

転載: blog.csdn.net/panjiapengfly/article/details/125358975