mb-admin/scripts/check_opcache.php

232 lines
11 KiB
PHP

<?php
// Add error reporting
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Check if running from CLI
if (php_sapi_name() !== 'cli') {
echo json_encode(['status' => '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;
}