/** * Connects to the database. * * @return void * @throw eZClusterHandlerDBNoConnectionException * @throw eZClusterHandlerDBNoDatabaseException */ public function _connect() { $siteINI = eZINI::instance('site.ini'); // DB Connection setup // This part is not actually required since _connect will only be called // once, but it is useful to run the unit tests. So be it. // @todo refactor this using eZINI::setVariable in unit tests if (self::$dbparams === null) { $fileINI = eZINI::instance('file.ini'); self::$dbparams = array(); self::$dbparams['host'] = $fileINI->variable('eZDFSClusteringSettings', 'DBHost'); $dbPort = $fileINI->variable('eZDFSClusteringSettings', 'DBPort'); self::$dbparams['port'] = $dbPort !== '' ? $dbPort : null; self::$dbparams['socket'] = $fileINI->variable('eZDFSClusteringSettings', 'DBSocket'); self::$dbparams['dbname'] = $fileINI->variable('eZDFSClusteringSettings', 'DBName'); self::$dbparams['user'] = $fileINI->variable('eZDFSClusteringSettings', 'DBUser'); self::$dbparams['pass'] = $fileINI->variable('eZDFSClusteringSettings', 'DBPassword'); self::$dbparams['max_connect_tries'] = $fileINI->variable('eZDFSClusteringSettings', 'DBConnectRetries'); self::$dbparams['max_execute_tries'] = $fileINI->variable('eZDFSClusteringSettings', 'DBExecuteRetries'); self::$dbparams['sql_output'] = $siteINI->variable("DatabaseSettings", "SQLOutput") == "enabled"; self::$dbparams['cache_generation_timeout'] = $siteINI->variable("ContentSettings", "CacheGenerationTimeout"); } $serverString = self::$dbparams['host']; if (self::$dbparams['socket']) { $serverString .= ':' . self::$dbparams['socket']; } elseif (self::$dbparams['port']) { $serverString .= ':' . self::$dbparams['port']; } $maxTries = self::$dbparams['max_connect_tries']; $tries = 0; eZDebug::accumulatorStart('mysql_cluster_connect', 'MySQL Cluster', 'Cluster database connection'); while ($tries < $maxTries) { if ($this->db = mysqli_connect(self::$dbparams['host'], self::$dbparams['user'], self::$dbparams['pass'], self::$dbparams['dbname'], self::$dbparams['port'])) { break; } ++$tries; } eZDebug::accumulatorStop('mysql_cluster_connect'); if (!$this->db) { throw new eZClusterHandlerDBNoConnectionException($serverString, self::$dbparams['user'], self::$dbparams['pass']); } /*if ( !mysql_select_db( self::$dbparams['dbname'], $this->db ) ) throw new eZClusterHandlerDBNoDatabaseException( self::$dbparams['dbname'] );*/ // DFS setup if ($this->dfsbackend === null) { $this->dfsbackend = new eZDFSFileHandlerDFSBackend(); } $charset = trim($siteINI->variable('DatabaseSettings', 'Charset')); if ($charset === '') { $charset = eZTextCodec::internalCharset(); } if ($charset) { if (!mysqli_set_charset($this->db, eZMySQLCharset::mapTo($charset))) { $this->_fail("Failed to set Database charset to {$charset}."); } } }
public static function cssPackCacheCleanUp( $cacheIdentifier ) { $versionsToKeep = eZINI::instance( 'kless.ini' )->variable( 'KLessSettings', 'KeepPackedCssVersionNumber' ); if ( $versionsToKeep <= 0 ) { return; } $clusterFileHandler = eZClusterFileHandler::instance(); /* Sic.... */ switch( get_class($clusterFileHandler) ) { case 'eZFSFileHandler': case 'eZFS2FileHandler': $files = glob( self::cssPackedFilesDirectory() . '/k' . $cacheIdentifier . '*' ); sort( $files ); foreach( array_slice( $files, 0, count($files) - 1 - $versionsToKeep ) as $cssPackFile ) { $clusterFile = eZClusterFileHandler::instance( $cssPackFile ); $clusterFile->purge(); } break; case 'eZDFSFileHandler': $dfsDBHandler = new eZDFSFileHandlerMySQLiBackend(); $dfsDBHandler->_connect(); $db = $dfsDBHandler->db; $query = sprintf( "SELECT name FROM ezdfsfile WHERE scope = 'klesspack' AND name LIKE '%s' SORT BY mtime DESC", mysqli_escape_string( $db, self::cssPackedFilesDirectory() . '/k' . $cacheIdentifier . '%' ) ); $result = mysqli_query($db, $query); $inc = 0; while ( $row = mysqli_fetch_assoc($result) ) { if ( ++$inc < $versionsToKeep ) { continue; } $clusterFile = eZClusterFileHandler::instance( $row['name'] ); $clusterFile->purge(); } break; default: throw new Exception('Not implemented'); } }
<?php $dbHandler = new eZDFSFileHandlerMySQLiBackend(); $dbHandler->_connect(); /* @type $db mysqli */ $db = $dbHandler->db; $limit = 100; $offset = 0; $count = 0; do { $query = "SELECT name FROM ezdfsfile WHERE scope = 'template-block' AND mtime > 0 AND mtime < (UNIX_TIMESTAMP(NOW()) - 3600 * 24 * 2) LIMIT {$offset}, {$limit}"; $result = $db->query($query); $count = $result->num_rows; while ($row = $result->fetch_assoc()) { $name = $row['name']; $fileHandler = new eZDFSFileHandler($name); $fileHandler->purge(); } $offset += $limit; } while($count > 0);
/** * File containing the cleanupdfscache.php script * * @copyright Copyright (C) eZ Systems AS. All rights reserved. * @license For full copyright and license information view LICENSE file distributed with this source code. * @version //autogentag// */ require_once 'autoload.php'; $cli = eZCLI::instance(); $script = eZScript::instance(array('description' => "Deletes cache records from the DFS storage table.\n" . "Can be used on a live site to cleanup cache leftovers in ezdfsfile.", 'use-session' => true, 'use-modules' => false, 'use-extensions' => true)); $script->startup(); $options = $script->getOptions("[iteration-sleep:][iteration-limit:]", "", array('iteration-sleep' => 'Sleep duration between batches, in milliseconds (default: 100)', 'iteration-limit' => 'Batch size (default: 1000)')); $optIterationSleep = (int) $options['iteration-sleep'] ?: 100; $optIterationLimit = (int) $options['iteration-limit'] ?: 1000; $script->initialize(); $mysqliDFSBackend = new eZDFSFileHandlerMySQLiBackend(); try { $mysqliDFSBackend->_connect(); } catch (eZClusterHandlerDBNoConnectionException $e) { $script->shutdown(2, "Unable to connect to the cluster database. Is this instance configured to use the feature ?"); } $clusterHandler = eZClusterFileHandler::instance(); try { while ($deletedCount = $mysqliDFSBackend->deleteCacheFiles($optIterationLimit)) { $cli->output("Deleted {$deletedCount} cache record(s)"); usleep($optIterationSleep * 1000); } } catch (InvalidArgumentException $e) { $script->shutdown(0, "The cache and storage tables are identical, nothing to do"); } catch (RuntimeException $e) { $script->shutdown(1, "A database error occured:\n" . $e->getMessage());