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.
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)
$ secondes : entier secondes.
$ nanosecondes : nanosecondes entières (0 ~ 999 999 999).
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
]
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.
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.
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);
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";
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 |
foreach ($requests as $request) {
call_api("https://gitbox.net/api/send", $request);
time_nanosleep(0, 250000000); // Chaque 250ms Une demande
}
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
}
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
}
}
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.
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.