현재 위치: > 최신 기사 목록> 인터럽트 신호를 처리하려면 pcntl_signal과 함께 time_nanoSleep을 사용하십시오

인터럽트 신호를 처리하려면 pcntl_signal과 함께 time_nanoSleep을 사용하십시오

gitbox 2025-05-29

CTRL+C와 같은 신호를 방해하여 SIGINT가 트리거 된 SIGINT와 같은 신호를 방해하기 위해 우아하게 응답하는 것이 특히 중요합니다. Daemons 또는 작업 대기열 작업자와 같이 장기 실행 또는 청취가 필요한 PHP 스크립트를 개발할 때. 이 기사는 PCNTL_SIGNALTIME_NANOSLEEP를 사용하여 인터럽트 신호를 우아하게 처리하는 방법을 소개하여 스크립트가 안전하게 종료하고 자원을 릴리스하며 데이터 손실 또는 비정상적인 상태를 피할 수 있습니다.

1. 기본 개념

1. pcntl_signal

PCNTL_SIGNAL 은 PHP가 제공하는 프로세스 제어 기능 중 하나이며 Sigint , Sigterm 등과 같은 POSIX 신호에 응답하기 위해 신호 처리 기능을 등록 할 수 있습니다. 일반적으로 CLI 스크립트에서 사용됩니다.

2. TIME_NANOSLEP

Time_nanosleep수면 보다 더 세련된 지연 기능으로 나노초 지연을 지원합니다. 빈번한 폴링이 필요한 일부 시나리오에서는 수면 보다 방해하기가 더 쉬워지면서 부드러운 대기 논리를 구현할 수 있습니다.

2. 우아한 중단의 도전

CLI 스크립트에서 수면을 사용하는 데 문제가 있습니다. 프로세스가 수면 중이면 수면이 완료 될 때까지 신호 처리가 즉시 적용되지 않을 수 있습니다. time_nanosleep을 사용하면 짧은 시간과 여러 번 자면서이 문제를 피할 수 있습니다. pcntl_signal_dispatch 와 함께 각 수면 사이에 신호가 있는지 확인할 수 있습니다.

3. 샘플 코드

다음은 우아한 인터럽트를 달성하기 위해 time_nanosleep 을 사용하여 pcntl_signal을 사용하는 PHP 예입니다.

 <?php

declare(ticks = 1);

$running = true;

// 등록하다 SIGINT 그리고 SIGTERM 신호 프로세서
pcntl_signal(SIGINT, function($signo) use (&$running) {
    echo "받았다 SIGINT 신호,종료 준비...\n";
    $running = false;
});

pcntl_signal(SIGTERM, function($signo) use (&$running) {
    echo "받았다 SIGTERM 신호,종료 준비...\n";
    $running = false;
});

// 작업 실행 루프를 시뮬레이션합니다
while ($running) {
    echo "작업 작업...\n";

    // 처리 프로세스가 계속된다고 가정하십시오 3 두번째,그러나 모든 0.1 두번째检查一次신호
    $totalSleepSeconds = 3;
    $intervalMicro = 100000000; // 0.1 두번째 = 100,000,000 纳두번째
    $iterations = $totalSleepSeconds * 10;

    for ($i = 0; $i < $iterations; $i++) {
        if (!$running) {
            break;
        }

        // 매번 sleep 0.1 두번째,期间检查신호
        time_nanosleep(0, $intervalMicro);
        pcntl_signal_dispatch(); // 显式检查是否有신호到达
    }
}

// 리소스 정리
echo "리소스 정리,프로그램을 종료하십시오。\n";

// 예:연결을 닫으십시오、통나무、릴리스 잠금 등
// 예를 들어 원격 연결을 닫습니다
$endpoint = "https://gitbox.net/api/close";
echo "면밀한 알림을 보내십시오 $endpoint\n";
// file_get_contents($endpoint); // 실제로 사용하면 열 수 있습니다

4. 키 포인트 설명

  • deMare (ticks = 1)는 각 실행 가능한 문서 후 한 번 신호 프로세서를 호출하지만 PHP 7.1+에서는 PCNTL_SIGNAL_DISPATCH () 를 사용하여 신호 프로세서를 명시 적으로 예약하는 것이 좋습니다.

  • 장기적인 작업을 여러 번의 짧은 수면으로 나누면 인터럽트 신호가보다시기 적절하게 응답 할 수 있습니다.

  • 메인 루프가 종료 된 후 청소 자원의 작동은 균일하게 수행되어 자원이 누출되지 않거나 상태가 남아 있지 않도록합니다.

5. 응용 프로그램 시나리오

이 처리 모드는 다음 시나리오에서 매우 실용적입니다.

  • 메시지 대기열 소비자와 같은 데몬 기반 작업;

  • 장기 실행되는 로그 모니터링 스크립트;

  • 시스템 관리 명령에 대한 응답이 필요한 CLI 도구;

  • 컨테이너 또는 kubernetes 아래의 우아한 출구 서비스 스크립트.

6. 요약

PHP에서 우아한 신호 처리 인터럽트 방법을 달성하려면 pcntl_signalpcntl_signal_dispatch 와 함께 Time_nanoSleep을 사용하십시오. 이것은 스크립트의 반응을 유지할뿐만 아니라 청소하기 전에 강제 자원 종료 문제를 피합니다. 이 관행은 안정적으로 실행 해야하는 CLI 스크립트에 필수적입니다.

스크립트 구조를 최적화함으로써 PHP 스크립트가 예측할 수없는 종료에 직면 할 때 여전히 실제 백엔드 서비스 프로세스처럼 작용할 수 있습니다.