OPcache
The standard OPcache extension is strongly recommended; since Moodle 2.6, it is the only solution officially supported by PHP developers. The benefits are increased performance and significantly lower memory usage. However, opcode caching extensions (including OPcache, eAccelerator and APC) aren't compatible with servers configured to use some common types of high-security PHP handlers such as suPHP (the default on WHM / cPanel Linux servers).
Installation
The OPcache extension is distributed as part of PHP 5.5 and later. It is available also for older stable PHP releases from PECL under the original name ZendOPcache. To check if the extension is loaded and enabled look at the PHP info page under the Zend OPcache heading.
Linux, macOS and other Unix-like platforms
You may need to install a specific package, e.g. on CentOS, Fedora or Red Hat: dnf install php-opcache. If necessary add the following to php.ini (package installers may do this automatically):
zend_extension=/full/path/to/opcache.so
Microsoft Windows
The extension php_opcache.dll is included in the ext folder in the PHP for Windows binary downloads. To enable it add the following to php.ini:
zend_extension=php_opcache.dll
Configuration
php.ini settings (PHP v5.0):
[opcache]
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
; Required for Moodle
opcache.use_cwd = 1
opcache.validate_timestamps = 1
opcache.save_comments = 1
opcache.enable_file_override = 0
; If something does not work in Moodle
;opcache.revalidate_path = 1 ; May fix problems with include paths
;opcache.mmap_base = 0x20000000 ; (Windows only) fix OPcache crashes with event id 487
; Experimental for Moodle 2.6 and later
;opcache.fast_shutdown = 1
;opcache.enable_cli = 1 ; Speeds up CLI cron
;opcache.load_comments = 0 ; May lower memory use, might not be compatible with add-ons and other apps.
It's worth noting that in PHP v8.0 and above, many of these Opcache parameters have been updated (with some parameters being deprecated) and the defaults are now largely sufficient - you'll notice that memory_consumption, max_accelerated_files, use_cwd, validate_timestamps & enable_file_override default to the suggested values above. For PHP v8.0, the default configuration looks like the following:
[opcache]
; Determines if Zend OPCache is enabled
;opcache.enable=1
; Determines if Zend OPCache is enabled for the CLI version of PHP
;opcache.enable_cli=0
; The OPcache shared memory storage size.
;opcache.memory_consumption=128
; The maximum number of keys (scripts) in the OPcache hash table.
; Only numbers between 200 and 1000000 are allowed.
;opcache.max_accelerated_files=10000
; When this directive is enabled, the OPcache appends the current working
; directory to the script key, thus eliminating possible collisions between
; files with the same name (basename). Disabling the directive improves
; performance, but may break existing applications.
;opcache.use_cwd=1
; When disabled, you must reset the OPcache manually or restart the
; webserver for changes to the filesystem to take effect.
;opcache.validate_timestamps=1
; How often (in seconds) to check file timestamps for changes to the shared
; memory storage allocation. ("1" means validate once per second, but only
; once per request. "0" means always validate)
;opcache.revalidate_freq=2
; Enables or disables file search in include_path optimization
;opcache.revalidate_path=0
; Allow file existence override (file_exists, etc.) performance feature.
;opcache.enable_file_override=0
Things that you'd consider changing in PHP v8.0 and above to match the original script are:
- revalidate_freq (defaults to 2, 60 was the previously recommended value)
- enable_cli (defaults to 0, 1 was previously recommended)
Personally after the last update to Moodle 4.3 (running PHP 8.2 on our server), I opted to simply leave the defaults running for testing - as far as we can tell, we haven't seen a performance hit, though it's worth noting the installation I manage/work with is only ~100 users, compared with the multiple thousands other Moodle installations contend with - so it's really a case of see what best suits your Organization. Fortunately the two options above are relatively simple :)
Below are a couple of descriptions for two of the above parameters:
- memory_consumption
From: PHP's OPCache extension review
- The size of the memory segment can be told using the opcache.memory_consumption INI setting (Megabytes). Size it big, don't hesitate to give space. Never ever run out of shared memory space, if you do, you will lock your processes, we'll get back to that later.
- Size the shared memory segment according to your needs, don't forget that a production server dedicated to PHP processes may bundle several dozens of Gigabytes of memory, just for PHP. Having a 1Gb shared memory segment (or more) is not uncommon, it will depend on your needs, but if you use a modern application stack, aka framework based, with lots of dependencies etc... , then use at least 1Gb of shared memory.
Having that in mind, set opcache.memory_consumption to a value high enough to avoid filling it up (as long as your RAM usage allows you to), and then monitor the OPCache to adjust that value to its optimal size. As the total size of the PHP files in a standard Moodle 4.3 is around 111MB, setting this value higher than that can be a good idea. Take into account that the PHP files of the plugins and those on the MoodleData folder (language pack files...) also count, so these values can be different on each installation. If you have several instances of Moodle you should multiply that value by the number of instances.
Tip: If using Linux, you can know the total size of the PHP files of a folder using this command:
find ./ -type f -name "*.php" -printf "%s\n" | gawk -M '{t+=$1}END{print t}' | numfmt --to=iec
- max_accelerated_files
From: php.net max-accelerated-files
- The maximum number of keys (and therefore scripts) in the OPcache hash table. The actual value used will be the first number in the set of prime numbers { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987, 262237, 524521, 1048793 } that is greater than or equal to the configured value. The minimum value is 200. The maximum value is 1000000. Values outside of this range are clamped to the permissible range.
As Moodle 4.3 contains more than 13.700 php files it is recommended above that opcache.max_accelerated_files should be set to 14000 to accommodate this (16229 will actually be used as per the explanation above). If you have several instances of Moodle you should multiply that value by the number of instances.
If many additional plugins are installed so that your total PHP files exceed 16229 then the next most suitable value for max_accelerated_files should be used.
Tip: If using Linux, you can know the total PHP files of your Moodle using this command:
find ./ -type f | grep -E ".*\.php$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort | uniq -c | sort -n
Opcache management plugin
You may consider installing the additional Opcache management - Moodle plugin which adds a PHP Opcache management GUI to Moodle site administration, a CLI tool to reset PHP Opcache and a Nagios check for PHP Opcache.
See also
Forum discussions: