Advanced OPcache monitoring and control GUI for Magento 2, implemented with React for a responsive and modern experience (https://github.com/amnuts/opcache-gui).
 
- Real-time OPcache Monitoring: View memory usage, hit/miss ratio, and cached scripts
- Performance Metrics: Track OPcache efficiency and PHP performance
- Cache Control: Reset cache, invalidate files, or force file refresh
- Configuration Viewer: Examine your current OPcache configuration
- React-based Interface: Modern, responsive UI built with React
- Script Analysis: Identify which files consume the most cache memory
composer require amadeco/module-opcache-gui
bin/magento module:enable Amadeco_OpcacheGui
bin/magento setup:upgrade --keep-generated
bin/magento cache:cleanThis extension uses CDN-hosted React components and doesn't require static content generation, allowing installation with the
--keep-generatedflag.
- Download or clone the repository
- Copy the files to app/code/Amadeco/OpcacheGui/
- Run the following commands:
bin/magento module:enable Amadeco_OpcacheGui
bin/magento setup:upgrade --keep-generated
bin/magento cache:cleanNavigate to System → React → PHP OpCache Dashboard in your Magento Admin Panel.
opcache.enable = 1
opcache.enable_cli = 0
opcache.memory_consumption = 1024
opcache.interned_strings_buffer = 128
opcache.max_accelerated_files = 60000
;
; Production Mode
;
opcache.validate_timestamps = 0
;
; Development Mode
;
;opcache.validate_timestamps = 1
;opcache.revalidate_freq = 10
;
opcache.save_comments = 1
opcache.enable_file_override = 0# Calculate the exact number of PHP files in your Magento codebase
find . -type f -print | grep php | wc -lSet opcache.max_accelerated_files to this number plus a 25% margin, rounded to the nearest higher prime number for optimal hash table performance.
For Magento 2, selective preloading is vastly more efficient than preloading all files:
// Example preload.php for Magento 2
function preload($path) {
    static $loaded = 0;
    if ($loaded >= 500) return;
    
    if (is_file($path) && preg_match("/\.php$/", $path)) {
        opcache_compile_file($path);
        $loaded++;
    }
}
// Only preload essential core files
preload(__DIR__ . '/vendor/magento/framework/App/Bootstrap.php');
preload(__DIR__ . '/vendor/magento/framework/App/Http.php');
// Additional critical files...References:
JIT compilation causes segfaults with Magento 2 and provides minimal performance gains:
; Disable JIT for Magento 2
opcache.jit_buffer_size = 0
opcache.jit = offReference: Magento 2 PHP 8.2 JIT Performance Analysis
Create an opcache.blacklist file to exclude test directories and rarely-used files:
/home/USER/public_html/vendor/*/Test/*
/home/USER/public_html/vendor/*/tests/*
/home/USER/public_html/dev/*
/home/USER/public_html/setup/*
Then reference it in your php.ini or pool configuration:
opcache.blacklist_filename = /path/to/opcache.blacklistFor optimal performance, maintain distinct OPcache configurations for CLI and web processes:
CLI Configuration (/etc/php/8.x/cli/php.ini):
;
; OpCache Config
;
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 512
opcache.interned_strings_buffer = 32
opcache.max_accelerated_files = 30000
opcache.max_wasted_percentage = 5
opcache.use_cwd = 1
;
; Magento mode Production
;
;opcache.validate_timestamps = 0
;
; Magento mode Developpement
;
opcache.validate_timestamps = 1
;opcache.revalidate_freq = 10
opcache.file_update_protection = 0
opcache.revalidate_path = 0
opcache.save_comments = 1
opcache.load_comments = 1
opcache.enable_file_override = 0
opcache.optimization_level = 0xffffffff
opcache.blacklist_filename = "/home/**USER**/opcache.blacklist"
opcache.max_file_size = 0
opcache.consistency_checks = 0
opcache.force_restart_timeout = 60
opcache.error_log = "/var/log/php-fpm/opcache.log"
;opcache.log_verbosity_level = 1
opcache.log_verbosity_level = 3
opcache.preferred_memory_model = ""
opcache.protect_memory = 0
;
;
;
opcache.file_cache = "/tmp/"
opcache.file_cache_only = 1
opcache.file_cache_consistency_checks = 1
opcache.huge_code_pages = 1
;
; Support for PHP >7.4 Preload Feature #98
;
; Issue : https://github.com/magento/community-features/issues/98#issuecomment-481635316
; Magento 2 simple preload : https://github.com/MonogoPolska/monogo-m2-preload
;
; Doesn't work in CLI with config opcache.file_cache_only = 1
;
;opcache.preload = "/home/**USER**/public_html/preload.php"
;opcache.preload_user = **PHP-USER**
;
; JIT Just In Time Compilation
;
;opcache.jit = 1235
;opcache.jit_buffer_size = 536870912
opcache.jit = off
opcache.jit_buffer_size = 0Web Processes Configuration (/etc/php/8.x/fpm/php.ini):
;
; OpCache Config
; 
opcache.enable = 1
opcache.enable_cli = 0
opcache.use_cwd = 1
opcache.validate_root = 1
opcache.revalidate_path = 0
;
; Magento mode Production
;
opcache.validate_timestamps = 0
; 
; Magento mode Developpement
;
;opcache.validate_timestamps = 1
;opcache.revalidate_freq = 10
opcache.save_comments = 1
opcache.enable_file_override = 0
opcache.consistency_checks = 0
opcache.protect_memory = 0
opcache.memory_consumption = 1024
opcache.interned_strings_buffer = 256
;
; Quickly calculate the number of files in our codebase.
; find . -type f -print | grep php | wc -l
;
opcache.max_accelerated_files = 120000
opcache.max_wasted_percentage = 15
opcache.file_update_protection = 2
opcache.optimization_level = 0xffffffff
;opcache.blacklist_filename = "/home/**USER**/opcache.blacklist"
opcache.max_file_size = 0
opcache.force_restart_timeout = 60
opcache.error_log = "/home/**USER**/public_html/var/log/opcache.log"
opcache.log_verbosity_level = 2
opcache.preferred_memory_model = ""
opcache.huge_code_pages = 1Key Differences Explained:
| Setting | CLI | Web | Reason | 
|---|---|---|---|
| memory_consumption | 512MB | 1024MB | CLI needs less memory since it handles one command at a time | 
| interned_strings_buffer | 32MB | 256MB | Web processes handle more unique strings from templates | 
| validate_timestamps | On | Off | CLI tools need to see file changes immediately | 
| file_cache_only | On | Off | CLI benefits from file-based cache for persistence | 
| max_accelerated_files | 30000 | 120000 | CLI uses fewer files than web processes | 
| log_verbosity_level | 3 | 2 | More detailed logging helps with CLI debugging | 
Split your PHP-FPM configuration into separate pools for frontend and admin:
# /etc/php/8.1/fpm/pool.d/magento-frontend.conf
[magento-frontend]
user = www-data
listen = /var/run/php-fpm-magento-frontend.sock
pm = dynamic
pm.max_children = 120
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 35
# /etc/php/8.1/fpm/pool.d/magento-admin.conf
[magento-admin]
user = www-data
listen = /var/run/php-fpm-magento-admin.sock
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10Then configure NGINX to route requests accordingly:
# Frontend requests
location ~ ^/(pub|static|media)/.*\.php$ {
    fastcgi_pass unix:/var/run/php-fpm-magento-frontend.sock;
    # Additional FastCGI settings...
}
# Admin requests
location ~ ^/admin {
    fastcgi_pass unix:/var/run/php-fpm-magento-admin.sock;
    # Additional FastCGI settings...
}Benefits:
- Better resource allocation based on specific needs
- Isolation of admin processes from customer-facing frontend
- Prevents admin-intensive tasks from impacting storefront performance
- More efficient OPcache utilization for each context
OPcache memory settings must be configured in php.ini rather than in PHP-FPM pool configuration files:
- 
Initialization Order: OPcache initializes early in PHP's startup process, before pool configurations are processed 
- 
Shared Memory Allocation: Settings like memory_consumptiondefine system-level allocations that must be consistent across PHP-FPM pools
- 
Global vs. Pool-specific Settings: Some directives only work when set globally in php.ini 
- Based on Genaker/Magento2OPcacheGUI
- Integrates with amnuts/opcache-gui
- Enhanced by Amadeco