Nach dem Update auf WP 7 RC 4 (der möglicherweise letzten Vorversion bevor WordPress 7 released wird) warf ich umgehend einen Blick auf den Site health check und wurde mit der Beanstandung Opcode cache is not enabled konfrontiert. Doch laut phpinfo(); war der OPCache aktiviert. Der Hoster ist All-inkl.com, das Paket „business“.

Heißt es nun OPcache oder Opcode cache?
Technisch ist damit dieselbe Erweiterung gemeint. Die Erweiterung OPCache speichert vorkompilierten PHP-Bytecode (Opcodes), damit PHP Dateien nicht bei jedem Request neu parsen muss.
WordPress 7 bringt einen neuen Site-Health-Check für den Opcode-Cache. Der prüft typischerweise mit opcache_get_status(). Bei meinem Hosting steht aber:
opcache.file_cache_only = OnSHM Cache: Disabled, File Cache: Enabled
In diesem Modus liefert opcache_get_status() oft false, obwohl OPcache läuft – nur über Dateien statt im RAM. WordPress 7 meldet deshalb „nicht aktiviert“, obwohl in phpinfo Opcode Caching: Up and Running steht.
Status bei mir ist also
- OPcache ist an (File-Cache).
- Ich bekam ein Falsch-positiv wegen der Prüfmethode.
- Handlungsbedarf grundsätzlich: keiner, es besteht kein Performance-Problem. Site Health erkennt den File-Cache-Modus des Hosters noch nicht korrekt.
Optionen
- Ignorieren – solange phpinfo „Up and Running“ zeigt, ist der Cache aktiv.
- Anderes Hosting – doch das wäre nur relevant, wenn du SHM willst; für WordPress reicht File-Cache meist.
- WP-Core – Bug/Enhancement ist bekannt (u. a. Trac #64707); künftige WP-Versionen sollen
opcache_get_configuration()bzw. File-Cache berücksichtigen. - Meldung ausblenden – per Filter
site_status_testsden OPcache-Test entfernen, wenn dich die Warnung stört (nur kosmetisch).
Wer keinen OPCache in seinem Hosting hat und auch nicht bekommen kann, sich dennoch an der Meldung stört, dieser Filter wird die Meldung ausblenden (beim Hostingwechsel nicht vergessen, sie bei der Prüfung zu entfernen).
add_filter('site_status_tests', function ($tests) {
unset($tests['direct']['opcode_cache']);
return $tests;
});Nachfolgendes Snippet überschreibt die WP-Prüfung. Doch voraussichtlich wird es nicht erforderlich sein, da an der Behebung der „Falschmeldung“ bereits gearbeitet wird (allerdings wurde sie bereits in der beta1 als fehlerhaft gemeldet, und besteht nach wie vor in der RC4…)
/**
* Checks whether OPcache is active (including file-cache-only hosting setups).
*
* WordPress 7 uses opcache_get_status(), which returns false when opcache.file_cache_only is On.
*
* @return bool
*/
function webentwicklerin_opcache_is_active()
{
if (!extension_loaded('Zend OPcache') && !extension_loaded('opcache')) {
return false;
}
if (function_exists('opcache_get_status')) {
$status = @opcache_get_status(false);
if (is_array($status) && !empty($status['opcache_enabled'])) {
return true;
}
}
if (!filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN)) {
return false;
}
if (filter_var(ini_get('opcache.file_cache_only'), FILTER_VALIDATE_BOOLEAN)) {
$file_cache = ini_get('opcache.file_cache');
return is_string($file_cache) && '' !== trim($file_cache);
}
return false;
}
/**
* Returns a human-readable OPcache status summary for Site Health.
*
* @return array{active:bool,mode:string,label:string,debug:string,file_cache?:string}
*/
function webentwicklerin_opcache_status_summary()
{
if (!webentwicklerin_opcache_is_active()) {
return array(
'active' => false,
'mode' => 'disabled',
'label' => __('Disabled', 'webentwicklerin-custom'),
'debug' => 'disabled',
);
}
if (filter_var(ini_get('opcache.file_cache_only'), FILTER_VALIDATE_BOOLEAN)) {
return array(
'active' => true,
'mode' => 'file',
'label' => __('Enabled (file cache)', 'webentwicklerin-custom'),
'debug' => 'file_cache_only',
'file_cache' => (string) ini_get('opcache.file_cache'),
);
}
return array(
'active' => true,
'mode' => 'shm',
'label' => __('Enabled (shared memory)', 'webentwicklerin-custom'),
'debug' => 'shm',
);
}
/**
* Site Health performance test: correct OPcache detection for file-cache-only hosts.
*
* @return array
*/
function webentwicklerin_site_health_opcode_cache_test()
{
$actions = sprintf(
'<p><a href="%1$s" target="_blank" rel="noopener">%2$s <span class="screen-reader-text">%3$s</span></a></p>',
esc_url('https://www.php.net/manual/en/book.opcache.php'),
esc_html__('Learn more about OPcache.', 'webentwicklerin-custom'),
esc_html__('(opens in a new tab)', 'webentwicklerin-custom')
);
if (webentwicklerin_opcache_is_active()) {
$summary = webentwicklerin_opcache_status_summary();
$description = __('Opcode cache improves PHP performance by storing precompiled script bytecode, reducing the need for PHP to load and parse scripts on each request.', 'webentwicklerin-custom');
if ('file' === $summary['mode'] && !empty($summary['file_cache'])) {
$description .= ' ' . sprintf(
/* translators: %s: OPcache file cache directory */
__('Your host uses file-based OPcache at %s (shared memory cache is disabled by the host).', 'webentwicklerin-custom'),
$summary['file_cache']
);
}
return array(
'label' => __('Opcode cache is enabled', 'webentwicklerin-custom'),
'status' => 'good',
'badge' => array(
'label' => __('Performance', 'webentwicklerin-custom'),
'color' => 'blue',
),
'description' => '<p>' . esc_html($description) . '</p>',
'actions' => $actions,
'test' => 'opcode_cache',
);
}
return array(
'label' => __('Opcode cache is not enabled', 'webentwicklerin-custom'),
'status' => 'recommended',
'badge' => array(
'label' => __('Performance', 'webentwicklerin-custom'),
'color' => 'blue',
),
'description' => '<p>' . esc_html__('Opcode cache improves PHP performance by storing precompiled script bytecode in memory, reducing the need for PHP to load and parse scripts on each request.', 'webentwicklerin-custom') . ' ' . esc_html__('Enabling this cache can significantly improve the performance of your site.', 'webentwicklerin-custom') . '</p>',
'actions' => $actions,
'test' => 'opcode_cache',
);
}
add_filter('site_status_tests', function ($tests) {
if (isset($tests['direct']['opcode_cache'])) {
$tests['direct']['opcode_cache']['test'] = 'webentwicklerin_site_health_opcode_cache_test';
}
return $tests;
});



Schreibe einen Kommentar