Example #1
0
 /**
  * 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());