php版のfluentdモドキを作ってみた

アクセスログなどの収集とか色々便利なソフトとして有名なfluentdっぽいのがPHPで無いようなので作ってみました。
PHPでデーモン作るにはどうやっているのかを勉強するために、tailコマンドのFオプションを作ることから始まりました。

php5-tail

ファイル構成

/etc/
    php5-tail/
        config.php
        cache/
            access.pos
        method/
            format.php
            parse.php
            stdout.php
/usr/
    local/
       bin/
           php5-tail

Inotifyモジュールのインストール

sudo pecl install inotify

動作確認

php5-tail -c /etc/php5-tail/config.php

HTTPサーバへアクセス

curl http://localhost/

出力結果

Array
(
    [host] => 192.168.196.1
    [time] => 14/Apr/2013:10:41:54 -0700
    [path] => /
    [referer] => -
    [agent] => Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31
)

デーモン化

循環参照コレクタを有効にする

gc_enable();

起動した親プロセスを終了する

$pid = pcntl_fork();
if ($pid === -1) {
    throw new \Exception('Process could not be forked');
} else if ($pid) {
    // 親プロセス
    exit();
} else {
    // 子プロセス
}

シグナルをキャッチする

pcntl_signal(SIGHUP,  'handler');
pcntl_signal(SIGINT,  'handler');
pcntl_signal(SIGQUIT, 'handler');
pcntl_signal(SIGTERM, 'handler');
pcntl_signal(SIGTSTP, 'handler');

function handler($signo) {
    switch ($signo) {
    case SIGHUP:   // 再読み込み
        echo $signo."\n";
        break;
    case SIGINT:   // 割り込み
    case SIGQUIT:  // 終了
    case SIGTERM:  // 正常終了
    case SIGTSTP:  // サスペンド
        echo $signo."\n";
        posix_kill(posix_getpid(), SIGUSR1);
        exit();
    }
}

declare(ticks = 1);
wile (true) {
    echo '.';
}

多分この3つをいれれば、とりあえずデーモン化出来ると思います。
System_Daemon – Pearを参考にしました。

Posted in php.

Leave a reply