Skip to content

Commit c0145eb

Browse files
committed
Site Health: Add test and debug data for Opcode Cache.
Developed in WordPress#9260 Props rollybueno, westonruter, swissspidy, peterwilsoncc, szepeviktor, ozgursar, oglekler, johnbillion, ugyensupport, abcd95, shailu25, noruzzaman. Fixes #63697. git-svn-id: https://develop.svn.wordpress.org/trunk@61612 602fd350-edb4-49c9-b593-d223f7449a82
1 parent 81885a9 commit c0145eb

3 files changed

Lines changed: 192 additions & 6 deletions

File tree

src/wp-admin/includes/class-wp-debug-data.php

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,83 @@ private static function get_wp_server(): array {
471471
'debug' => $imagick_loaded,
472472
);
473473

474+
// Opcode Cache.
475+
if ( function_exists( 'opcache_get_status' ) ) {
476+
$opcache_status = @opcache_get_status( false ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged -- Warning emitted in failure case.
477+
478+
if ( false === $opcache_status ) {
479+
$fields['opcode_cache'] = array(
480+
'label' => __( 'Opcode cache' ),
481+
'value' => __( 'Disabled by configuration' ),
482+
'debug' => 'not available',
483+
);
484+
} else {
485+
$fields['opcode_cache'] = array(
486+
'label' => __( 'Opcode cache' ),
487+
'value' => $opcache_status['opcache_enabled'] ? __( 'Enabled' ) : __( 'Disabled' ),
488+
'debug' => $opcache_status['opcache_enabled'],
489+
);
490+
491+
if ( true === $opcache_status['opcache_enabled'] ) {
492+
$fields['opcode_cache_memory_usage'] = array(
493+
'label' => __( 'Opcode cache memory usage' ),
494+
'value' => sprintf(
495+
/* translators: 1: Used memory, 2: Total memory */
496+
__( '%1$s of %2$s' ),
497+
size_format( $opcache_status['memory_usage']['used_memory'] ),
498+
size_format( $opcache_status['memory_usage']['free_memory'] + $opcache_status['memory_usage']['used_memory'] )
499+
),
500+
'debug' => sprintf(
501+
'%s of %s',
502+
$opcache_status['memory_usage']['used_memory'],
503+
$opcache_status['memory_usage']['free_memory'] + $opcache_status['memory_usage']['used_memory']
504+
),
505+
);
506+
507+
if ( 0 !== $opcache_status['interned_strings_usage']['buffer_size'] ) {
508+
$fields['opcode_cache_interned_strings_usage'] = array(
509+
'label' => __( 'Opcode cache interned strings usage' ),
510+
'value' => sprintf(
511+
/* translators: 1: Percentage used, 2: Total memory, 3: Free memory */
512+
__( '%1$s%% of %2$s (%3$s free)' ),
513+
number_format_i18n( ( $opcache_status['interned_strings_usage']['used_memory'] / $opcache_status['interned_strings_usage']['buffer_size'] ) * 100, 2 ),
514+
size_format( $opcache_status['interned_strings_usage']['buffer_size'] ),
515+
size_format( $opcache_status['interned_strings_usage']['free_memory'] )
516+
),
517+
'debug' => sprintf(
518+
'%s%% of %s (%s free)',
519+
round( ( $opcache_status['interned_strings_usage']['used_memory'] / $opcache_status['interned_strings_usage']['buffer_size'] ) * 100, 2 ),
520+
$opcache_status['interned_strings_usage']['buffer_size'],
521+
$opcache_status['interned_strings_usage']['free_memory']
522+
),
523+
);
524+
}
525+
526+
$fields['opcode_cache_hit_rate'] = array(
527+
'label' => __( 'Opcode cache hit rate' ),
528+
'value' => sprintf(
529+
/* translators: %s: Hit rate percentage */
530+
__( '%s%%' ),
531+
number_format_i18n( $opcache_status['opcache_statistics']['opcache_hit_rate'], 2 )
532+
),
533+
'debug' => round( $opcache_status['opcache_statistics']['opcache_hit_rate'], 2 ),
534+
);
535+
536+
$fields['opcode_cache_full'] = array(
537+
'label' => __( 'Is the Opcode cache full?' ),
538+
'value' => $opcache_status['cache_full'] ? __( 'Yes' ) : __( 'No' ),
539+
'debug' => $opcache_status['cache_full'],
540+
);
541+
}
542+
}
543+
} else {
544+
$fields['opcode_cache'] = array(
545+
'label' => __( 'Opcode cache' ),
546+
'value' => __( 'Disabled' ),
547+
'debug' => 'not available',
548+
);
549+
}
550+
474551
// Pretty permalinks.
475552
$pretty_permalinks_supported = got_url_rewrite();
476553

src/wp-admin/includes/class-wp-site-health.php

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2755,6 +2755,52 @@ public function get_test_search_engine_visibility() {
27552755
return $result;
27562756
}
27572757

2758+
/**
2759+
* Tests if opcode cache is enabled and available.
2760+
*
2761+
* @since 7.0.0
2762+
*
2763+
* @return array<string, string|array<string, string>> The test result.
2764+
*/
2765+
public function get_test_opcode_cache(): array {
2766+
$opcode_cache_enabled = false;
2767+
if ( function_exists( 'opcache_get_status' ) ) {
2768+
$status = @opcache_get_status( false ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged -- Warning emitted in failure case.
2769+
if ( $status && true === $status['opcache_enabled'] ) {
2770+
$opcode_cache_enabled = true;
2771+
}
2772+
}
2773+
2774+
$result = array(
2775+
'label' => __( 'Opcode cache is enabled' ),
2776+
'status' => 'good',
2777+
'badge' => array(
2778+
'label' => __( 'Performance' ),
2779+
'color' => 'blue',
2780+
),
2781+
'description' => sprintf(
2782+
'<p>%s</p>',
2783+
__( '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.' )
2784+
),
2785+
'actions' => sprintf(
2786+
'<p><a href="%s" target="_blank">%s<span class="screen-reader-text"> %s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>',
2787+
esc_url( 'https://www.php.net/manual/en/book.opcache.php' ),
2788+
__( 'Learn more about OPcache.' ),
2789+
/* translators: Hidden accessibility text. */
2790+
__( '(opens in a new tab)' )
2791+
),
2792+
'test' => 'opcode_cache',
2793+
);
2794+
2795+
if ( ! $opcode_cache_enabled ) {
2796+
$result['status'] = 'recommended';
2797+
$result['label'] = __( 'Opcode cache is not enabled' );
2798+
$result['description'] .= '<p>' . __( 'Enabling this cache can significantly improve the performance of your site.' ) . '</p>';
2799+
}
2800+
2801+
return $result;
2802+
}
2803+
27582804
/**
27592805
* Returns a set of tests that belong to the site status page.
27602806
*
@@ -2847,6 +2893,10 @@ public static function get_tests() {
28472893
'label' => __( 'Search Engine Visibility' ),
28482894
'test' => 'search_engine_visibility',
28492895
),
2896+
'opcode_cache' => array(
2897+
'label' => __( 'Opcode cache' ),
2898+
'test' => 'opcode_cache',
2899+
),
28502900
),
28512901
'async' => array(
28522902
'dotorg_communication' => array(
@@ -3415,14 +3465,14 @@ public function get_page_cache_headers() {
34153465
'x-srcache-fetch-status' => $cache_hit_callback,
34163466

34173467
// Generic caching proxies (Nginx, Varnish, etc.)
3418-
'x-cache' => $cache_hit_callback,
3419-
'x-cache-status' => $cache_hit_callback,
3420-
'x-litespeed-cache' => $cache_hit_callback,
3421-
'x-proxy-cache' => $cache_hit_callback,
3422-
'via' => '',
3468+
'x-cache' => $cache_hit_callback,
3469+
'x-cache-status' => $cache_hit_callback,
3470+
'x-litespeed-cache' => $cache_hit_callback,
3471+
'x-proxy-cache' => $cache_hit_callback,
3472+
'via' => '',
34233473

34243474
// Cloudflare
3425-
'cf-cache-status' => $cache_hit_callback,
3475+
'cf-cache-status' => $cache_hit_callback,
34263476
);
34273477

34283478
/**

tests/phpunit/tests/admin/wpSiteHealth.php

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,4 +572,63 @@ public static function set_autoloaded_option( $bytes = 800000 ) {
572572
// Force autoloading so that WordPress core does not override it. See https://core.trac.wordpress.org/changeset/57920.
573573
add_option( 'test_set_autoloaded_option', $heavy_option_string, '', true );
574574
}
575+
576+
/**
577+
* Tests get_test_opcode_cache() return structure.
578+
*
579+
* @ticket 63697
580+
*
581+
* @covers ::get_test_opcode_cache()
582+
*/
583+
public function test_get_test_opcode_cache_return_structure() {
584+
$result = $this->instance->get_test_opcode_cache();
585+
586+
$this->assertIsArray( $result );
587+
$this->assertArrayHasKey( 'label', $result );
588+
$this->assertArrayHasKey( 'status', $result );
589+
$this->assertArrayHasKey( 'badge', $result );
590+
$this->assertArrayHasKey( 'description', $result );
591+
$this->assertArrayHasKey( 'actions', $result );
592+
$this->assertArrayHasKey( 'test', $result );
593+
594+
$this->assertSame( 'opcode_cache', $result['test'] );
595+
$this->assertSame(
596+
array(
597+
'label' => __( 'Performance' ),
598+
'color' => 'blue',
599+
),
600+
$result['badge']
601+
);
602+
$this->assertContains( $result['status'], array( 'good', 'recommended' ), 'Status must be good or recommended.' );
603+
}
604+
605+
/**
606+
* Tests get_test_opcode_cache() result when opcode cache is enabled or not.
607+
*
608+
* Covers: opcache enabled, disabled, not available, and opcache_get_status() returns false.
609+
*
610+
* @ticket 63697
611+
*
612+
* @covers ::get_test_opcode_cache()
613+
*/
614+
public function test_get_test_opcode_cache_result_by_environment() {
615+
$result = $this->instance->get_test_opcode_cache();
616+
617+
$opcache_enabled = false;
618+
if ( function_exists( 'opcache_get_status' ) ) {
619+
$status = @opcache_get_status( false ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged -- Warning emitted in failure case.
620+
if ( $status && true === $status['opcache_enabled'] ) {
621+
$opcache_enabled = true;
622+
}
623+
}
624+
625+
if ( $opcache_enabled ) {
626+
$this->assertSame( 'good', $result['status'], 'When opcache is enabled, status should be "good".' );
627+
$this->assertSame( __( 'Opcode cache is enabled' ), $result['label'] );
628+
} else {
629+
$this->assertSame( 'recommended', $result['status'] );
630+
$this->assertSame( __( 'Opcode cache is not enabled' ), $result['label'] );
631+
$this->assertStringContainsString( __( 'Enabling this cache can significantly improve the performance of your site.' ), $result['description'] );
632+
}
633+
}
575634
}

0 commit comments

Comments
 (0)