Introduction: Memcached & Improved Web Server Speeds
This Tutorial will show how to improve Drupal 8 performance on shared hosting using the Memcached framework on PHP 7 & third-party contributed modules. Memcached is used to keep frequently accessed MySQL database values in RAM on a web server.
The performance gains for Drupal 8 websites running Memcached will depend on the amount of web traffic, the configuration of the website, & the amount of available RAM.
Step One: Install Memcached on the Web Server
To begin, determine whether the project is running on shared Linux hosting with cPanel or alternatively a VPS or dedicated server with custom configuration. If the Drupal 8 runs on shared web hosting, the administrator will not be able to install PHP packages with Sudo.
Most cPanel web hosting companies have Memcached installed & enabled by default on their web servers. Admins need to login to cPanel & manage the PHP settings.
For web hosts that permit the selection of PHP version in cPanel, choose the latest version (7.x). Make sure that both the memcache & memcached extensions are enabled & save the settings. Note: This applies to CentOS, RHEL, & CloudLinux.
Some web hosting companies, like SiteGround, have transitioned away from allowing shared account users to manage these settings in cPanel due to security & inefficiency.
In SiteGround SuperCacher:
Navigate to the Memcached tab & enable the service on the hosting plan. After saving the settings, the values are provided for the IP Address & Memcached port number.
Note: The port settings will be required to enable Memcached to work correctly in Drupal 8. If not provided, contact your host for the IP Address & Memcached port.
Otherwise, if you are configuring a VPS or dedicated server, Memcached can be installed using Sudo commands:
sudo apt-get update sudo apt install memcached sudo apt install php-memcached
After installing Memcached, restart the Apache web server extensions:
service memcached restart service php7.0-fpm restart
This completes the installation on VPS or dedicated web servers running CentOS, RHEL, Ubuntu, Fedora, Gentoo, SUSE, Slackware, etc. for LAMP Stack configuration.
Step Two: Install the Memcache Module for Drupal 8
Next it is required to install the Memcache module for Drupal 8 which provides an API that integrates with PECL memcache & the memcached libraries in PHP 5.x/7.x.
Required Files - Download:
- Memcache Module: (Download Files)
The Memcache module provides backends for Caching (memcache.inc) & Locking (memcache-lock.inc) including a Drupal 8 administration section for browser access.
To Install: Navigate to /admin/modules/install & upload the module. Enable Memcache & Memcache Admin modules & save the settings.
If your web server does not have PECL Memcache installed by default, run:
sudo pecl install memcache
Navigate to: /admin/config/system/memcache where the values for manual settings can be configured to view debugging information & statistics on each page:
Leave this setting unchecked unless required by systems testing or debugging code.
Step Three: Installing with Drush & Drush Commands
Drush can also be used to install the Memcache module on Drupal 8 using CLI. With this installation, admins will be able to flush the Memcache storage using Drush.
drush en memcache
After installing Memcache, rebuild the Drush cache:
drush cc drush
After clearing the Drush cache, two new drush commands are available:
memcache-flush (mcf) Flush all Memcached objects in a bin. memcache-stats (mcs) Retrieve statisticsfrom Memcached.
For more information about these commands, use the “drush help” command:
drush help mcf drush help mcs
If Memcache support moves to Drupal core in the future, like APC, these commands will become part of the default Drush toolset, enabling admins to clear cache via CLI.
Step Four: Advanced Configuration Options
In order to complete the installation of Memcached support, code changes to the Drupal 8 settings.php file & the Apache php.ini file must be made by an administrator.
For Drupal 8 open the settings.php file at: sites/default & add the lines:
$settings['memcache']['servers'] = ['127.0.0.1:11211' => 'default']; $settings['memcache']['bins'] = ['default' => 'default']; $settings['memcache']['key_prefix'] = ''; $settings['cache']['default'] = 'cache.backend.memcache'; $settings['cache']['bins']['render'] = 'cache.backend.memcache';
Note: If using SiteGround or another cPanel web hosting plan, locate the port number for Memcached on your web server & use it to replace the “11211” port value above.
For websites running Memcached with multiple servers in clusters, add the following additional code to the settings.php file with the routing information.
Multiple Memcache Backends:
$settings['memcache']['servers'] = [ '127.0.0.1:11211' => 'default', // Default host and port '127.0.0.1:11212' => 'default', // Default host with port 11212 '127.0.0.2:11211' => 'default', // Default port, different IP 'server1.com:11211' => 'default', // Default port with hostname 'unix:///path/to/socket' => 'default', 'Unix socket' ];
Multiple Servers, Bins and Clusters:
$settings['memcache'] = [ 'servers' = [ 'server1:port' => 'default', 'server2:port' => 'default', 'server3:port' => 'cluster1', 'serverN:port' => 'clusterN', 'unix:///path/to/socket' => 'clusterS', ], 'bins' => [ 'default' => 'default', 'bin1' => 'cluster1', 'binN' => 'clusterN', 'binX' => 'cluster1', 'binS' => 'clusterS', ], ];
This will complete the Memcached installation on Drupal 8 unless more advanced configuration of the cache is required. Test the settings in administration for errors.
Step Five: Lock, Key Hash Algo, & Memcache Prefix Options
There are additional settings that can be used to configure Memcached for high traffic websites or where web server resources are being constrained for CPU performance.
To Add a Memcache Prefix:
In order for multiple Drupal 8 installations to share Memcached server resources,
create a unique prefix for each installation in the memcache config in settings.php:
$settings['memcache']['key_prefix'] = 'something_unique';
To Add a Key Hash Algorithm:
$settings['memcache']['key_hash_algorithm'] = 'sha1';
Memcache locks need to be enabled through the services.yml file. Add the following code to replaces the default lock backend with a memcache implementation:
lock: class: DrupalCoreLockLockBackendInterface factory: memcache.lock.factory:get
Some Drupal 8 admins recommend turning stampede protection for Memcached off to avoid potential time-out errors in request queues, which can be used for debugging.
Conclusion: Memcached & Drupal 8 Server Performance
High traffic social networks & e-commerce communities cannot manage web traffic without making use of Memcached for MySQL database queries, variables, & stores.