PHP Inotify Manière non bloquante

Je lis un fichier dans Linux qui est un fichier journal qui continue à mettre à jour la météo, le fichier a changé et l’affiche sur la page Web. Je le fais en utilisant php inotify mais mon problème est qu’il bloque.

Comment puis-je faire phot inotify non-bloquant afin que je puisse faire d’autres choses pendant qu’il surveille le fichier texte?

 

Ou puis-je le faire en Java? .. Merci.

Oui, vous pouvez. Avez-vous regardé le manuel? Il fournit des exemples de rappel d’événement non bloquants? Si cette réponse ne vous répond pas correctement, veuillez append des informations supplémentaires.

http://php.net/manual/en/function.inotify-init.php

 // Open an inotify instance $fd = inotify_init(); // - Using stream_set_blocking() on $fd stream_set_blocking($fd, 0); // Watch __FILE__ for metadata changes (eg mtime) $watch_descriptor = inotify_add_watch($fd, __FILE__, IN_ATTRIB); // generate an event touch(__FILE__); // this is a loop while(true){ $events = inotify_read($fd); // Does no block, and return false if no events are pending // do other stuff here, break when you want... } // Stop watching __FILE__ for metadata changes inotify_rm_watch($fd, $watch_descriptor); // Close the inotify instance // This may have closed all watches if this was not already done fclose($fd); 

C’est comme dit Layke. Vous pouvez l’avoir soit bloquant ou non bloquant. Si ce n’est pas bloquant, vous devez interroger. Je pense que ce que vous voulez bloque de manière multithread. Un thread fonctionne en mode blocage ou non-blocage, interrogation fréquente, tandis que l’autre thread fait autre chose.

Je suggère que cela sera beaucoup plus facile en utilisant node.js.

Vous avez seulement besoin du code ci-dessous: (filename: watch.js)

  var fs = require('fs'); var file = '/tmp/temp.txt/'; fs.watchFile(file, function (curr, prev) { console.log('the current mtime is: ' + curr.mtime); console.log('the previous mtime was: ' + prev.mtime); }); 

alors vous pouvez l’exécuter:

  node watch.js 

Il fonctionnera de manière persistante.

Le node.js utilisant javascript pour écrire server-side programme server-side , il a non-blocking I/O modèle d’ non-blocking I/O . Cela peut vous aider à faire ce genre de chose facilement.

Voici un document connexe fs.watchFile

Ma préférence pour quelque chose comme ça serait d’utiliser Java car je trouve plus facile de gérer les tâches en arrière-plan comme ce que vous décrivez.

Backend

Mon approche serait d’utiliser Java EE pour créer un thread de démarrage singleton qui implémente un service de planificateur. La raison d’utiliser un thread de démarrage singleton est que votre travail peut s’exécuter en tant que processus d’arrière-plan et qu’il ne bloque donc pas, libérant ainsi des ressources pour le rest de votre application. Il est également possible d’accéder au thread en invoquant simplement une méthode sur la classe. Vous pouvez planifier la tâche pour lire votre fichier toutes les secondes / minutes, etc. pour toutes les mises à jour et celles-ci peuvent être mises à la disposition de votre client

Exemple de base:

 @Singleton @Startup public class Scheduler { private static int count = 0; private Weather weather; public Weather getWeather() { return weather; } @PostConstruct public void onStartup() { System.out.println("Initialization success."); } @Schedule(second="*/10", minute="*", hour="*") public void execute() { byte[] encoded = Files.readAllBytes(Paths.get("weather_updates.txt")); Ssortingng weatherUpdateStr = encoding.decode(ByteBuffer.wrap(encoded)).toSsortingng(); weather = new Weather(); weather.parse(weatherUpdateStr); // Possible addition of logic for push to web socket } } 

Cet exemple de base crée un thread sigleton au démarrage de votre conteneur d’applications Web (je vous recommande d’utiliser JBoss 7). Il crée ensuite une tâche planifiée qui s’exécute toutes les 10 secondes. Le code fourni fait un fichier Java 7 de base lu dans une chaîne et weather.parse() doit contenir une certaine logique pour convertir la chaîne en object Weather. L’object météo est alors prêt à être envoyé via un socket Web ou interrogé via une requête AJAX sur le frontend.

L’extrémité avant

Il y a deux approches possibles que je suggérerais ici:

  1. Sockets Web utilisant HTML5
  2. Appels AJAX

1. Prises Web

Les sockets Web ont été introduits dans HTML5 pour fournir du contenu dynamic sur une page sans avoir à actualiser ou utiliser les appels AJAX. Voici une excellente introduction aux websockets en HTML5. Voici un autre bon exemple de la façon de configurer les websockets HTML5 avec Java .

2. Appels AJAX

jQuery fournit une excellente API pour AJAX. Vous pouvez implémenter une tâche Timeout dans jQuery pour exécuter certaines fonctionnalités par intermittence. La fonctionnalité que vous souhaitez implémenter est la demande AJAX Get .

Exemple de base:

 $.ajax({ url: "getWeatherUpdate.html", error: function(){ // will fire when timeout is reached }, success: function(){ // Update your webpage with weather info }, timeout: 3000 // sets timeout to 3 seconds }); 

Vous pouvez jeter un oeil à la bibliothèque React, qui fournit un E / S Api non bloquant piloté par les événements en PHP, basé sur le modèle de réacteur: http://reactphp.org/