Ankerlink an den Anfang der Seite
802 4781
Foto von Gabriele Lässer
Generic filters
Filter by Kategorien

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“.

grafik

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 = On
  • SHM 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

  1. Ignorieren – solange phpinfo „Up and Running“ zeigt, ist der Cache aktiv.
  2. Anderes Hosting – doch das wäre nur relevant, wenn du SHM willst; für WordPress reicht File-Cache meist.
  3. WP-Core – Bug/Enhancement ist bekannt (u. a. Trac #64707); künftige WP-Versionen sollen opcache_get_configuration() bzw. File-Cache berücksichtigen.
  4. Meldung ausblenden – per Filter site_status_tests den 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

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Hinweis: Name und E-Mail-Adresse (beides optional, da alle Kommentare moderiert werden) werden dauerhaft gespeichert. Über dieses Formular kann jeder Zeit die Löschung persönlicher Daten oder Kommentare angefordert werden; die Anfrage wird nicht veröffentlicht und nach der Bearbeitung gelöscht. IP-Adressen, die mit Kommentaren gespeichert werden, werden nach zwei Monaten automatisch gelöscht.

Ihre Nachricht wird möglicherweise zur Spam-Prüfung an OpenAI (USA) weitergeleitet. Weitere Informationen finden Sie in unserer Datenschutzerklärung.