Position actuelle: Accueil> Derniers articles> Utilisez Time_nanosleep pour implémenter un planificateur de tâches précis

Utilisez Time_nanosleep pour implémenter un planificateur de tâches précis

gitbox 2025-05-27

Dans le développement Web, PHP est traditionnellement considéré comme inadapté aux processus de longue durée ou aux systèmes de planification des tâches. Cependant, avec une prise en charge améliorée pour le mode CLI et la disponibilité de certaines fonctions sous-jacentes telles que Time_nanosleep , PHP est en fait capable de tâches de planification légères mais conquises dans le temps.

Cet article présentera comment utiliser Time_nanosleep pour construire un planificateur de tâches simple mais de haute précision pour effectuer des tâches périodiques avec une précision milliseconde ou même microseconde.

1. Pourquoi utiliser Time_nanosleep

Les fonctions de retard conventionnelles en PHP telles que Sleep () et USLorm () prennent en charge les retards en seconde et microseconde respectivement, mais ne sont pas toujours suffisamment précis dans le fonctionnement réel, et la précision d' Usleep sera limitée sur certaines plates-formes.

En revanche, Time_nanosleep fournit un contrôle temporel de niveau nanoseconde:

 bool time_nanosleep(int $seconds, int $nanoseconds): bool|array

Il nous permet de contrôler le temps de chaque cycle de planification plus granulant, réalisant ainsi une exécution de tâches en temps quasi réel.

2. Idées de base pour construire des planificateurs

L'idée principale du planificateur de tâches est:

  1. Définir une liste de tâches, chaque tâche est livrée avec un cycle d'exécution;

  2. Détecter l'heure actuelle dans une boucle infinie;

  3. Attendez précisément pour le prochain cycle d'exécution;

  4. Exécutez la tâche lorsque l'heure cible est atteinte.

3. Exemple de code

Voici un exemple de mise en œuvre d'un simple planificateur PHP de haute précision:

 <?php

class TaskScheduler
{
    private array $tasks = [];

    public function addTask(callable $task, float $interval): void
    {
        $this->tasks[] = [
            'callback' => $task,
            'interval' => $interval, // unité:Deuxième,Décimal soutenu
            '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'];
                }
            }

            // Attente précise 1 毫Deuxième,éviterCPUOccupation trop élevée
            time_nanosleep(0, 1_000_000);
        }
    }
}

// Exemple:Chaque0.5Deuxième输出一次时间戳
$scheduler = new TaskScheduler();

$scheduler->addTask(function () {
    echo "Temps d&#39;exécution de la tâche:" . date('Y-m-d H:i:s.u') . PHP_EOL;
}, 0.5);

// Exemple:Chaque2Deuxième执行一次Demande de simulation
$scheduler->addTask(function () {
    $url = "https://gitbox.net/api/ping";
    echo "Demande $url" . PHP_EOL;
    // Vous pouvez l&#39;utiliser dans des scénarios réels curl ou file_get_contents Demande de simulation
}, 2.0);

// Démarrer le planificateur
$scheduler->run();

4. Choses à noter

  1. Occupation du processeur : Étant donné que le planificateur est dans une boucle infinie, il est recommandé d'utiliser des fonctions telles que Time_nanosleep pour réduire l'occupation du processeur.

  2. Problème d'accumulation d'erreur : Dans cet exemple, la méthode de définition de NEXT_RUN est utilisée pour "commencer à partir du cycle d'heure actuel +" pour mieux contrôler l'accumulation d'erreur.

  3. Gestion des exceptions : dans l'environnement réel, il est recommandé d'ajouter un coup d'essai pour empêcher une tâche d'interrompre le fonctionnement du planificateur.

  4. Isolement des tâches : si une tâche prend trop de temps, cela peut affecter l'exécution d'autres tâches. Il peut être encore optimisé pour le multi-processus ou utiliser PCNTL_FORK pour implémenter le parallélisme.

5. Scénarios d'application

  • Synchronisation des données automatique contrôlée avec précision

  • Envoyer des messages à la fois en microsecondes (comme l'IoT)

  • Construisez un démon ou un sondage local PHP

Conclusion

Bien que PHP ne soit pas conçu pour la planification au niveau du système, via des fonctions telles que Time_nanosleep , nous pouvons toujours créer un planificateur de tâches léger avec une haute précision et un fonctionnement stable. Convient pour les petites applications ou les tâches de script qui nécessitent des capacités élevées en temps réel mais ne conviennent pas pour introduire des chaînes d'outils complexes. À l'avenir, combinés à des extensions telles que les coroutines et les bêtises, les capacités de planification du timing de PHP ont encore plus de place pour s'améliorer.