/** * Executes the purge operation * * @todo Endless loop on fetch list. The expired items are returned over and over again */ public function run() { $cli = eZCLI::instance(); if ( $this->optMemoryMonitoring == true ) { eZLog::rotateLog( self::LOG_FILE ); $cli->output( "Logging memory usage to " . self::LOG_FILE ); } if ( $this->optIterationSleep > 0 ) $sleep = ( $this->optIterationSleep * 1000000 ); else $sleep = false; $limit = array( 0, $this->optIterationLimit ); $cli->output( "Purging expired items:" ); self::monitor( "start" ); // Fetch a limited list of purge items from the handler itself $clusterHandler = eZClusterFileHandler::instance(); while ( $filesList = $clusterHandler->fetchExpiredItems( $this->optScopes, $limit, $this->optExpiry ) ) { self::monitor( "iteration start" ); foreach( $filesList as $file ) { $cli->output( "- $file" ); if ( $this->optDryRun == false ) { self::monitor( "purge" ); $fh = eZClusterFileHandler::instance( $file ); $fh->purge( false, false ); unset( $fh ); } } if ( $sleep !== false ) usleep( $sleep ); // the offset only has to be increased in dry run mode // since each batch is not deleted if ( $this->optDryRun == true ) { $limit[0] += $limit[1]; } self::monitor( "iteration end" ); } self::monitor( "end" ); }
static function writeStorageLog($name, $dir = false) { $ini = eZINI::instance(); $varDir = $ini->variable('FileSettings', 'VarDir'); $logDir = $ini->variable('FileSettings', 'LogDir'); $logName = 'storage.log'; $fileName = $varDir . '/' . $logDir . '/' . $logName; $oldumask = @umask(0); clearstatcache(true, $fileName); $fileExisted = file_exists($fileName); if ($fileExisted and filesize($fileName) > eZLog::maxLogSize()) { if (eZLog::rotateLog($fileName)) { $fileExisted = false; } } else { if (!$fileExisted and !file_exists($varDir . '/' . $logDir)) { eZDir::mkdir($varDir . '/' . $logDir, false, true); } } if ($dir !== false) { $dir = preg_replace("#/\$#", "", $dir); $dir .= "/"; } else { $dir = ""; } $logFile = @fopen($fileName, "a"); if ($logFile) { $time = strftime("%b %d %Y %H:%M:%S", strtotime("now")); $logMessage = "[ " . $time . " ] [" . $dir . $name . "]\n"; @fwrite($logFile, $logMessage); @fclose($logFile); if (!$fileExisted) { $permissions = octdec($ini->variable('FileSettings', 'LogFilePermissions')); @chmod($fileName, $permissions); } @umask($oldumask); } else { eZDebug::writeError('Couldn\'t create the log file "' . $fileName . '"', __METHOD__); } }
/** * Executes the purge operation * * @param int|null $iterationLimit Number of trashed objects to treat per iteration, use null to use a default value. * @param int|null $sleep Number of seconds to sleep between two iterations, use null to use a default value. * * @return bool True if the operation succeeded. */ public function run($iterationLimit = 100, $sleep = 1) { if ($iterationLimit === null) { $iterationLimit = 100; } if ($sleep === null) { $sleep = 1; } if ($this->memoryMonitoring) { eZLog::rotateLog($this->logFile); $this->cli->output("Logging memory usage to {$this->logFile}"); } $this->cli->output("Purging trash items:"); $this->monitor("start"); $db = eZDB::instance(); // Get user's ID who can remove subtrees. (Admin by default with userID = 14) $userCreatorID = eZINI::instance()->variable("UserSettings", "UserCreatorID"); $user = eZUser::fetch($userCreatorID); if (!$user) { $this->cli->error("Cannot get user object with userID = '{$userCreatorID}'.\n(See site.ini[UserSettings].UserCreatorID)"); return false; } eZUser::setCurrentlyLoggedInUser($user, $userCreatorID); $trashCount = eZContentObjectTrashNode::trashListCount(false); if (!$this->quiet) { $this->cli->output("Found {$trashCount} object(s) in trash."); } if ($trashCount == 0) { return true; } if ($this->script !== null) { $this->script->resetIteration($trashCount); } while ($trashCount > 0) { $this->monitor("iteration start"); $trashList = eZContentObjectTrashNode::trashList(array('Limit' => $iterationLimit), false); $db->begin(); foreach ($trashList as $trashNode) { $object = $trashNode->attribute('object'); $this->monitor("purge"); $object->purge(); if ($this->script !== null) { $this->script->iterate($this->cli, true); } } if (!$db->commit()) { $this->cli->output(); $this->cli->error('Trash has not been emptied, impossible to commit the whole transaction'); return false; } $trashCount = eZContentObjectTrashNode::trashListCount(false); if ($trashCount > 0) { eZContentObject::clearCache(); if ($sleep > 0) { sleep($sleep); } } $this->monitor("iteration end"); } if (!$this->quiet) { $this->cli->output('Trash successfully emptied'); } $this->monitor("end"); return true; }