*/ declare(strict_types = 1); /** * Provides caching functions. */ final class MD_STD_CACHE { /** @var string */ public static string $redis_host = '127.0.0.1'; /** @var integer */ public static int $redis_port = 6379; /** * Opens a connection to redis. * * @return Redis */ public static function open_redis_default():Redis { $redis = new Redis(); $redis->connect(self::$redis_host, self::$redis_port, 1, null, 0, 0, ['auth' => [MD_CONF::$redis_pw]]); return $redis; } /** * Shutdown function for caching contents of output buffer. * * @param string $redisKey Key to cache by in redis. * @param integer $expiry Expiration time in seconds. * * @return void */ public static function shutdown_cache_through_redis(string $redisKey, int $expiry = 3600):void { $outputT = trim(MD_STD::minimizeHTMLString(MD_STD::ob_get_clean())); echo $outputT; $redis = self::open_redis_default(); $redis->set($redisKey, $outputT); $redis->expire($redisKey, $expiry); $redis->close(); } /** * Caches and serves a page through redis. Should be called at the start * of the script generating a page. * * @param string $redisKey Key to cache by in redis. * @param integer $expiry Expiration time in seconds. * * @return string */ public static function serve_page_through_redis_cache(string $redisKey, int $expiry = 3600):string { if (PHP_SAPI === 'cli') { return ''; } $redis = self::open_redis_default(); if ($redis->ping() !== false) { ob_start(); if ($redisResult = $redis->get($redisKey)) { if (strlen($redisResult) > 3 and strpos($redisResult, ' id="errorPage"') === false) { $redis->close(); return $redisResult; } else { register_shutdown_function(function(string $redisKey, int $expiry = 3600) :void { self::shutdown_cache_through_redis($redisKey, $expiry); }, $redisKey); } } else { register_shutdown_function(function(string $redisKey, int $expiry = 3600) :void { self::shutdown_cache_through_redis($redisKey, $expiry); }, $redisKey); } } $redis->close(); return ''; } }