4

わかりました、追加された新しい .txt ファイルのディレクトリを継続的にスキャンするディレクトリ モニターが必要です。.txt ファイルを開き、コンテンツを読み取り/解析し、データを mysql テーブルに書き込みます。堅牢でこのタスクを達成できると思われるinotifyを調べていますが、上記のことを達成するためにコマンドシーケンスがどのように見えるかを静かに理解していません.

これは潜在的な例です(これを適切に考えているかどうか教えてください):

$fd = inotify_init();
$watch_descriptor = inotify_add_watch($fd, '/some/system/dir/', IN_CREATE);
// Loop forever (never break out of loop since I want to ALWAYS monitor this dir)
while (true) {
    $events = inotify_read($fd);
    //THIS IS WHERE I DON'T KNOW HOW TO OPEN THE NEWLY CREATED FILE
    //PLEASE HELP HERE WITH HOW TO SUCCESSFULLY CREATE THE EVENT ACTIONS
    /*
     1) OPEN FILE
     2) READ/PARSE CONTENTS
     3) CREATE MYSQL INSERT STATEMENT
     4) DELETE FILE
    */

}

これが提起する 1 つの疑問は、このループを永遠に続けると、とんでもない量のプロセッサ容量を消費することになるのでしょうか? そして:もしそうなら、これは本当に私の目標を達成するために使用すべき方法ですか?

私の目標を達成するために必要な inotify とシーケンスを理解する助けは非常に役に立ちます。

前もって感謝します。

4

2 に答える 2

3

さて、これは私がこれまでに得たものです(考えていますか?):

$dir = '/some/system/dir/';
//create mysql database connection here

$fd = inotify_init();
$watch_descriptor = inotify_add_watch($fd, $dir, IN_CREATE);
while (true) {
    $events = inotify_read($fd);
    $filepath = $dir . $events['name'];
    $contents = file_get_contents( $filepath );
    //parse contents and insert records into mysql table (thats the easy part)
    unlink( $filepath );
}
//close mysql database connection here
inotify_rm_watch($fd, $watch_descriptor);
fclose($fd);

また、システム メモリとプロセッサ容量を解放するためにイベントがトリガーされていないときに、inotify がプロセス ブロッキングを実行することにも気付きました (これにより、無限の while ループに関する私の懸念が解決されます)。

于 2011-10-28T03:30:23.173 に答える
2

inotify_read($fd)生成されたイベントから情報を取得するために使用します。

php.net に妥当な例があります: http://www.php.net/manual/en/function.inotify-init.php

while ループに関しては、inotify_read() はイベントが発生するまでブロックするため、一定のスピンを行っているわけではありません。

于 2011-10-28T02:01:09.363 に答える