Php Laravel初始页面加载非常缓慢,因为它运行重复的查询以获得正确的翻译

Php Laravel初始页面加载非常缓慢,因为它运行重复的查询以获得正确的翻译,php,laravel,Php,Laravel,我正在使用Laravel作为我的网站,速度非常慢。我的网站上有很多翻译,我通过Laravel的debugbar发现我的网站运行了很多重复的查询来获取翻译,经过一些测试,这是速度上最大的问题 为了获得正确的翻译,我在刀片中运行以下行: {!! Translation::getString('translation_slug') !!} 调用此函数的: //TranslationHelper.php public static function getString(string $string,

我正在使用Laravel作为我的网站,速度非常慢。我的网站上有很多翻译,我通过Laravel的debugbar发现我的网站运行了很多重复的查询来获取翻译,经过一些测试,这是速度上最大的问题

为了获得正确的翻译,我在刀片中运行以下行:

{!! Translation::getString('translation_slug') !!}
调用此函数的:

//TranslationHelper.php
public static function getString(string $string, array $variables = null) : string
{
    if ($variables) {
        $variables = array_map('strval', $variables);
        $variables = array_flip($variables);
        $variables = preg_filter('/^/', ':', $variables);
        $variables = array_flip($variables);
    }
    $translatable = Translatable::where('slug', $string)->first();
    if ($translatable) {
        $language = Session::get("language");
        if ($language) {
            if ($variables) { 
                return strtr($translatable->getTranslation($language), $variables);
            } else {
                return $translatable->getTranslation($language);
            }
        } else {
            if ($variables) { 
                return strtr($translatable->getTranslation('en'), $variables);
            } else {
                return $translatable->getTranslation('en');
            }
        }
    } else {
        return $string; // not found
    }
}
如您所见,它从可翻译模型运行getTranslation函数:

//Translatable.php
public function getTranslation(string $language) {
    $lang = Language::where('shortcode', $language)->first();
    if ($lang) $translation = Translation::where('language_id', $lang->id)->where('translatable_id', $this->id)->first();
    else $translation = Translation::where('language_id', 2)->where('translatable_id', $this->id)->first();
    
    if ($translation == null || !$translation || !$lang) {
        $translation = Translation::where('language_id', 2)->where('translatable_id', $this->id)->first();

        if ($translation) return strip_tags($translation->value, '<br><a><b><i><p><ul><li><strong><del><em><u>');
        else return $this->slug;
    }
    else return strip_tags(Translation::where('language_id', $lang->id)->where('translatable_id', $this->id)->first()->value, '<br><a><b><i><p><ul><li><strong><del><em><u>');
}
这大大降低了重复查询的次数,但当我尝试对以下翻译模型执行相同操作时:

    $languages = Cache::rememberForever('languages', function() {
        return Language::all();
    });
    $lang = $languages->where('shortcode', $language)->first();
    $translations = Cache::rememberForever('translations', function() {
        return Translation::all();
    });
    if ($lang) $translation = $translations->where('language_id', $lang->id)->where('translatable_id', $this->id)->first();
Laravel给出了一个致命错误:

Maximum execution time of 30 seconds exceeded

我运行的
Translation::where
行提供了数百个重复查询。我总共有6246个不同的翻译条目,所以我猜这与此有关。我是否犯了错误,或者是否有更好的方法来重构此代码,消除重复查询并提高我的网站速度?

您可以为每种语言的翻译设置单独的缓存项,我只会为一种特定的语言拉取它们,而不是将它们全部过滤掉them@lagbox也许用源于语言的标记标记每个翻译,这样每个翻译都可以为同一个翻译保留相同的键。P,你的翻译是否需要在数据库中?默认的Laravel翻译功能取决于PHP文件中的翻译,除非它是用于CMS之类的需要非技术用户编辑的东西,否则我会选择它route@MatthewDaly他们需要在数据库中,因为翻译可以在cms中编辑