اذهب إلى المحتوى

السؤال

نشر

أحاول ضمان عمل التطبيق في لارافيل في حال فشل أحد المكونات التي أقوم باستخدامها ضمنه. وأقوم حالياً باستخدام قاعدة بيانات لتخزين البيانات الأساسية (المستخدمين، المنتجات،...). بالإضافة لذلك أقوم باستخدام redis لحفظ الجلسات والبيانات الثانوية ضمن التطبيق.

الذي أحاول القيام به الآن تحديداً هو أنه في حال فشل خادم redis لسبب ما، أريد العودة تلقائياً وتخزين البيانات ضمن قاعدة البيانات بدلاً من ال cache وبذلك أضمن عدم ضياع البيانات لأي سبب كان. مع العلم أنني أقوم بتخزين بيانات ال الكاش على خادم، وبيانات الجلسات على خادم آخر

'redis' => array(

    'cluster' => false,

    'default' => array(
        'host'     => '192.168.56.101',
        'port'     => 6379,
        'database' => 0,
    ),

    'session' => array(
        'host'     => '192.168.56.102',
        'port'     => 6379,
        'database' => 1,
    ),
),

 

Recommended Posts

  • 0
نشر

يمكنك معالجة هذه المشكلة باستخدام قيم متغيّرة بدلاً من القيم الثابتة أثناء تعريف Redis. فأولاً يجب تغيير تعريف redis ضمن config/database.php ليصبح على الشكل التالي:

'redis' => [

   'cluster' => false,

   'default' => [
       'host'     => env('REDIS_HOST', 'localhost'),
       'password' => env('REDIS_PASSWORD', null),
       'port'     => env('REDIS_PORT', 6379),
       'database' => 0,
   ],

   'session' => [
         'host'     => env('REDIS_HOST', 'localhost'),
         'password' => env('REDIS_PASSWORD', null),
         'port'     => env('REDIS_PORT', 6379),
         'database' => 1,
   ],
],

وبذلك يتم استخدام قيم قابلة للتغير من بين القيم المعرفة ضمن .env

وبعدها ستحتاج لتغيير ioc binding باستخدام الصف Illuminate\Cache\CacheManager :

class MyCacheManager extends Illuminate\Cache\CacheManager
{
    protected function createRedisDriver(array $config)
    {
        try {
            return parent::createRedisDriver($config);
        } catch (\Exception $e) {

            //يتم العودة للتخزين الافتراضي Redis في حال حدوث خطأ في 
            
            return $this->resolve('file');
        }
    }
}

ثم ضمن ملف مزود الخدمة ServiceProvider تأكد من استخدام النمط singleton أثناء التعامل مع البيانات وتعديل التابع الخاص بذلك بإضافة الصف الذي قمت بإنشائه:

$this->app->singleton('cache', function($app)
{
    return new MyCacheManager($app);
});

وأيضاً هنالك بعض المكتبات والحزم التي أنجزها مطورين لحل هذه المشكلة، ومنها حزمة Laravel-Redis-Fallback وأيضاً حزمة Laravel-cache-fallback

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...