T

procmailでerror_log関数がちゃんと動かなくなる怪

procmailrcなどを使って受信したメールをPHPのプログラムに渡すところで、ちょっと妙なことに気づいた。PHPのプログラムからどこかのファイルに文字列を出力しようとすると、error_log関数の動作がいつもと違う。

//$dataに何か文字列が入っている。

$fp = fopen("../logdir/logfile", 'w');
fputs($fp, $data);
fclose($fp); // <- 問題なし

error_log($data, 3, "../logdir/logfile"); // <- 動作せず

error_log($data, 3, "/full/path/to/logdir/logfile"); <- 問題なし

touch("../logdir/logfile2"); <- 問題なし

fopenした場合は相対パスで問題ない(getcwd関数で確認したパス情報でも問題はない)。error_log関数を使ったときだけ問題が起きるのだ。念のためログファイルやそこに至るまでのディレクトリの権限や所有者を確認したが、問題になりそうなところはない。

error_log関数はPHP-5.2.6ではこのようになっている。

PHPAPI int _php_error_log(int opt_err, char *message, char *opt, char *headers TSRMLS_DC)
{
    php_stream *stream = NULL;

    switch (opt_err) {

        /*****case 1, 2は関係ないので省略*****/

        case 3:     /*save to a file */
            stream = php_stream_open_wrapper(opt, "a", IGNORE_URL_WIN | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL);
            if (!stream)
                return FAILURE;
            php_stream_write(stream, message, strlen(message));
            php_stream_close(stream);
            break;

        default:
            php_log_err(message TSRMLS_CC);
            break;
    }
    return SUCCESS;
}

実に単純なのだが、相対パスではちゃんと動作しない。しかも、procmailrcから起動したときだけ動かない。

仕事中なのであとで調べる。

Posted by on 12月 1, 2008 in PHP

コメントを残す