Esempio n. 1
0
 /**
  * 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.
  */
 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';
         } else {
             $search = PREDIS_BASE_PATH;
         }
         if (is_dir($search . '/src')) {
             // Predis v1.x
             self::$predisVersionMajor = 1;
             define('PREDIS_BASE_PATH', $search);
         } else {
             if (is_dir($search . '/lib')) {
                 // Predis v0.x
                 self::$predisVersionMajor = 0;
                 define('PREDIS_BASE_PATH', $search);
             } 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;
         }
     }
 }