Create function時のエラー

This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)
SET GLOBAL log_bin_trust_function_creators = 'ON';

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.