- Move 12 markdown files from root to docs/ subdirectories - Organize documentation by category: • docs/troubleshooting/ (1 file) - Technical troubleshooting guides • docs/deployment/ (4 files) - Deployment and security documentation • docs/guides/ (3 files) - Feature-specific guides • docs/planning/ (4 files) - Planning and improvement proposals Root directory cleanup: - Reduced from 16 to 4 markdown files in root - Only essential project files remain: • CLAUDE.md (AI instructions) • README.md (Main project readme) • CLEANUP_PLAN.md (Current cleanup plan) • SRC_STRUCTURE_IMPROVEMENTS.md (Structure improvements) This improves: ✅ Documentation discoverability ✅ Logical organization by purpose ✅ Clean root directory ✅ Better maintainability
145 lines
4.6 KiB
PHP
145 lines
4.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Application\Admin\System\Service;
|
|
|
|
use App\Framework\Core\ValueObjects\Byte;
|
|
|
|
final readonly class PhpInfoService
|
|
{
|
|
public function getStructuredInfo(): array
|
|
{
|
|
return [
|
|
'general' => $this->getGeneralInfo(),
|
|
'configuration' => $this->getConfigurationInfo(),
|
|
'extensions' => $this->getExtensionsInfo(),
|
|
'environment' => $this->getEnvironmentInfo(),
|
|
];
|
|
}
|
|
|
|
private function getGeneralInfo(): array
|
|
{
|
|
return [
|
|
'version' => PHP_VERSION,
|
|
'sapi' => PHP_SAPI,
|
|
'os' => PHP_OS,
|
|
'architecture' => php_uname('m'),
|
|
'build_date' => phpversion(),
|
|
'compiler' => defined('PHP_COMPILER') ? PHP_COMPILER : 'Unknown',
|
|
'configure_command' => php_uname('v'),
|
|
];
|
|
}
|
|
|
|
private function getConfigurationInfo(): array
|
|
{
|
|
$memoryLimit = ini_get('memory_limit');
|
|
$uploadMaxSize = ini_get('upload_max_filesize');
|
|
$postMaxSize = ini_get('post_max_size');
|
|
|
|
return [
|
|
'memory_limit' => $memoryLimit,
|
|
'memory_limit_bytes' => $this->parseMemorySize($memoryLimit),
|
|
'max_execution_time' => ini_get('max_execution_time'),
|
|
'max_input_time' => ini_get('max_input_time'),
|
|
'upload_max_filesize' => $uploadMaxSize,
|
|
'upload_max_filesize_bytes' => $this->parseMemorySize($uploadMaxSize),
|
|
'post_max_size' => $postMaxSize,
|
|
'post_max_size_bytes' => $this->parseMemorySize($postMaxSize),
|
|
'max_file_uploads' => ini_get('max_file_uploads'),
|
|
'display_errors' => ini_get('display_errors') ? 'On' : 'Off',
|
|
'log_errors' => ini_get('log_errors') ? 'On' : 'Off',
|
|
'error_reporting' => $this->getErrorReportingLevel(),
|
|
'timezone' => ini_get('date.timezone') ?: 'Not set',
|
|
];
|
|
}
|
|
|
|
private function getExtensionsInfo(): array
|
|
{
|
|
$extensions = get_loaded_extensions();
|
|
sort($extensions);
|
|
|
|
$extensionDetails = [];
|
|
foreach ($extensions as $extension) {
|
|
$extensionDetails[] = [
|
|
'name' => $extension,
|
|
'version' => phpversion($extension) ?: 'Unknown',
|
|
'functions' => count(get_extension_funcs($extension) ?: []),
|
|
];
|
|
}
|
|
|
|
return [
|
|
'count' => count($extensions),
|
|
'list' => $extensions,
|
|
'details' => $extensionDetails,
|
|
];
|
|
}
|
|
|
|
private function getEnvironmentInfo(): array
|
|
{
|
|
return [
|
|
'server_software' => $_SERVER['SERVER_SOFTWARE'] ?? 'Unknown',
|
|
'document_root' => $_SERVER['DOCUMENT_ROOT'] ?? 'Unknown',
|
|
'server_admin' => $_SERVER['SERVER_ADMIN'] ?? 'Not set',
|
|
'server_name' => $_SERVER['SERVER_NAME'] ?? 'Unknown',
|
|
'server_port' => $_SERVER['SERVER_PORT'] ?? 'Unknown',
|
|
'request_time' => date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME'] ?? time()),
|
|
'https' => isset($_SERVER['HTTPS']) ? 'On' : 'Off',
|
|
];
|
|
}
|
|
|
|
private function parseMemorySize(string $size): ?Byte
|
|
{
|
|
if ($size === '-1') {
|
|
return null; // Unlimited
|
|
}
|
|
|
|
$value = (int) $size;
|
|
$unit = strtolower($size[strlen($size) - 1] ?? '');
|
|
|
|
$bytes = match ($unit) {
|
|
'k' => $value * 1024,
|
|
'm' => $value * 1024 * 1024,
|
|
'g' => $value * 1024 * 1024 * 1024,
|
|
default => $value,
|
|
};
|
|
|
|
return Byte::fromBytes($bytes);
|
|
}
|
|
|
|
private function getErrorReportingLevel(): string
|
|
{
|
|
$level = error_reporting();
|
|
|
|
$levels = [
|
|
E_ERROR => 'E_ERROR',
|
|
E_WARNING => 'E_WARNING',
|
|
E_PARSE => 'E_PARSE',
|
|
E_NOTICE => 'E_NOTICE',
|
|
E_CORE_ERROR => 'E_CORE_ERROR',
|
|
E_CORE_WARNING => 'E_CORE_WARNING',
|
|
E_COMPILE_ERROR => 'E_COMPILE_ERROR',
|
|
E_COMPILE_WARNING => 'E_COMPILE_WARNING',
|
|
E_USER_ERROR => 'E_USER_ERROR',
|
|
E_USER_WARNING => 'E_USER_WARNING',
|
|
E_USER_NOTICE => 'E_USER_NOTICE',
|
|
E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
|
|
E_DEPRECATED => 'E_DEPRECATED',
|
|
E_USER_DEPRECATED => 'E_USER_DEPRECATED',
|
|
];
|
|
|
|
if ($level === E_ALL) {
|
|
return 'E_ALL';
|
|
}
|
|
|
|
$enabledLevels = [];
|
|
foreach ($levels as $value => $name) {
|
|
if ($level & $value) {
|
|
$enabledLevels[] = $name;
|
|
}
|
|
}
|
|
|
|
return implode(' | ', $enabledLevels) ?: 'None';
|
|
}
|
|
}
|