/**
*
*/
function rotate()
{
if (file_exists($this->_file) && filesize($this->_file) >= $this->_size * 1024 * 1024) {
// ,
// ,
//
$LockFileHandler = new CFile($this->_file . '.lock');
$LockFileHandler->open('w');
if (!$LockFileHandler->isError()) {
$LockFileHandler->lock(LOCK_EX);
}
// , ( )
// $renames array(exists_files, new_file)
// new_file , $renames
// .
// , $renames :
// array(
// array('/var/log/logfile', '/var/log/logfile.1'),
// array('/var/log/logfile.1', '/var/log/logfile.2'),
// array('/var/log/logfile.2', '/var/log/logfile.3'),
// )
// :
// 1. , /var/log/logfile.3 - , rename
// 2. !
$cnt = 1;
$renames = array();
$filename = $this->_file . '.' . $cnt;
$cnt++;
$renames[] = array($this->_file, $filename);
while (file_exists($filename)) {
$new_filename = $this->_file . '.' . $cnt;
$cnt++;
$renames[] = array($filename, $new_filename);
$filename = $new_filename;
}
// ,
$removes = array();
if (count($renames) > $this->_rotate) {
$removes = array_slice($renames, $this->_rotate);
$renames = array_slice($renames, 0, $this->_rotate);
}
//
foreach ($removes as $f) {
@unlink($f[0]);
}
//
$renames = array_reverse($renames);
foreach ($renames as $f) {
rename($f[0], $f[1]);
}
//
touch($this->_file);
$LockFileHandler->unlock();
$LockFileHandler->close();
}
}