ボタンをクリックしなくてもphpに警告します
つまり、クライアント側のPHPについて話しているのです。
大きな問題は、クライアント ブラウザにアラートを出すことです。
短時間であれば、問題を無視してすべてのバッファリングを無効にし、デーモンの出力をブラウザに送信することができます。長い目で見れば、それはエレガントでもなく、実際に機能するわけでもなく、美的問題もあります。さらに、出力クライアント側を実際に操作することはまったくできません。少なくとも、簡単に、またはきれいに操作することはできません。
そのため、クライアントでプログラムを実行する必要があります。これは Javascript を意味します。JS と PHP プログラムは通信する必要があり、PHP もデーモンと通信するか、少なくともデーモンの動作を監視する必要があります。
Web Sockets や multipart-x-mixed-replace を使用して最初の方法を実行する方法はありますが、まだあまり移植性がありません。
Web ページを更新することもできますが、それは無駄が多く、時間がかかります。
クライアント ブラウザへの通知の問題は、私の意見では、AJAX ポーリングで解決するのが最善です。すぐにアラートが表示されるわけではありませんが、数秒以内にアラートが表示されます。
たとえば、10 秒 (10000 ミリ秒) ごとに AJAX から PHP にクエリを送信します。
function poll_devices() {
$.ajax({
url: '/json/poll-devices.php',
dataType: 'json',
error: function(data) {
// ...
},
success: function(packet) {
setTimeout(function() { poll_devices(); }, 10000);
// Display packet information
},
contentType: 'application/json'
});
}
PHP は蓄積されたログをチェックし、状況を送信します。
もう 1 つの可能性は、PHP スクリプトを最大 20 秒ブロックすることです。これは、AJAX がタイムアウトしてあきらめるには不十分であり、変更があった場合はすぐに戻ります。次に、非同期 AJAX 関数を使用して、連続してポーリングを実行します。
このようにして、非同期関数が開始され、PHP スクリプトもスリープしている間にすぐにスリープ状態になります。20 秒後、呼び出しが返され、すぐに再発行され、再びスリープ状態になります。
最終的な効果は、1 つの接続を常に開いたままにしておくことであり、変更はすぐにクライアント側の Javascript にエコー バックされます。ただし、接続の中断を管理する必要があります。しかし、この方法では、20 秒ごとに1 つの呼び出しを発行するだけで、ほぼ瞬時にアラートを受け取ることができます。
サーバー側の PHP は、開始時にログ ファイルのサイズをチェックし (最後の読み取り位置がセッションに保存されます)、共有モードで読み取り専用で開いたままにしfgets()
、デーモンが許可する場合は読み取りをブロックします。
または、デーモンを にパイプしてlogger
、syslog にメッセージを取得することもできます。これらのメッセージをPHP で読み取り可能な特定のバッファリングされていないファイルに送信するように syslog を構成します。これで、追加の通知システムを必要とせずに、 PHP はfopen()
、 、ftell()
およびですべてを実行できるようになります。fgets()