reCAPTCHA WAF Session Token
Programming Languages

7 Easy Ways to Make a Magento 2 Website Faster — SitePoint

Magento 2 is a popular ecommerce platform. One of the complaints I hear is that it’s slow. Site owners can face slow catalog pages and unresponsive checkouts. The reasons behind poor performance vary from misconfiguration to too many third-party extensions. In this article, I’ll present seven practical tips for ensuring that your Magento 2 online store is able to run faster.

1. Use Varnish as a Caching Application

Varnish is a HTTP proxy that can cache content. You can install it in front of a web server and increase the site’s performance. (You can visit the Varnish website here.

Magento 2 has built-in support for Varnish. To turn it on, you need to do two things:

  1. Go to an admin panel menu > Stores > Configuration > Advanced > System > Full Page Cache and set Caching Application to Varnish Cache.

  2. Then expand the Varnish Configuration tab and export a VCL file.

    Varnish Configuration

Pass this file to your system administrator or a hosting support team. They will use that file to configure Varnish daemon.

2. Install a Cache Warmer

Magento 2 implements full page cache (FPC) to have low server response time. FPC works in a way that the first request is slow and all the next requests are fast.

A cache warmer is a script (or extension) that makes those first requests. It fills up cache storage so that users can enjoy low time to the first byte (TTFB).

You can install a cache warmer as a Magento 2 module. There are commercial ones and a free one available.

Or, you could create a simple PHP script. It will warm all categories and a list with the most popular pages:

<code class="php language-php"><span class="token function">ini_set</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'memory_limit'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'12000M'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Magento<span class="token punctuation">\</span>Framework<span class="token punctuation">\</span>App<span class="token punctuation">\</span>Bootstrap</span><span class="token punctuation">;</span>
<span class="token keyword">require</span> <span class="token constant">__DIR__</span><span class="token operator">.</span><span class="token string single-quoted-string">'/app/bootstrap.php'</span><span class="token punctuation">;</span>
<span class="token variable">$params</span> <span class="token operator">=</span> <span class="token global">$_SERVER</span><span class="token punctuation">;</span>
<span class="token variable">$bootstrap</span> <span class="token operator">=</span> <span class="token scope">Bootstrap<span class="token punctuation">::</span></span><span class="token function">create</span><span class="token punctuation">(</span><span class="token constant">BP</span><span class="token punctuation">,</span><span class="token variable">$params</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$obj</span> <span class="token operator">=</span> <span class="token variable">$bootstrap</span><span class="token operator">-></span><span class="token function">getObjectManager</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$state</span> <span class="token operator">=</span> <span class="token variable">$obj</span><span class="token operator">-></span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Magento\Framework\App\State'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$state</span><span class="token operator">-></span><span class="token function">setAreaCode</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'frontend'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$categories</span> <span class="token operator">=</span> <span class="token variable">$obj</span><span class="token operator">-></span><span class="token function">create</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Magento\Catalog\Model\ResourceModel\Category\Collection'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$categories</span><span class="token operator">-></span><span class="token function">addIsActiveFilter</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
           <span class="token operator">-></span><span class="token function">joinUrlRewrite</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$categories</span> <span class="token keyword">as</span> <span class="token variable">$cat</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
   <span class="token variable">$st</span> <span class="token operator">=</span> <span class="token function">microtime</span><span class="token punctuation">(</span><span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token variable">$dd</span> <span class="token operator">=</span> <span class="token function">file_get_contents_ssl</span><span class="token punctuation">(</span><span class="token variable">$cat</span><span class="token operator">-></span><span class="token function">getUrl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token variable">$fn</span> <span class="token operator">=</span> <span class="token function">microtime</span><span class="token punctuation">(</span><span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$fn</span> <span class="token operator">-</span> <span class="token variable">$st</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">0.9</span><span class="token punctuation">)</span>
    <span class="token keyword">echo</span> <span class="token variable">$cat</span><span class="token operator">-></span><span class="token function">getUrl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">" : time: "</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token variable">$fn</span> <span class="token operator">-</span> <span class="token variable">$st</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span>
   <span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token variable">$open</span> <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"1000-popular-pages.csv"</span><span class="token punctuation">,</span><span class="token string double-quoted-string">"r"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">while</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$data</span> <span class="token operator">=</span> <span class="token function">fgetcsv</span><span class="token punctuation">(</span><span class="token variable">$open</span><span class="token punctuation">,</span><span class="token number">4000</span><span class="token punctuation">,</span><span class="token string double-quoted-string">","</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">!==</span> <span class="token constant boolean">FALSE</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">filter_var</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token constant">FILTER_VALIDATE_URL</span><span class="token punctuation">)</span> <span class="token operator">!==</span> <span class="token constant boolean">FALSE</span> <span class="token operator">&&</span> <span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token string double-quoted-string">".pdf"</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant boolean">FALSE</span> <span class="token operator">&&</span> <span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token string double-quoted-string">"https://www.sitepoint.com/blog/"</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant boolean">FALSE</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
      <span class="token variable">$st</span> <span class="token operator">=</span> <span class="token function">microtime</span><span class="token punctuation">(</span><span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token variable">$dd</span> <span class="token operator">=</span> <span class="token function">file_get_contents_ssl</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token variable">$fn</span> <span class="token operator">=</span> <span class="token function">microtime</span><span class="token punctuation">(</span><span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$fn</span> <span class="token operator">-</span> <span class="token variable">$st</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">0.9</span><span class="token punctuation">)</span>
       <span class="token keyword">echo</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token operator">.</span><span class="token string double-quoted-string">" : time: "</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token variable">$fn</span> <span class="token operator">-</span> <span class="token variable">$st</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span>
      <span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token function">fclose</span><span class="token punctuation">(</span><span class="token variable">$open</span><span class="token punctuation">)</span>

<span class="token keyword">function</span> <span class="token function">file_get_contents_ssl</span><span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token variable">$ch</span> <span class="token operator">=</span> <span class="token function">curl_init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_SSL_VERIFYPEER</span><span class="token punctuation">,</span> <span class="token constant boolean">FALSE</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_SSL_VERIFYHOST</span><span class="token punctuation">,</span> <span class="token constant boolean">FALSE</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_HEADER</span><span class="token punctuation">,</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_FOLLOWLOCATION</span><span class="token punctuation">,</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_URL</span><span class="token punctuation">,</span> <span class="token variable">$url</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_REFERER</span><span class="token punctuation">,</span> <span class="token variable">$url</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_RETURNTRANSFER</span><span class="token punctuation">,</span> <span class="token constant boolean">TRUE</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_CONNECTTIMEOUT</span><span class="token punctuation">,</span> <span class="token number">3000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
    <span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_TIMEOUT</span><span class="token punctuation">,</span> <span class="token number">10000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
    <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token function">curl_exec</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$result</span> <span class="token operator">===</span> <span class="token constant boolean">FALSE</span><span class="token punctuation">)</span>
       <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token function">curl_error</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">curl_close</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token variable">$result</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code>

The popular pages list you could export from Google Analytics.

3. Move JavaScript to the Bottom of the Page

Moving JavaScript to the page bottom will improve the first contentful paint speed metric.

Magento 2.4+ has a special admin setting for it. You can run the command line:

<code class="bash language-bash">php bin/magento config:set  dev/js/move_script_to_bottom <span class="token number">1</span>
</code>

Then flush the cache:

<code class="bash language-bash">php bin/magento cache:flush
</code>

Now Magento will move JavaScript to the bottom.

4. Convert Images to WebP Format

WebP images take less disk space than JPEGs and PNGs. If we can convert a site’s pictures to WebP, we can lower page weight and improve performance.

Using a special cwebp command line utility you can convert an image to WebP:

<code class="bash language-bash">cwebp -q <span class="token number">80</span> image.png image.webp
</code>

the -q switch sets a quality range. (In our case it’s 80.)

There are several Magento 2 modules that can do this conversion. Adobe Commerce Marketplace is a great place to find those extensions.

5. Turn HTML Minification On

HTML minification helps reduce page weight and improve speed.

Magento 2.4+ can minify HTML with no extra modules.

To turn it on you need to run the following command:

<code class="bash language-bash">php bin/magento config:set dev/template/minify_html <span class="token number">1</span>
</code>

Then you’ll need to recompile to actually create minified templates:

<code class="bash language-bash">php bin/magento deploy:mode:set production
</code>

6. Compress and Merge JavaScript and CSS

Compressing and merging JS and CSS files helps reduce page weight. It also lowers HTTP requests and makes the site faster.

To turn on merging and compressing, run the following commands:

<code class="bash language-bash">php bin/magento config:set dev/js/merge_files <span class="token number">1</span>
php bin/magento config:set dev/css/merge_css_files <span class="token number">1</span>
php bin/magento config:set dev/js/minify_files <span class="token number">1</span>
php bin/magento config:set dev/css/minify_files <span class="token number">1</span>
</code>

Then recompile:

<code class="bash language-bash">php bin/magento deploy:mode:set production
</code>

And it should be working.

7. Cache ElasticSearch Query Results

Magento 2.4+ uses the ElasticSearch engine for indexing and catalog management.

To speed up ElasticSearch performance with bigger catalogs you can cache query results.

Open the vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php file and add the following around line 365:

<code class="php language-php">@@ <span class="token operator">-</span><span class="token number">365</span><span class="token punctuation">,</span><span class="token number">6</span> <span class="token operator">+</span><span class="token number">365</span><span class="token punctuation">,</span><span class="token number">9</span> @@ <span class="token keyword">class</span> <span class="token class-name">Connection</span> <span class="token keyword">implements</span> <span class="token class-name">ConnectionInterface</span>
   <span class="token variable">$params</span>
       <span class="token punctuation">)</span><span class="token punctuation">;</span>

   <span class="token operator">+</span>         <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$uri</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'search'</span><span class="token punctuation">)</span> <span class="token operator">!==</span> <span class="token constant boolean">FALSE</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
   <span class="token operator">+</span>         <span class="token variable">$params</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'request_cache'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'true'</span><span class="token punctuation">;</span>
   <span class="token operator">+</span>         <span class="token punctuation">}</span>
       <span class="token variable">$uri</span> <span class="token operator">.=</span> <span class="token string single-quoted-string">'?'</span> <span class="token operator">.</span> <span class="token function">http_build_query</span><span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token punctuation">}</span>
</code>

It will turn on the internal ElasticSearch query cache mechanism.

Conclusion

In this article, I’ve presented seven ways to speed up Magento 2 website:

  • use Varnish as full page cache
  • set up a cache warmer
  • defer JavaScript loading
  • convert all images to WebP
  • turn HTML minification on
  • compress and merge JS and CSS files
  • cache ElasticSearch Query Results

These steps will improve server response time and Core Web Vitals.

If you have any questions or comments, don’t hesitate to ask!

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button
WP Twitter Auto Publish Powered By : XYZScripts.com
SiteLock