0

新しいデバイスが接続または取り外されたときにターミナルで印刷するデーモンプログラムがあります。今では、Linuxで印刷されたのと同じようにphpで印刷したいと思います。リアルタイム出力のようなものです。新しいデバイスがLinuxに接続されると、画面に出力されるボタンをクリックしなくてもphpに警告が表示されます。私のデーモンプログラムがLinuxで出力するものは、phpも出力します。

デバイスをスキャンするがデーモンをスキャンしない別のプログラムもありますが、問題なく出力を取得してphpで出力できます。

PHPのデーモンプログラムでリアルタイム出力を作成するにはどうすればよいですか?

ありがとう、

4

2 に答える 2

0

コメントが長くなるのでこちらに追記します。

デーモンにログファイルオプションがない限り、最初にファイルへのリダイレクトをstderr行います。stdout~$ my-daemon >> my_logfile 2>&1

次に、イベントのフラグを指定してinotifywaitを使用できます (PHP 以外のシステムで何かを解析/実行する場合、つまり bash によって)。-mmodify

Inotify では、さまざまな変更について通知を受け取ることができます。これは、特定のディレクトリ内の新しいファイルを確認するために使用する bash スクリプトの短い数行です。

notify()
{
    ...

    inotifywait -m -e moved_to --format "%f" "$path_mon" 2>&- |
    awk ' { print $0; fflush() }' |
    while read buf; do
        printf "NEW:[file]: %s\n" "$buf" >> "$file_noti_log"
            blah blah blah
        ...
     done
}

これが何をするか: ファイルが$path_monに移動されるwhileたびに、スクリプトはループ内に入り、スクリプトによって定義されたさまざまなアクションを実行します。

PHPでinotifyを使用したことはありませんが、これはおそらくあなたが望むもののように見えます: inotify_init(PHPの別のモジュール)。

inotifyは、1 つまたは複数のディレクトリでさまざまなイベントをチェックします。または、特定のファイルをターゲットにすることもできます。man inotifywait または inotify を確認してください。PHP: Inotify Constantsの下で、「変更」フラグ、「IN_MODIFY」を使用する可能性が最も高いでしょう。

C で独自のものを作成することもできます。このページは読んでいませんが、IBM のページは以前はまったく問題ありませんでした : inotify を使用してファイル システムのアクティビティを監視する

別のオプションとして、PHP でPCNTLなどを使用することもできます。

于 2012-10-04T06:16:43.267 に答える
0

ボタンをクリックしなくても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()

于 2012-10-04T06:49:41.360 に答える