public static function Redis_Client_Predis::setPredisAutoload in Redis 7.3
Same name and namespace in other branches
- 7.2 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.
1 call to Redis_Client_Predis::setPredisAutoload()
- Redis_Client_Predis::getClient in lib/
Redis/ Client/ Predis.php - Get the connected client instance.
File
- lib/
Redis/ Client/ Predis.php, line 37
Class
- Redis_Client_Predis
- Predis client specific implementation.
Code
public static function setPredisAutoload() {
if (self::$autoloaderRegistered) {
return;
}
self::$stupidCoreWorkaround++;
// 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 (1 < self::$stupidCoreWorkaround || !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
define('PREDIS_VERSION_MAJOR', 1);
}
else {
if (is_dir($search . '/lib')) {
// Predis v0.x
define('PREDIS_VERSION_MAJOR', 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 (PREDIS_VERSION_MAJOR) {
case 0:
$autoload = 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.
$autoload = 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;
}
if ($autoload) {
spl_autoload_register($autoload);
}
// Same reason why we have the stupid core workaround, if this happens
// during a second autoload call, PHP won't call the newly registered
// autoloader function, so just load the file.
if (1 < self::$stupidCoreWorkaround) {
call_user_func($autoload, 'Predis\\Client');
}
}
self::$autoloaderRegistered = true;
}