書き込み用にログファイルを開く必要があります。問題は、多くのことが同時にこれを行う可能性があることであり、私は衝突を望んでいません。各書き込みは1行で、通常は約150バイト(常に1K未満)であり、時系列で取得する必要はありません。
私が望んでいるのは、試行することだと思いますflock()
。失敗した場合は、数秒間試行を続けます。何度か試行してもロックを確立できない場合は、あきらめてください。
$fh=fopen($logfile, "a");
if (flock($fh, LOCK_EX|LOCK_NB)) {
$locked=TRUE;
} else {
$locked=FALSE;
// Retry lock every 0.1 seconds for 3 seconds...
$x=0; while($x++ < 30) {
usleep(100000);
if (flock($fh, LOCK_EX|LOCK_NB)) {
$locked=TRUE;
break;
}
}
}
if ($locked) {
if (fwrite($fh, strftime("[%Y-%m-%d %T] ") . $logdata . "\n")) {
print "Success.\n";
} else {
print "Fail.\n";
}
flock($fh, LOCK_UN)
} else {
print "Lock failed.\n";
}
私には2つの質問があります。1つは一般的なもので、もう1つは具体的なものです。まず、同じソリューションをさまざまな方法(do...while
など)で実装する以外に、PHPでのみ実行される、この種の問題を処理するためのより優れた一般的な戦略はありますか?次に、これをPHPで実装するためのより良い方法はありますか?(はい、私は戦略の部分に本当に興味があるので、これらを分離しました。)
私が検討した代替案の1つは、syslog()を使用することですが、PHPコードは、システムレベルの管理(つまり、/ etc / syslog.confへの追加)がオプションとして利用できないプラットフォームで実行する必要がある場合があります。
更新:randy|LOCK_NB
の提案に従って、上記のコードに追加されました。