Position actuelle: Accueil> Derniers articles> Meilleures pratiques et suggestions de sécurité pour utiliser Time_nanosleep

Meilleures pratiques et suggestions de sécurité pour utiliser Time_nanosleep

gitbox 2025-05-20

Sleep () et usleep () sont les fonctions les plus couramment mentionnées lors de l'exécution d'opérations retardées en PHP. Cependant, Time_nanosleep () devient un outil indispensable lorsque un contrôle de retard plus précis est requis, en particulier la précision nanoseconde. Cet article analysera en détail les méthodes d'utilisation de Time_nanosleep () , les meilleures pratiques courantes et comment éviter les pièges à sécurité et de performance connexes dans le développement réel.

1. Fonction Introduction

Time_nanosleep () est une fonction fournie par PHP qui peut interrompre l'exécution du programme pendant une période spécifiée, avec la précision des secondes et des nanosecondes. Le prototype de fonction est le suivant:

 bool time_nanosleep(int $seconds, int $nanoseconds)

Description du paramètre:

  • $ secondes : entier secondes.

  • $ nanosecondes : nanosecondes entières (0 ~ 999 999 999).

Valeur de retour:

  • Le retour du vrai signifie le succès.

  • Retourner faux ou lancer une exception indique une erreur ou une interruption.

Il convient de noter que si la fonction est interrompue par le signal du système pendant la période d'attente, il renverra un tableau contenant le temps inachevé:

 [
    "seconds" => int,
    "nanoseconds" => int
]

2. Utilisation de base

La façon la plus simple de l'utiliser est la suivante:

 <?php
echo "Attendez le début...\n";
time_nanosleep(1, 500000000); // pause 1.5 Deuxième
echo "Attendre la fin。\n";

Le code ci-dessus pause le programme pendant 1,5 seconde, puis continue d'exécuter la logique ultérieure.

3. Traitement d'interruption du signal

Dans l'environnement de production, Time_nanosleep () peut revenir à l'avance en raison d'une interruption du signal. Voici un moyen sûr de s'occuper de celui-ci:

 <?php
$seconds = 2;
$nanoseconds = 0;

do {
    $result = time_nanosleep($seconds, $nanoseconds);
    if (is_array($result)) {
        // Si interrompu,Mettre à jour le temps restant
        $seconds = $result["seconds"];
        $nanoseconds = $result["nanoseconds"];
        echo "Interrompu par signal,Attendre...\n";
    }
} while (is_array($result));

echo "Achèvement retardé。\n";

Cette méthode d'écriture garantit que le retard est entièrement exécuté, même s'il est interrompu à mi-chemin.

4. Erreurs et précautions courantes

1. Plage de paramètres

La valeur maximale du paramètre Nanosecondes est de 999 999 999, ce qui dépasse cette valeur provoquera un avertissement:

 Warning: time_nanosleep(): nanoseconds out of range

La solution consiste à convertir l'excès en secondes:

 $ns = 1_500_000_000; // Dépasser 1 Deuxième的纳Deuxième数
$seconds = intdiv($ns, 1_000_000_000);
$nanoseconds = $ns % 1_000_000_000;
time_nanosleep($seconds, $nanoseconds);

2. Utiliser avec une minuterie de haute précision

Si vous avez besoin d'un contrôle précis du temps, vous pouvez l'utiliser en combinaison avec hrtime () :

 $start = hrtime(true); // 纳Deuxième计时器
time_nanosleep(0, 500000000); // attendez 0.5 Deuxième
$end = hrtime(true);
$elapsed = ($end - $start) / 1e9;
echo "Effectif réel: {$elapsed} Deuxième\n";

5. Comparaison avec d'autres fonctions de retard

fonction Précision Est-il possible d'interrompre Prise en charge de la plate-forme
dormir() Deuxième Oui Multiplateforme
usleep () Microsecondes Non Windows <= PHP 5.3 ne prend pas en charge
Time_nanosleep () Nanosecondes Oui Multiplateforme

6. Scénarios d'application pratiques

1. Traitement de la limite de vitesse (comme les appels API)

 foreach ($requests as $request) {
    call_api("https://gitbox.net/api/send", $request);
    time_nanosleep(0, 250000000); // Chaque 250ms Une demande
}

2. Contrôle de la concurrence

Lorsque vous utilisez des opérations multi-thread ou multi-processus, un léger retard peut être ajouté pour éviter la concurrence des ressources:

 for ($i = 0; $i < 5; $i++) {
    fork_process($i);
    time_nanosleep(0, 100000000); // 100ms Retard,Éviter les conflits
}

3. Animation ou sondage pour attendre

Par exemple, lors de la création d'animation CLI:

 $frames = ['-', '\\', '|', '/'];
while (true) {
    foreach ($frames as $frame) {
        echo "\rchargement $frame";
        time_nanosleep(0, 100000000); // 0.1 Deuxième
    }
}

7. Conseils de sécurité

Bien que Time_nanosleep () soit pratique, il peut également être utilisé pour les attaques de blocage des ressources, telles que:

 // 恶意Retard造成的服务阻断
time_nanosleep(10, 0);

suggestion:

  • Ne permettez pas aux utilisateurs de contrôler les paramètres de retard;

  • Utilisez des limites maximales et des journaux de retard de journal;

  • Coopérez avec le délai d'expiration et le mécanisme de chien de garde pour protéger le processus de base.

Conclusion

Time_nanosleep () est un outil puissant qui fournit un contrôle de latence de haute précision et est plus approprié que le sommeil () dans certaines tâches granulaires. L'utiliser peut raisonnablement rendre le programme plus flexible et efficace dans le traitement des retards, le contrôle et la limitation simultanés. Cependant, une utilisation excessive ou inappropriée peut également entraîner des problèmes de déchets de performance et de sécurité. Par conséquent, l'utiliser avec prudence et stratégiquement sur la base de la maîtrise de ses principes est la capacité que chaque développeur PHP devrait avoir.