簡単にログを保存できるZend_Logですが、使用法によっては大問題に。
公式リファレンスでは
何故ってZend_Log_Writer_Streamのソース見ればわかります。
以下はZend_Log_Writer_Streamの概要。
試してみましょう。
複数のブラウザで同時に実行します。
2011-01-01T00:00:00+09:00 INFO (6): 開始:p987n76eq664t68mk6grangmm7
2011-01-01T00:00:01+09:00 INFO (6): 開始:osp8sov2orkfq0gaeir09b7vp3
2011-01-01T00:00:05+09:00 INFO (6): 終了:p987n76eq664t68mk6grangmm7
2011-01-01T00:00:06+09:00 INFO (6): 終了:osp8sov2orkfq0gaeir09b7vp3
見事にロックされていません。
結果として、アクセスが集中するとログが消えたり壊れたりする可能性があります。
といって外からflock()をかける手段もありません。
これは欠陥といっていいのでは。
公式リファレンスでは
$writer = new Zend_Log_Writer_Stream('/path/to/logfile');
$logger = new Zend_Log($writer);
$logger->info('Informational message');
というサンプルが書かれているわけですが、この書き方は全くお薦めできません。何故ってZend_Log_Writer_Streamのソース見ればわかります。
以下はZend_Log_Writer_Streamの概要。
Zend_Log_Writer_Stream{
function __construct(){
$this->_stream = fopen('/path/to/logfile', 'a');
}
function _write(){
fwrite($this->_stream, $string));
}
function shutdown(){
fclose($this->_stream);
}
}
何が問題って何処にもflock()が無え!試してみましょう。
<?php
session_start();
//Zend_Log
require_once('Zend/Log.php');
require_once('Zend/Log/Writer/Stream.php');
$writer = new Zend_Log_Writer_Stream('/path/to/logfile');
$logger = new Zend_Log($writer);
//開始
$logger->info('開始:'.session_id());
//時間のかかる処理
sleep(5);
//終了
$logger->info('終了:'.session_id());
複数のブラウザで同時に実行します。
2011-01-01T00:00:00+09:00 INFO (6): 開始:p987n76eq664t68mk6grangmm7
2011-01-01T00:00:01+09:00 INFO (6): 開始:osp8sov2orkfq0gaeir09b7vp3
2011-01-01T00:00:05+09:00 INFO (6): 終了:p987n76eq664t68mk6grangmm7
2011-01-01T00:00:06+09:00 INFO (6): 終了:osp8sov2orkfq0gaeir09b7vp3
見事にロックされていません。
結果として、アクセスが集中するとログが消えたり壊れたりする可能性があります。
といって外からflock()をかける手段もありません。
これは欠陥といっていいのでは。
PR
トラックバック
トラックバックURL: