Laravel Performance Optimization 2020

    By: Thad Mertz
    2 years ago

    Working with web applications always creates this question. That if the application loads on time as quickly as possible. As it is one of the major concern when it comes to SEO ( Search Engine Optimisation ). Let's see how you can make your Laravel/ php application fast enough.

    Code Like A Pro

    It is true. Your code matters a-lot. when it comes to performance of application. Have a look on this code.

     //This query getting id, title, image, content, slug, author_id, created_at, updated_at
    
    Post::get()
    

    We can change this code to

     //If i need only these fields then this is enough
    Post::get(['id','title','image'])
    

    You can see you can optimize your query. Also see this example.

     $user = [];
    //Getting user id from posts
    foreach($posts as $post){
    	if($post->user_id){
    	      //querying for each post to get user info from database
    	      $user[] = User::where('id',$post->user_id)->get();
    	}
    }
    

    Now in this code if you see carefully. We are getting user id from each post. and then querying inside loop by passing that user id. It will take time if you have a-lot of posts. It would be better if you change query of this kind to something like this. And avoid passing query inside a loop.

     $user = [];
    //get all user id first
    foreach($posts as $post){
    	if(!in_array($post->id,$user)){
    	       $user[] = $post->id;
    	}
    }
    //get user data using user array we got and only taking required fields
    return User::whereIn('id',$user)->get(['id','name','ip_address']);
    
    or 
    
    //get user data using user array we got and only taking required field
    return User::whereIn('id',$user)->pluck('id');
    

    Check here we are correcting 3 things.

    1. We are only getting users id in array once so if many posts saved by one user we will have that user in our $user variable only once because of in_array php function. And it will help us to run query only once for each user.

    2. We are getting only required fields not every field so we will have less data to process.

    3. We are returning results straight away.

     return User::whereIn('id',$user)->pluck('id');
    
    //instead
    
    $data =  User::whereIn('id',$user)->pluck('id');
    return $data;
    

    Use Laravel Components

    Don't use same code again and again. Use components Instead. Let's say we are using below given code in many blade files ( pages ).

     //Getting user name and displaying@foreach($users as $user){	<p></p>}
    

    So you can put it in a component. Just create components folder in Laravel proect and create a component. Create users.blade.php component file. And put code in there. Now when ever you call that component code will display users and you can change only one file and changes will reflect where ever you call that component.

     //call component
    @component('users')
    @endcomponent
    

    You Can Read More here

    Use less libraries and plugins

    Now you know how to code like a pro it's time to think twice before adding another package or library in our project. Laravel applications divided into 2 parts. layout files and blade files. Blade files extend layout files. So it is vital to have light layout files because each library you call in layout file will load on each page of your application. So use best practices. Let's see example of layout file here

    <!DOCTYPE html>
    <html lang="en">
    <head>    
    <link rel="stylesheet" href="">   
    <link rel="stylesheet" href="">    
    <link rel="stylesheet" href="">   
    <link rel="stylesheet" href="">    
    <link rel="stylesheet" href="">    
    <link rel="stylesheet" href="">    
    <link rel="stylesheet" href="">   
    <link rel="stylesheet" href="">    
    <link rel="stylesheet" href="">
    
    @yield('styles')   
    
    <style>  
    body {            
        font-family: "Roboto",sans-serif; 
        font-weight: 300;            
        margin-top: 110px !important;       
    }    
    </style>
    </head>
    
    <body>
    @yield('content')
        <script src=""></script>
        <script src=""></script>
        <script src=""></script>
        <script src=""></script>
        <script src=""></script>
        <script src=""></script>
        <script src=""></script>
    @yield('scripts')
    </body>
    </html>
    

    Now if you see this layout file. We are including few script files. and as it is a layout file these scripts will load on each page of our application. So what we can do here.

    If we are using owl carousel on one blade file then only include in that blade file. Not on this file.

    Use Minified cdn and libraries

    One good thing about above layout file is most script files are minified ( Compressed ). This is good minified files can be used to increase performance. So always use minified version of scripts.

    Laravel Compression using Webpack Mix

    In laravel we can compress our css and js files. To do that in our laravel application open webpack.mix.js file using text editor. Add instruction check this example.

     
    //Minify the css files
    mix.minify(['public/frontendNew/css/bootstrap.css']);
    mix.minify(['public/frontendNew/css/owl.carousel.css']);
    mix.minify(['public/frontendNew/css/font-awesome.min.css']);
    
    //Minify the js files
    mix.minify(['public/frontendNew/js/vendor/jquery-2.2.4.min.js']);
    mix.minify(['public/frontendNew/js/vendor/bootstrap.min.js']);
    mix.minify(['public/frontendNew/js/owl.carousel.min.js']);
    
    

    Here we told laravel to minify our files. But it will take effect when we run npm command to make our ready for production.

     npm run production
    

    We also can compile multiple files into one using Laravel Mix see here

     //making minified file from two style css files
    mix.styles([
        'public/css/vendor/styleOne.css',
        'public/css/vendor/styleTwo.css'
    ], 'public/css/all.css');
    

    Read More about Laravel Mix Here

    Load code Only when it is needed

    It is also important to run code when it is needed not on each page refresh. Users looks for info then user clicks then display content not on page refresh. Only load data on page load when it is must. check this example

     //Getting comments and replies all at once displaying it $commentIds = [];@foreach($comments as $comment){	<p></p>	$commentIds[] = $comment->id;}return Reply::whereIn('comment_id',$commentIds)->get(['id','reply','user_id']);
    

    In this code we are displaying comments and replies all at once to make things faster you can loan replies on click of comment. So to see replies user clicks on each comment then use Ajax to display replies.

    Compress images and use less images on page

    If you load images on page then obviously page will load slow so it is better to compress images before adding to your content. Use this tool to define Image resolution and compress .

    Some Laravel commands

    To optimize Laravel Application there are laravel commands as well that developers use during development.

     php artisan route:cache 
    php artisan config:cache 
    php artisan optimize –force
    php artisan config:clear
    php artisan route:clear
    php artisan optimize:clear
    

    So if you have cache and you want to clear it you can also use these commands as well.

    Let me know if you liked these ways to make your application faster. and let me know if there is any other way you use in your Laravel application.