'error', 'message' => 'This script must be run from CLI']); exit(1); } // Check for different output modes $mode = isset($argv[1]) ? $argv[1] : 'full'; // Check PHP version and path (only if not simple mode) if ($mode !== '--simple') { echo "PHP Version: " . PHP_VERSION . "\n"; echo "PHP Binary: " . PHP_BINARY . "\n"; echo "PHP SAPI: " . php_sapi_name() . "\n"; } // Check if OPCache is installed if (!function_exists('opcache_get_status')) { if ($mode === '--simple') { echo "OPcache status: Disabled - OPcache is not installed"; } else { echo json_encode(['status' => 'error', 'message' => 'OPCache is not installed']); } exit(1); } // Get OPCache configuration first $config = opcache_get_configuration(); if ($config === false) { if ($mode === '--simple') { echo "OPcache status: Error - Failed to get OPcache configuration"; } else { echo json_encode(['status' => 'error', 'message' => 'Failed to get OPCache configuration']); } exit(1); } // Check if OPcache is enabled in configuration $opcache_enabled = $config['directives']['opcache.enable']; // Get OPCache status only if it's enabled $status = null; if ($opcache_enabled) { $status = opcache_get_status(false); if ($status === false) { if ($mode === '--simple') { echo "OPcache status: Error - Failed to get OPcache status"; } else { echo json_encode(['status' => 'error', 'message' => 'Failed to get OPCache status']); } exit(1); } } // Handle different output modes switch ($mode) { case '--simple': if ($opcache_enabled) { echo "OPcache status: Enabled"; } else { echo "OPcache status: Disabled"; } exit(0); case '--summary': // Summary: Basic info + memory usage + key stats if (!$opcache_enabled) { $response = [ 'status' => 'success', 'summary' => [ 'enabled' => false, 'message' => 'OPcache is disabled. No runtime data available.' ] ]; } else { $response = [ 'status' => 'success', 'summary' => [ 'enabled' => true, 'memory_usage' => [ 'used_mb' => round($status['memory_usage']['used_memory'] / 1024 / 1024, 2), 'free_mb' => round($status['memory_usage']['free_memory'] / 1024 / 1024, 2), 'wasted_mb' => round($status['memory_usage']['wasted_memory'] / 1024 / 1024, 2), 'total_mb' => round(($status['memory_usage']['used_memory'] + $status['memory_usage']['free_memory']) / 1024 / 1024, 2), 'wasted_percentage' => $status['memory_usage']['current_wasted_percentage'] ], 'cached_scripts' => $status['opcache_statistics']['num_cached_scripts'], 'hit_rate' => round($status['opcache_statistics']['opcache_hit_rate'], 2) . '%', 'interned_strings' => [ 'count' => $status['interned_strings_usage']['number_of_strings'], 'used_mb' => round($status['interned_strings_usage']['used_memory'] / 1024 / 1024, 2), 'buffer_mb' => round($status['interned_strings_usage']['buffer_size'] / 1024 / 1024, 2) ] ] ]; } echo json_encode($response, JSON_PRETTY_PRINT); break; case '--statistics': // Statistics: Detailed performance metrics if (!$opcache_enabled) { $response = [ 'status' => 'success', 'statistics' => [ 'enabled' => false, 'message' => 'OPcache is disabled. No statistics available.' ] ]; } else { $response = [ 'status' => 'success', 'statistics' => [ 'enabled' => true, 'cache_performance' => [ 'hits' => $status['opcache_statistics']['hits'], 'misses' => $status['opcache_statistics']['misses'], 'hit_rate' => round($status['opcache_statistics']['opcache_hit_rate'], 2) . '%', 'blacklist_misses' => $status['opcache_statistics']['blacklist_misses'], 'blacklist_miss_ratio' => $status['opcache_statistics']['blacklist_miss_ratio'] ], 'cache_usage' => [ 'cached_scripts' => $status['opcache_statistics']['num_cached_scripts'], 'cached_keys' => $status['opcache_statistics']['num_cached_keys'], 'max_cached_keys' => $status['opcache_statistics']['max_cached_keys'], 'key_usage_percentage' => round(($status['opcache_statistics']['num_cached_keys'] / $status['opcache_statistics']['max_cached_keys']) * 100, 2) . '%' ], 'memory_details' => [ 'used_memory' => $status['memory_usage']['used_memory'], 'free_memory' => $status['memory_usage']['free_memory'], 'wasted_memory' => $status['memory_usage']['wasted_memory'], 'current_wasted_percentage' => $status['memory_usage']['current_wasted_percentage'] ], 'restart_info' => [ 'restart_pending' => $status['restart_pending'] ?? false, 'restart_in_progress' => $status['restart_in_progress'] ?? false ] ] ]; } echo json_encode($response, JSON_PRETTY_PRINT); break; case '--settings': // Settings: Configuration directives only (always available) $response = [ 'status' => 'success', 'settings' => [ 'core_settings' => [ 'opcache.enable' => $config['directives']['opcache.enable'], 'opcache.enable_cli' => $config['directives']['opcache.enable_cli'], 'opcache.memory_consumption' => $config['directives']['opcache.memory_consumption'], 'opcache.interned_strings_buffer' => $config['directives']['opcache.interned_strings_buffer'], 'opcache.max_accelerated_files' => $config['directives']['opcache.max_accelerated_files'], 'opcache.revalidate_freq' => $config['directives']['opcache.revalidate_freq'] ], 'performance_settings' => [ 'opcache.validate_timestamps' => $config['directives']['opcache.validate_timestamps'], 'opcache.max_wasted_percentage' => $config['directives']['opcache.max_wasted_percentage'], 'opcache.force_restart_timeout' => $config['directives']['opcache.force_restart_timeout'], 'opcache.optimization_level' => $config['directives']['opcache.optimization_level'] ], 'advanced_settings' => [ 'opcache.save_comments' => $config['directives']['opcache.save_comments'], 'opcache.enable_file_override' => $config['directives']['opcache.enable_file_override'], 'opcache.file_update_protection' => $config['directives']['opcache.file_update_protection'], 'opcache.huge_code_pages' => $config['directives']['opcache.huge_code_pages'] ], 'jit_settings' => [ 'opcache.jit' => $config['directives']['opcache.jit'], 'opcache.jit_buffer_size' => $config['directives']['opcache.jit_buffer_size'], 'opcache.jit_debug' => $config['directives']['opcache.jit_debug'] ] ] ]; echo json_encode($response, JSON_PRETTY_PRINT); break; default: // Full response (original functionality) if (!$opcache_enabled) { $response = [ 'status' => 'success', 'data' => [ 'enabled' => false, 'message' => 'OPcache is disabled. Only configuration data is available.', 'configuration' => [ 'directives' => $config['directives'] ] ] ]; } else { $response = [ 'status' => 'success', 'data' => [ 'enabled' => true, 'memory_usage' => [ 'used' => $status['memory_usage']['used_memory'], 'free' => $status['memory_usage']['free_memory'], 'wasted' => $status['memory_usage']['wasted_memory'], 'current_wasted_percentage' => $status['memory_usage']['current_wasted_percentage'] ], 'interned_strings_usage' => [ 'buffer_size' => $status['interned_strings_usage']['buffer_size'], 'used_memory' => $status['interned_strings_usage']['used_memory'], 'free_memory' => $status['interned_strings_usage']['free_memory'], 'number_of_strings' => $status['interned_strings_usage']['number_of_strings'] ], 'opcache_statistics' => [ 'num_cached_scripts' => $status['opcache_statistics']['num_cached_scripts'], 'num_cached_keys' => $status['opcache_statistics']['num_cached_keys'], 'max_cached_keys' => $status['opcache_statistics']['max_cached_keys'], 'hits' => $status['opcache_statistics']['hits'], 'misses' => $status['opcache_statistics']['misses'], 'blacklist_misses' => $status['opcache_statistics']['blacklist_misses'], 'blacklist_miss_ratio' => $status['opcache_statistics']['blacklist_miss_ratio'], 'opcache_hit_rate' => $status['opcache_statistics']['opcache_hit_rate'] ], 'configuration' => [ 'directives' => $config['directives'] ] ] ]; } echo json_encode($response, JSON_PRETTY_PRINT); break; }