Fixed three critical bugs preventing OPcache enablement and PHP config changes:
1. **Sed Injection Bug** - Setting names with dots (.) were not escaped for sed regex
- Affected: modify_php_ini_setting, modify_fpm_pool_setting
- Impact: opcache.enable, pm.max_children settings failed silently
- Fix: Properly escape special chars for sed regex patterns
2. **Silent Failures** - Error suppression hid modification failures
- Affected: enable_opcache() calls had >/dev/null 2>&1
- Impact: OPcache showed 0 enabled even when attempted
- Fix: Remove error suppression and add proper validation
3. **Missing Change Logging** - FPM changes not tracked in changes_log
- Affected: FPM settings were optimized but not counted in summary
- Impact: 'Changes Applied: 0' even though changes were made
- Fix: Add FPM and OPcache changes to changes_log array
Results:
- OPcache will now actually be enabled when needed
- Changes Applied counter will be accurate
- FPM settings will be properly modified with escaped values
- Better error visibility for debugging
Tested: Sed escaping handles dots, slashes, ampersands, pipes
Bug fix in lib/php-config-manager.sh:
- Line 124: find_fpm_pool_config() requires both username AND domain
- Was only passing username, causing backup to fail
- Fixed: find_fpm_pool_config "$username" "$domain"
Impact:
- Backup functionality now works correctly
- Successfully backs up PHP-FPM pool configs
- Tested with pickledperil.com - backup created successfully
Verification:
- Syntax validated
- Backup test: passed
- Pool config found and backed up to /root/server-toolkit/backups/php/
CRITICAL FIXES:
1. php-detector.sh - Fix detect_php_version_for_domain parameter order
- Changed from detect_php_version_for_domain(domain, username)
- To: detect_php_version_for_domain(username, domain)
- Updated all 3 call sites to pass username first
- Fixes: Cannot detect PHP versions for domains
2. php-analyzer.sh - Fix memory calculation bug (line 599)
- Changed total_mb from field 2 to field 3
- Was: total_mb=$(echo "$memory_stats" | cut -d'|' -f2)
- Now: total_mb=$(echo "$memory_stats" | cut -d'|' -f3)
- Fixes: analyze_domain_php() showing wrong memory usage
3. php-analyzer.sh - Fix variable name collision
- Renamed second error_count to memory_error_count
- Prevents overwriting max_children error count
- Fixes: Memory error detection not working
4. php-analyzer.sh - Fix calculate_server_memory_capacity
- Changed from get_fpm_memory_usage(pool_name) [wrong function]
- To: calculate_memory_per_process(username) [correct]
- Fixed stderr output to stdout for details
- Fixed indentation causing logic errors
- Fixes: Server capacity check returning garbage data
5. php-detector.sh - Fix find_fpm_pool_config search order
- Changed to search username.conf FIRST (cPanel standard)
- Was searching domain.conf first (doesn't exist in cPanel)
- cPanel stores pools as /opt/cpanel/ea-phpXX/root/etc/php-fpm.d/USERNAME.conf
- Fixes: Cannot find FPM pool configurations
6. php-config-manager.sh - Add missing dependency source
- Added: source php-detector.sh at top of file
- Was calling find_fpm_pool_config() with no definition
- Fixes: All backup/restore functions failing
IMPACT:
Before: PHP optimizer completely non-functional
- Could not detect PHP versions
- Could not find FPM pool configs
- Could not backup/restore configs
- Showed wrong memory calculations
- Server capacity check broken
After: All core functionality now works
- PHP version detection working
- FPM pool discovery working
- Backup/restore functional
- Memory calculations accurate
- Capacity checks return valid data
NEW LIBRARY: lib/php-config-manager.sh (14 functions, 442 lines)
BACKUP FUNCTIONS:
- initialize_backup_system() - Creates /root/server-toolkit/backups/php/
- backup_php_config() - Backs up single config file with metadata
- backup_fpm_pool() - Backs up PHP-FPM pool configuration
- backup_user_php_configs() - Backs up ALL PHP configs for a user
- list_backups() - Lists all backups with metadata (date, user, domain, file count)
RESTORE FUNCTIONS:
- restore_php_config() - Restores single config file
- restore_from_backup() - Restores entire backup set
- delete_backup() - Removes old backups
CONFIGURATION MODIFICATION:
- modify_fpm_pool_setting() - Changes single FPM pool setting
- modify_php_ini_setting() - Changes single php.ini setting
- apply_fpm_pool_settings() - Applies multiple settings at once
PHP-FPM MANAGEMENT:
- restart_php_fpm() - Restarts PHP-FPM service (systemd/sysvinit)
- reload_php_fpm() - Graceful reload (no downtime)
- verify_php_fpm_running() - Checks if service is active
MENU OPTIONS B & R IMPLEMENTED:
Option B: Backup Current Configurations
- Select domain to backup
- Backs up all php.ini files (priority 1-4)
- Backs up PHP-FPM pool config
- Creates metadata.txt with timestamp, user, domain
- Preserves directory structure
- Shows list of backed up files
- Backup location: /root/server-toolkit/backups/php/YYYYMMDD_HHMMSS/
Option R: Restore from Backup
- Lists all available backups with details
- Shows: backup name, date, username, domain, file count
- Numbered selection menu
- Confirmation prompt: "This will overwrite current configurations!"
- Requires typing "yes" to proceed
- Restores all files with metadata preservation
- Shows success/failure for each file
- Reminder to restart PHP-FPM
BACKUP STRUCTURE:
/root/server-toolkit/backups/php/
├── 20250102_143045/
│ ├── metadata.txt (backup info)
│ ├── opt/cpanel/ea-php82/root/etc/php-fpm.d/username.conf
│ ├── home/username/.php/8.2/php.ini
│ └── home/username/public_html/.user.ini
└── 20250102_150830/
└── ...
SAFETY FEATURES:
- Metadata tracking (who, what, when)
- Confirmation required for restore
- Non-destructive backups (never overwrites backups)
- Timestamp-based naming (no conflicts)
- Preserves file permissions and ownership
FUTURE USE:
These functions will be used by Phase 5 (apply/action menu) to:
1. Auto-backup before applying changes
2. Rollback if changes cause issues
3. Compare current vs backed up configs