laravel和digitalocean会因缓存问题而挂起

时间:2017-11-28 13:44:35

标签: php laravel caching nginx

我构建了一个Laravel应用程序并将其上传到数字海洋。所有这些都没关系,除了我追踪但无法解决的一些问题。

问题是:

我创建了一个设置模型,其中包含一个包含键,值和其他字段的表。 我为我的应用程序的自定义设置创建了此模型。 另外,我创建了一个控制器来更新值并将其保存到缓存中(注意:缓存驱动程序是数组,因为我使用的是zizaco / entrust插件)。

public function update(Request $request, Factory $cache)
    {
        if (!Auth::user()->hasRole(['admin','owner'])){
            return redirect(config('app.admin_prefix') . '/index');
        }

        for($i = 0; $i < count($request->title); $i++){
            $input['value'] = $request->value[$i];
            Settings::whereId($request->id[$i])->first()->update($input);
        }

        // When the settings have been updated, clear the cache for the key 'settings' // Back to AppServiceProvider.php
        if (Cache::has('settings')) {
            $cache->forget('settings');
        }
        $this->generateSettings();

        return redirect('/admin/settings')->with([
            'message'    => __('Admin/admin.updated_successfully'),
            'alert-type' => 'success'
        ]);
    }

public function generateSettings() {
        if (Cache::has('settings')) {
            $setting = Cache::get('settings');
        } else {
            $setting = Settings::pluck('value', 'key')->all();
            if ($setting)
            {
                Cache::forever('settings', $setting);
            }
        }
        config()->set('settings', $setting);
    }

我在appServiceProvider.php中编写代码来加载缓存并将其分配给配置:

public function boot()
    {
        .
        .
        .

        if (Cache::has('settings')) {
            $setting = Cache::get('settings');
        } else {
            $setting = Settings::pluck('value', 'key')->toArray();
            if ($setting) {
                Cache::forever('settings', $setting);
            }
        }
        config()->set('settings', $setting);
        .
        .
        .
    }

现在,当我正在测试或刷新页面时,我的错误会出现。我看到了这条消息:

SQLSTATE[HY000] [2002] No such file or directory (SQL: select `value`, `key` from `settings`)

我应该等待一段时间直到页面工作,还是应该重新启动Nginx。

1 个答案:

答案 0 :(得分:0)

由于评论中的字符用完了,我会将其作为答案发布。

对我而言,有问题的部分似乎是在这一行

if (Cache::has('settings')) {
    $cache->forget('settings');
}

如果您可以重写代码,那么缓存不会被删除但是被覆盖的问题应该会消失。所以我的建议是这样做:

public function update(Request $request, Factory $cache)
    {
    if (!Auth::user()->hasRole(['admin','owner'])){
        return redirect(config('app.admin_prefix') . '/index');
    }

    for($i = 0; $i < count($request->title); $i++){
        $input['value'] = $request->value[$i];
        Settings::whereId($request->id[$i])->first()->update($input);
    }

    $this->generateSettings();

    return redirect('/admin/settings')->with([
        'message'    => __('Admin/admin.updated_successfully'),
        'alert-type' => 'success'
    ]);
}

public function generateSettings() 
{
        $setting = Settings::pluck('value', 'key')->all();
        if ($setting){
            Cache::forever('settings', $setting);
        }
        config()->set('settings', $setting);
}