You are here

public static function Redis_Client_Predis::setPredisAutoload in Redis 7.2

Same name and namespace in other branches
  1. 7.3 lib/Redis/Client/Predis.php \Redis_Client_Predis::setPredisAutoload()

Define Predis base path if not already set, and if we need to set the autoloader by ourself. This will ensure no crash. Best way would have been that Drupal ships a PSR-0 autoloader, in which we could manually add our library path.

We cannot do that in the file header, PHP class_exists() function wont see classes being loaded during the autoloading because this file is loaded by another autoloader: attempting the class_exists() during a pending autoloading would cause PHP to crash and ignore the rest of the file silentely (WTF!?). By delaying this at the getClient() call we ensure we are not in the class loading process anymore.

5 calls to Redis_Client_Predis::setPredisAutoload()
redis.autoload.inc in ./redis.autoload.inc
Redis module autoloader.
Redis_Tests_Cache_PredisFixesUnitTestCase::getClientInterface in lib/Redis/Tests/Cache/PredisFixesUnitTestCase.test
Set up the Redis configuration
Redis_Tests_Cache_PredisFlushUnitTestCase::getClientInterface in lib/Redis/Tests/Cache/PredisFlushUnitTestCase.test
Set up the Redis configuration
Redis_Tests_Cache_PredisWithEvalFlushUnitTestCase::getClientInterface in lib/Redis/Tests/Cache/PredisWithEvalFlushUnitTestCase.test
Set up the Redis configuration
Redis_Tests_Lock_PredisLockingUnitTestCase::getClientInterface in lib/Redis/Tests/Lock/PredisLockingUnitTestCase.test
Set up the Redis configuration

File

lib/Redis/Client/Predis.php, line 41

Class

Redis_Client_Predis
Predis client specific implementation.

Code

public static function setPredisAutoload() {
  if (self::$autoloaderRegistered) {
    return;
  }
  else {
    self::$autoloaderRegistered = true;
  }

  // If you attempt to set Drupal's bin cache_bootstrap using Redis, you
  // will experience an infinite loop (breaking by itself the second time
  // it passes by): the following call will wake up autoloaders (and we
  // want that to work since user may have set its own autoloader) but
  // will wake up Drupal's one too, and because Drupal core caches its
  // file map, this will trigger this method to be called a second time
  // and boom! Adios bye bye. That's why this will be called early in the
  // 'redis.autoload.inc' file instead.
  if (!class_exists('Predis\\Client')) {
    if (!defined('PREDIS_BASE_PATH')) {
      $search = DRUPAL_ROOT . '/sites/all/libraries/predis';
      define('PREDIS_BASE_PATH', $search);
    }
    else {
      $search = PREDIS_BASE_PATH;
    }
    if (is_dir($search . '/src')) {

      // Predis v1.x
      self::$predisVersionMajor = 1;
    }
    else {
      if (is_dir($search . '/lib')) {

        // Predis v0.x
        self::$predisVersionMajor = 0;
      }
      else {
        throw new Exception("PREDIS_BASE_PATH constant must be set, Predis library must live in sites/all/libraries/predis.");
      }
    }

    // Register a simple autoloader for Predis library. Since the Predis
    // library is PHP 5.3 only, we can afford doing closures safely.
    switch (self::$predisVersionMajor) {
      case 0:
        spl_autoload_register(function ($classname) {

          // PSR-0 autoloader.
          if (0 === strpos($classname, 'Predis\\')) {
            $filename = PREDIS_BASE_PATH . '/lib/' . str_replace('\\', '/', $classname) . '.php';
            return (bool) (require_once $filename);
          }
          return false;
        });
        break;
      case 1:

        // Register a simple autoloader for Predis library. Since the Predis
        // library is PHP 5.3 only, we can afford doing closures safely.
        spl_autoload_register(function ($classname) {

          // PSR-4 autoloader
          if (0 === strpos($classname, 'Predis\\')) {
            $filename = PREDIS_BASE_PATH . '/src/' . str_replace('\\', '/', substr($classname, 7)) . '.php';
            return (bool) (require_once $filename);
          }
          return false;
        });
        break;
    }
  }
}