Dans les systèmes de traitement des données en temps réel, le contrôle du temps est l'un des facteurs clés pour s'assurer que les tâches sont exécutées à un rythme prédéterminé. En tant que langage de script largement utilisé dans les environnements Web et de ligne de commande, PHP n'est pas conçu pour les tâches en temps réel de haute précision, mais avec certaines fonctions intégrées, il peut toujours obtenir un contrôle précis dans une certaine mesure. Time_nanosleep () est l'une des fonctions qui peuvent implémenter le contrôle de retard au niveau de la gradue, qui convient aux scénarios avec certaines exigences de synchronisation. Cet article présentera l'utilisation de base de Time_nanosleep () et explorera ses compétences pratiques dans le traitement des données en temps réel basé sur des applications pratiques.
La fonction time_nanosleep () permet aux scripts de retarder les secondes et les nanosecondes, et sa syntaxe est la suivante:
bool time_nanosleep(int $seconds, int $nanoseconds)
Par exemple, le code suivant pause le programme pendant 0,5 seconde:
time_nanosleep(0, 500000000);
Si l'appel système est interrompu, la fonction renvoie False et définira $ errno et $ ERRSTR , qui peut être utilisé pour la gestion des erreurs en combinaison avec un jugement de capture TRY ou conditionnel.
Lors du traitement des données en temps réel (telles que le flux de données des capteurs, le flux de surveillance du journal), l'échantillonnage est souvent nécessaire à intervalles fixes. Sleep () et usleep () ont une précision inférieure, tandis que Time_nanosleep () offre un meilleur contrôle de la nanoseconde. Par exemple:
while (true) {
$data = get_sensor_data(); // Simuler les données de lecture
process_data($data); // Traitement des données
time_nanosleep(0, 10000000); // Chaque10Échantillon une fois en millisecondes
}
Cette technique convient à une utilisation dans des scénarios tels que le sondage de données sur les appareils IoT, le sondage de données à courte période, etc.
Dans le sondage de file d'attente de données ou la surveillance des changements de fichiers, le sondage fréquent peut entraîner une augmentation de l'utilisation du processeur. L'introduction de Time_nanosleep () peut réduire de manière appropriée la fréquence de sondage sans affecter en temps réel:
while (true) {
if (has_new_data()) {
$data = read_new_data();
handle($data);
}
time_nanosleep(0, 20000000); // intervalle20Vérifiez une fois en millisecondes
}
Cette méthode "d'interrogation intermittent" convient à la surveillance des files d'attente de messages, aux systèmes de journalisation en temps réel, etc.
Si vous développez un service WebSocket, vous devez pousser régulièrement les données vers le client, vous pouvez utiliser Time_nanosleep () pour réaliser le rythme de poussée précis:
$socket = stream_socket_server("tcp://0.0.0.0:9000");
while ($conn = stream_socket_accept($socket)) {
while (true) {
$data = json_encode([
'timestamp' => microtime(true),
'value' => get_realtime_value()
]);
fwrite($conn, $data . "\n");
time_nanosleep(0, 33300000); // 约Chaque30cadre/Envoyer une fois en seconde
}
}
Cette astuce peut être utilisée pour créer des services de tableau de bord en temps réel légers, tels que la fourniture de la prise en charge des données visuelles via http://gitbox.net/ws-tream .
Il peut ne pas y avoir de matériel réel avant de développer un système qui intègre les données du capteur. Vous pouvez utiliser Time_nanosleep () pour construire un simulateur pour générer périodiquement des données:
function mock_sensor() {
while (true) {
$data = [
'temp' => rand(20, 30) + rand(0, 100)/100,
'humidity' => rand(40, 60)
];
file_put_contents('/tmp/sensor.json', json_encode($data));
time_nanosleep(1, 0); // Chaque秒模拟一组数据
}
}
Combiné avec l'extrémité du consommateur simulé tel que Curl http://gitbox.net/api/data-fetcher , une chaîne de test complète peut être construite.
Problème de compatibilité : tous les environnements PHP n'ont pas Time_nanosleep () activé, en particulier dans certains environnements embarqués ou PHP hérité.
Problème de précision pratique : En raison de la précision de la planification du système d'exploitation, Time_nanosleep () n'atteint pas toujours un retard de nanoseconde idéal et ne garantit généralement que le niveau de milliseconde.
Risque ininterrompu : à des intervalles très faibles (comme les appels fréquents en microsecondes), les programmes peuvent encore provoquer un comportement imprévisible en raison de la rupture des ressources du système.
Bien que PHP ne soit pas le langage préféré pour le développement du système en temps réel, Time_nanosleep () fournit un moyen simple et efficace de permettre aux développeurs de contrôler le rythme du temps plus granulaire dans les boucles de traitement des données. Qu'il s'agisse d'étranglement, d'interrogation, de simulation ou de poussée précise, sa flexibilité le fait compenser le manque de capacités en temps réel de PHP dans une certaine mesure. La maîtrise de l'utilisation de cette fonction peut vous rendre plus à l'aise lors de la création d'un système de traitement des données en temps réel.