2016-02-23 3 views
0

Интересно, есть ли проблемы с производительностью в отношении динамической загрузки маршрутов через базу данных.Ошибка производительности динамической маршрутизации Laravel

В routes.php он будет извлекать значения из базы данных и создавать маршрутизацию оттуда.

От routes.php:

buildDynamicRoutes(new App\Factory\ModelFactory('App\Models\RoutingModel')); 

function buildDynamicRoutes($model) 
{ 
    $routes = $model->getInstance()->getRoutes(); // 'routes' is the table name wherein routes will be stored. 
    if (is_array($routes) && !empty($routes)) { 
     foreach ($routes as $route) { 
      Route::resource($route['url'], 'DynamicController'); 
     } 
    } 
} 

Так в основном, на методе buildDynamicRoutes, он будет вызывать ModelFactory, что создает экземпляр класса RoutingModel. После создания экземпляра он подключится к API через метод getRoutes(), который вернет результат маршрута.

Оттуда он построит базу Route::resource на возвращенном $route['url'], который будет использовать DynamicController.

Имея эту структуру, будет ли какая-либо проблема с производительностью в отношении маршрутизации или загрузки веб-приложения? Я спрашиваю об этом, потому что я замечаю, что мое веб-приложение, похоже, загружается очень медленно, около 10-18 секунд загрузки страницы.

Недавно я обновился от Codeigniter до Laravel 5.2 и заметьте резкую проблему с производительностью при переключении на Laravel. Когда я раньше использовал Codeigniter, страница загружается всего через 2-4 секунды. Обратите внимание на огромную разницу.

Одинаковая логика, просто перепишите код базы по стандартам Laravel.

+0

Codeigniter быстрее, чем laravel –

+0

Я никогда не видел что-то подобное в Laravel. Обычно маршруты статичны и затем кэшируются через механизм кэширования маршрута. Кроме того, попробуйте Lumen, у которого есть более быстрый маршрутизатор. –

+1

Попробуйте использовать кэширование маршрутов (я не знаю, будет ли это работать для вашего примера), но если это произойдет, не забудьте повторно кэшировать свои маршруты каждый раз, когда вы создаете новый '' php artisan route: cache'' – ahmad

ответ

1

Попробуйте это и сообщите нам, как это происходит.

$routes = Cache::has('routes') 
       ? Cache::get('routes') 
       : $model->getInstance()->getRoutes(); 
if (!Cache::has('routes')) { 
    Cache::add('routes', $routes, 120); 
} 

Заменить с "$ маршрутов = $ модели-> GetInstance() -> getRoutes()" assignament. Возможно, вам нужно импортировать Cache:

use Illuminate\Support\Facades\Cache; 

Если ваши $ маршрутов значение изменяется frecuently вы можете установить другое время кэша, а не 120 минут.

+0

Спасибо за это. Я хотел бы знать, в чем разница в том, что этот код отличается от этой команды: 'php artisan route: cache'? Кроме того, при выполнении этой команды я сталкиваюсь с ошибкой '[Symfony \ Component \ Debug \ Exception \ FatalErrorException] Невозможно обновить buildDynamicRoutes() (ранее объявлено ...)' Нет, где этот метод объявлен, кроме файла маршрутов что делает его странным, почему он рассматривает его как дублирующий метод, когда он объявляется только один раз. – basagabi

+0

Не уверен. Я думаю, что команда мастеров лучше, когда у вас мало изменений в ваших маршрутах. – fmgonzalez

+1

Чтобы избежать ошибки при обновлении, вы можете включить объявление функции в '' if (! Function_exists ('buildDynamicRoutes')) 'statement. – fmgonzalez

Смежные вопросы