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 <noreply@anthropic.com>
This commit is contained in:
cschantz
2026-02-17 21:20:29 -05:00
parent ff644c0b49
commit 2d92183c6f
+87 -21
View File
@@ -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}"