웹 개발에서 PHP는 전통적으로 장기 실행 프로세스 또는 작업 예약 시스템에 부적합한 것으로 간주됩니다. 그러나 CLI 모드에 대한 지원이 향상되고 Time_NanoSleep 과 같은 일부 기본 기능의 가용성으로 인해 PHP는 실제로 약간의 가벼우면서도 시간에 맞는 스케줄링 작업을 수행 할 수 있습니다.
이 기사에서는 Time_NanoSleep을 사용하여 간단하지만 고정밀 작업 스케줄러를 구축하여 밀리 초 또는 마이크로 초 정밀도로 정기적 인 작업을 수행하는 방법을 소개합니다.
Sleep () 및 Usleep () 와 같은 PHP의 기존 지연 기능은 각각 두 번째 및 마이크로 초 지연 지연을 지원하지만 실제 작동에서는 항상 충분히 정확하지는 않으며 Usleep 의 정확도는 일부 플랫폼에서 제한됩니다.
대조적으로, Time_nanoSleep은 나노 초 수준의 시간 제어를 제공합니다.
bool time_nanosleep(int $seconds, int $nanoseconds): bool|array
이를 통해 각 스케줄링 사이클의 시간을보다 세분화하여 제어 할 수 있으므로 거의 실시간 작업 실행을 달성 할 수 있습니다.
작업 스케줄러의 핵심 아이디어는 다음과 같습니다.
작업 목록을 정의하면 각 작업에는 실행주기가 있습니다.
무한 루프에서 현재 시간을 감지하고;
다음 실행주기를 정확하게 기다리십시오.
대상 시간에 도달하면 작업을 실행하십시오.
다음은 간단한 고정밀 PHP 스케줄러의 구현 예입니다.
<?php
class TaskScheduler
{
private array $tasks = [];
public function addTask(callable $task, float $interval): void
{
$this->tasks[] = [
'callback' => $task,
'interval' => $interval, // 단위:두번째,소수점 지원
'next_run' => microtime(true) + $interval
];
}
public function run(): void
{
while (true) {
$now = microtime(true);
foreach ($this->tasks as &$task) {
if ($now >= $task['next_run']) {
call_user_func($task['callback']);
$task['next_run'] = $now + $task['interval'];
}
}
// 정확한 대기 1 毫두번째,피하다CPU너무 높은 점유
time_nanosleep(0, 1_000_000);
}
}
}
// 예:모든0.5두번째输出一次时间戳
$scheduler = new TaskScheduler();
$scheduler->addTask(function () {
echo "작업 실행 시간:" . date('Y-m-d H:i:s.u') . PHP_EOL;
}, 0.5);
// 예:모든2두번째执行一次시뮬레이션 요청
$scheduler->addTask(function () {
$url = "https://gitbox.net/api/ping";
echo "요청 $url" . PHP_EOL;
// 실제 시나리오에서 사용할 수 있습니다 curl 또는 file_get_contents 시뮬레이션 요청
}, 2.0);
// 스케줄러를 시작하십시오
$scheduler->run();
CPU 점유 : 스케줄러가 무한 루프에 있기 때문에 Time_NanoSleep 과 같은 기능을 사용하여 CPU 점유를 줄이는 것이 좋습니다.
오류 축적 문제 :이 예에서는 Next_Run을 설정하는 방법을 사용하여 "현재 시간 + 사이클에서 시작하여"더 나은 제어 오류 축적을 위해 사용됩니다.
예외 처리 : 실제 환경에서 작업이 스케줄러 작동을 방해하는 것을 방지하기 위해 Try-Catch를 추가하는 것이 좋습니다.
작업 격리 : 작업이 너무 오래 걸리면 다른 작업의 실행에 영향을 줄 수 있습니다. 다중 프로세스 또는 PCNTL_FORK를 사용하여 병렬 처리를 구현할 수 있습니다.
정확하게 제어 된 자동 데이터 동기화
마이크로 초 (예 : IoT)로 한 번에 메시지 보내기
PHP 로컬 데몬 또는 폴링 서비스를 구축하십시오
PHP는 시스템 수준 스케줄링 용으로 설계되지 않았지만 Time_NanoSleep 과 같은 기능을 통해 정밀도가 높은 작업 스케줄러를 여전히 구축 할 수 있습니다. 높은 실시간 기능이 필요하지만 복잡한 툴체인을 도입하는 데 적합하지 않은 소규모 응용 프로그램 또는 스크립트 작업에 적합합니다. 앞으로 Coroutines 및 Swooles와 같은 확장과 결합 된 PHP의 타이밍 스케줄링 기능은 여전히 개선 할 여지가 더 많습니다.