连接失败时,缓存驱动程序切换
#laravel #cache #redis #storage

缓存驱动程序的常见用法

与小型项目一起工作时。 SPA(单页应用程序),基于模块的功能(付款网关),小型服务提供商等。在渲染时无需处理大量数据。但是,在使用适当可扩展性的大规模应用程序工作时,渲染时间和更快的数据加载速度通常会面临加载问题和数据库连接问题。

为了减轻这些问题,我们经常使用缓存驱动程序存储数据来更快地处理数据,并且无需从数据库中获取或从那里查询。

laravel cache driver用于一些大规模应用中,以维持数据可读性,更快的执行和数据过滤。但是,当下面提到的最糟糕情况时,我们要做的就是用裸手处理一些例外:

  • 缓存驱动程序无法连接EX。 redis

  • 缓存驱动程序停止响应或关闭某些问题。

  • 数据存储或数据提出未知异常。

对于那些人来说,申请跌倒和客户失望的人数太高。为了防止这种情况,我们必须立即从一个缓存驱动器切换到另一个缓存驱动程序,而不是手动切换。

在拉拉维尔(Laravel)中,切换缓存驱动程序有一个棘手但有效的效率。

在Laravel中切换缓存驱动程序

假设,我们将 redis 设置为缓存驱动程序,但我们也有用于缓存存储的文件驱动程序。如果 redis 意外关闭,我们必须使用以下操作切换到文件驱动程序:

class CacheConnectionValidator // Cache connection checker
{
    /**
     * @return void
     */
    public static function checkAndUpdateCacheDriver() : void
    {
        $redis_host = env("REDIS_HOST"); // primary set cache host
        $redis_port = env("REDIS_PORT"); // primary set cache host port
        if(!self::checkPortConnection($redis_host,$redis_port)){
            config(['cache.default' => 'file']);
        }
    }

    /**
     * @param string $redis_host
     * @param string $redis_port
     *
     * @return bool
     */
    private static function checkPortConnection($redis_host,$redis_port) // check host return response
    {
        try{
            $connection = fsockopen($redis_host, $redis_port, $errno, $errstr, 20);
            if( !$connection ){
                return false;
            } else {
                return true;
            }
        } catch(Exception $e){
            return false;
        }
    }
}
在这里

fsockopen()在这里用于打开外部源套接字连接,以在任何应用程序运行时检查连接机构。我们可以使用与fsockopen()相同的pfsockopen(),但是fsockopen()在脚本完成后正在关闭,但是pfsockopen()即使在脚本完成后也在运行。

如果连接返回true,则表示主机正在响应,但是如果连接返回false,请立即将文件设置为默认缓存驱动程序。

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // While boot the class will be called
        CacheConnectionValidator::checkAndUpdateCacheDriver();
    }

cacheconnectionValidator 等级应在 AppServiceProvider 中注册以加载脚本。

整个过程在以下草图:

Cache storage switch journey

还有更多的包装。佩斯(Predis),phpredis捕获了redis连接异常,但有时在运行时跌落时无法捕获异常。因此,使用内置功能内置的PHP来捕获例外并立即采取行动

是安全且安全的

有一个很好的lara-dayð