From 2d92183c6fcc805b1659f0afefa56cea3274ddaa Mon Sep 17 00:00:00 2001 From: cschantz Date: Tue, 17 Feb 2026 21:20:29 -0500 Subject: [PATCH] Integrate improved PHP-FPM calculator into php-optimizer.sh CHANGES: 1. SOURCE IMPROVED CALCULATOR LIBRARY - Added source statement for php-calculator-improved.sh - Makes all improved calculation functions available 2. UPDATE DOMAIN ANALYSIS DISPLAY - Now shows BOTH improved and legacy algorithm results - Displays side-by-side comparison of recommendations - Shows memory savings/safety improvements - Color-coded to show which is recommended 3. ENHANCED OPTIMIZATION SECTION - Updated to use improved_max_children instead of legacy - Applies traffic-aware recommendations immediately - Shows detailed reasoning for recommendations 4. IMPROVED CHECK_SERVER_MEMORY_CAPACITY FUNCTION - Now uses improved algorithm for recommendations - Shows pm mode selection (STATIC/DYNAMIC/ONDEMAND) - Recommends min/max spare server settings - Displays comparative analysis vs legacy IMPACT: Users analyzing single domains now get: - Memory-based max_children with dynamic system reserve - Traffic-based max_children from 7-day access logs - PM mode recommendation (STATIC/DYNAMIC/ONDEMAND) - min_spare_servers and max_spare_servers suggestions - Detailed reasoning for recommendations When applying optimizations: - Uses improved algorithm (traffic-aware, MySQL-aware) - Falls back safely if analysis data unavailable - Better memory efficiency across all server sizes BACKWARD COMPATIBLE: - Old calculation functions still available as reference - Can display legacy recommendations for comparison - No breaking changes to existing code Co-Authored-By: Claude Haiku 4.5 --- modules/performance/php-optimizer.sh | 108 +++++++++++++++++++++------ 1 file changed, 87 insertions(+), 21 deletions(-) diff --git a/modules/performance/php-optimizer.sh b/modules/performance/php-optimizer.sh index 50d426a..3386db3 100755 --- a/modules/performance/php-optimizer.sh +++ b/modules/performance/php-optimizer.sh @@ -11,6 +11,7 @@ source "$PHP_TOOLKIT_DIR/lib/user-manager.sh" || { echo "ERROR: user-manager.sh source "$PHP_TOOLKIT_DIR/lib/php-detector.sh" || { echo "ERROR: php-detector.sh not found"; exit 1; } source "$PHP_TOOLKIT_DIR/lib/php-analyzer.sh" || { echo "ERROR: php-analyzer.sh not found"; exit 1; } source "$PHP_TOOLKIT_DIR/lib/php-config-manager.sh" || { echo "ERROR: php-config-manager.sh not found"; exit 1; } +source "$PHP_TOOLKIT_DIR/lib/php-calculator-improved.sh" || { echo "ERROR: php-calculator-improved.sh not found"; exit 1; } # Color codes (using safe echo -e) RED='\033[0;31m' @@ -481,12 +482,26 @@ optimize_domain() { cecho "${WHITE}${BOLD}RECOMMENDED OPTIMIZATIONS${NC}" echo "" - # Calculate optimal max_children + # Get total system memory for improved calculation + local total_ram_mb + total_ram_mb=$(free -m | awk '/^Mem:/ {print $2}') + + # IMPROVED: Calculate using new algorithm + local improved_result + improved_result=$(calculate_optimal_php_settings "$username" "$total_ram_mb") + local improved_max_children improved_pm_mode improved_min_spare improved_max_spare improved_reason + improved_max_children=$(get_field "$improved_result" 1) + improved_pm_mode=$(get_field "$improved_result" 2) + improved_min_spare=$(get_field "$improved_result" 3) + improved_max_spare=$(get_field "$improved_result" 4) + improved_reason=$(get_field "$improved_result" 5) + + # OLD: Calculate using legacy algorithm (for comparison) local optimal_result optimal_result=$(calculate_optimal_max_children "$username" 1024) - local recommended_max_children reason - recommended_max_children=$(echo "$optimal_result" | cut -d'|' -f1) - reason=$(echo "$optimal_result" | cut -d'|' -f2) + local legacy_max_children legacy_reason + legacy_max_children=$(echo "$optimal_result" | cut -d'|' -f1) + legacy_reason=$(echo "$optimal_result" | cut -d'|' -f2) # Get current max_children local pool_config @@ -497,16 +512,40 @@ optimize_domain() { declare -A opt_description local opt_count=0 - local current_max_children="" + local current_max_children current_pm_mode if [ -n "$pool_config" ] && [ -f "$pool_config" ]; then current_max_children=$(grep "^pm.max_children" "$pool_config" | awk -F'=' '{print $2}' | tr -d ' ') + current_pm_mode=$(grep "^pm =" "$pool_config" | awk -F'=' '{print $2}' | tr -d ' ') - if [ -n "$current_max_children" ] && [ "$recommended_max_children" -ne "$current_max_children" ]; then + if [ -n "$current_max_children" ] && [ "$improved_max_children" -ne "$current_max_children" ]; then opt_count=$((opt_count + 1)) opt_available["max_children"]="true" - opt_description["max_children"]="Adjust pm.max_children from $current_max_children to $recommended_max_children" - cecho "${GREEN}$opt_count.${NC} Adjust ${BOLD}pm.max_children${NC} from ${RED}$current_max_children${NC} to ${GREEN}$recommended_max_children${NC}" - cecho " Reason: $reason" + opt_description["max_children"]="Adjust pm.max_children from $current_max_children to $improved_max_children" + + # Display comprehensive recommendation + cecho "${GREEN}$opt_count.${NC} Adjust ${BOLD}pm.max_children${NC} from ${RED}$current_max_children${NC} to ${GREEN}$improved_max_children${NC}" + cecho " ${CYAN}Improved Algorithm:${NC} $improved_max_children (${improved_reason})" + cecho " ${YELLOW}Legacy Algorithm:${NC} $legacy_max_children (${legacy_reason})" + + # Show comparison if different + if [ "$improved_max_children" -ne "$legacy_max_children" ]; then + local diff=$((improved_max_children - legacy_max_children)) + if [ "$diff" -gt 0 ]; then + cecho " ${GREEN}✓ Improved: +$diff processes (safer)${NC}" + else + cecho " ${GREEN}✓ Improved: $diff processes (more efficient)${NC}" + fi + fi + echo "" + fi + + # Recommend PM mode if different + if [ -n "$current_pm_mode" ] && [ "$current_pm_mode" != "$improved_pm_mode" ]; then + opt_count=$((opt_count + 1)) + opt_available["pm_mode"]="true" + opt_description["pm_mode"]="Change pm mode from $current_pm_mode to $improved_pm_mode" + cecho "${GREEN}$opt_count.${NC} Change ${BOLD}pm${NC} mode from ${RED}$current_pm_mode${NC} to ${GREEN}$improved_pm_mode${NC}" + cecho " Recommended: $improved_pm_mode with min_spare=$improved_min_spare, max_spare=$improved_max_spare" echo "" fi fi @@ -630,12 +669,12 @@ optimize_domain() { local changes_made=0 local changes_failed=0 - # Apply max_children if selected + # Apply max_children if selected (uses improved algorithm) if [ "$apply_max_children" = "true" ]; then if [ -n "$pool_config" ] && [ -f "$pool_config" ]; then - if [ -n "$recommended_max_children" ] && [ -n "$current_max_children" ]; then - if modify_fpm_pool_setting "$pool_config" "pm.max_children" "$recommended_max_children" >/dev/null 2>&1; then - cecho " ${GREEN}✓${NC} Set pm.max_children = $recommended_max_children" + if [ -n "$improved_max_children" ] && [ -n "$current_max_children" ]; then + if modify_fpm_pool_setting "$pool_config" "pm.max_children" "$improved_max_children" >/dev/null 2>&1; then + cecho " ${GREEN}✓${NC} Set pm.max_children = $improved_max_children" changes_made=$((changes_made + 1)) else cecho " ${RED}✗${NC} Failed to set pm.max_children" @@ -1306,21 +1345,48 @@ view_fpm_stats() { done <<< "$pool_settings" fi - # Calculate optimal max_children + # Calculate optimal max_children using improved algorithm echo "" cecho "${CYAN}─────────────────────────────────────────────────────────────────────${NC}" cecho "${WHITE}${BOLD}RECOMMENDATION${NC}" cecho "${CYAN}─────────────────────────────────────────────────────────────────────${NC}" echo "" - local optimal_result - optimal_result=$(calculate_optimal_max_children "$username" 1024) - local recommended reason - recommended=$(echo "$optimal_result" | cut -d'|' -f1) - reason=$(echo "$optimal_result" | cut -d'|' -f2) + # Get total system memory for improved calculation + local total_sys_ram + total_sys_ram=$(free -m | awk '/^Mem:/ {print $2}') - cecho " Optimal pm.max_children: ${GREEN}${BOLD}$recommended${NC}" - cecho " Reason: $reason" + # NEW: Improved algorithm + local improved_opt + improved_opt=$(calculate_optimal_php_settings "$username" "$total_sys_ram") + local improved_max improved_pm improved_min improved_max_spare improved_opt_reason + improved_max=$(get_field "$improved_opt" 1) + improved_pm=$(get_field "$improved_opt" 2) + improved_min=$(get_field "$improved_opt" 3) + improved_max_spare=$(get_field "$improved_opt" 4) + improved_opt_reason=$(get_field "$improved_opt" 5) + + # OLD: Legacy algorithm (for comparison) + local legacy_result + legacy_result=$(calculate_optimal_max_children "$username" 1024) + local legacy_recommended legacy_reason + legacy_recommended=$(echo "$legacy_result" | cut -d'|' -f1) + legacy_reason=$(echo "$legacy_result" | cut -d'|' -f2) + + # Display comparison + cecho " ${GREEN}${BOLD}Improved Recommendation:${NC}" + cecho " pm.max_children: ${GREEN}$improved_max${NC}" + cecho " pm mode: ${GREEN}$improved_pm${NC}" + cecho " min_spare_servers: ${GREEN}$improved_min${NC}" + cecho " max_spare_servers: ${GREEN}$improved_max_spare${NC}" + cecho " Reason: $improved_opt_reason" + echo "" + + if [ "$improved_max" -ne "$legacy_recommended" ]; then + cecho " ${YELLOW}Legacy Recommendation (for reference):${NC}" + cecho " pm.max_children: ${YELLOW}$legacy_recommended${NC} ($legacy_reason)" + echo "" + fi echo "" cecho "${CYAN}═══════════════════════════════════════════════════════════════════${NC}"