0

inotifyPECL 拡張機能を使用して、PHP で記述されたファイル監視デーモンに取り組んでいます。イベントがいつ発生したかを教えてくれるので、ほぼ完成しましたinotify

の戻り値inotify_read($fd)は、次のような配列です。

Array
(
    [0] => Array
        (
            [wd] => 2
            [mask] => 1073741840
            [cookie] => 0
            [name] => collaphoto
        )

    [1] => Array
        (
            [wd] => 2
            [mask] => 1073741856
            [cookie] => 0
            [name] => filewatcher
        )

    [2] => Array
        (
            [wd] => 2
            [mask] => 1073741840
            [cookie] => 0
            [name] => filewatcher
        )

)

私が正しく理解していれば、各サブ配列は個々のイベントであり、そのイベントに関する情報が含まれています。wdは inotify インスタンスの記述子、maskはイベントをトリガーしたフラグの整数値です。たとえばIN_ATTRIB、 またははIN_ACCESScookieこのイベントをキュー内の別のイベントに接続するための一意の ID であり、name変更されたディレクトリまたはファイルです。はname、ディレクトリが によって監視されている場合にのみ指定されinotifyます。

mask私の質問は、指定された値に基づいてイベントをトリガーしたビットマスクをどのように把握するのですか? 私はまだビット マスクの扱いにかなり慣れていないので、気楽にやってください。

inotify フラグの完全なリスト

4

1 に答える 1

0

かなり頻繁に発生する可能性があり、ファイルシステムの変更を観察して、絶え間ないモデルの変更に対処するための適切な戦略を考え出すのが難しいイベントについて話しているため、これは私が考えることができる最もエレガントなソリューションではありません。これは、そのようなことに対処するための私の一種の強引な方法です。

したがって、定数のマスター リスト (もちろんその下にはすべて値があります) があり、定数の 1 つと一致する必要があるファイル システムから返される数値があります。

どうする?数値を文字列化して、数値がキーで名前付き定数が値である連想配列を作成します。この配列は単なるプレースホルダーであり、変更することを意図していないため、できるだけ一定に保つようにしてください。配列を定数として宣言することはできませんが、そうするためのハックがいくつかあります。また、コピーが 1 つだけ存在するように静的にすることをお勧めします。また、構造内のシーク時間を最大化する方法を見つけられるかどうかを確認してください。これは、ファイルシステムの変更量と、配列に対して実行する必要があるルックアップの数に基づく場合がありますが、PHP がハッシュ テーブルを適切に処理し、O(1) 時間で連想配列を保持する限り、安全です。

注: キーがそのままの状態でメモリの問題が発生した場合に備えて: PHP 配列サイズに関するスクープ

于 2013-12-15T02:37:07.147 に答える