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