These PHP handlers represent fundamentally different approaches to executing PHP scripts:
- CGI (Common Gateway Interface): Spawns new process per request
// Example CGI call GET /script.php HTTP/1.1 Host: example.com → Spawns new PHP process → Returns output → Terminates
- FastCGI: Persistent process with socket communication
// FastCGI process manager configuration (php-fpm.conf) pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 8
- mod_php: Apache module running within web server
# Apache configuration for mod_php LoadModule php7_module modules/libphp7.so AddHandler php7-script .php
- suPHP: CGI wrapper with user isolation
# suPHP configuration [global] logfile=/var/log/suphp.log webserver_user=www-data umask=0022
Sample benchmark results (requests/second) on identical hardware:
Handler | Static | DB Query | Complex App |
---|---|---|---|
CGI | 23 | 9 | 5 |
FastCGI | 1420 | 380 | 210 |
mod_php | 1350 | 350 | 180 |
suPHP | 35 | 15 | 8 |
PHP-FPM | 1480 | 420 | 230 |
Consider these security aspects when choosing a handler:
// Dangerous example requiring proper isolation
<?php
file_put_contents('/etc/passwd', 'hacked');
?>
- mod_php: Runs as web server user (potential privilege issues)
- suPHP: Executes scripts under owner's permissions (better isolation)
- PHP-FPM: Supports chroot and user/group separation
Implementing PHP-FPM with Nginx:
# nginx configuration
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Enabling opcode caching with mod_php:
# php.ini for mod_php
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.validate_timestamps=60
When switching from mod_php to PHP-FPM:
- Check for apache_get_modules() dependencies
- Update .htaccess rules (some don't apply to FPM)
- Verify file permissions (different user context)
- Test session handling differences
For new deployments in 2023:
- High traffic: PHP-FPM + Nginx
- Shared hosting: suPHP or PHP-FPM with per-user pools
- Legacy systems: mod_php (when migration isn't feasible)
- Microservices: FastCGI with containerized PHP
Real-world case: WordPress on PHP-FPM showing 3x performance improvement over mod_php with the same hardware resources.
When deploying PHP applications, the choice of execution handler significantly impacts performance, security, and resource management. Let's examine the technical implementations:
The original PHP execution method spawns a new process for each request:
#!/usr/bin/php-cgi
Pros:
- Simple isolation between requests
- Works with any web server
Cons:
- High process overhead
- No persistent connections
An optimized version of CGI that maintains persistent processes:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
Pros:
- Reduced process creation overhead
- Better performance than CGI
Cons:
- More complex configuration
- Requires separate process manager
PHP runs as an Apache module:
LoadModule php7_module modules/libphp7.so
AddHandler php7-script .php
Pros:
- Excellent performance for Apache
- Native integration with Apache features
Cons:
- Apache-only solution
- Runs with web server permissions
Secure PHP execution with per-user permissions:
suPHP_Engine on
suPHP_UserGroup user group
Pros:
- Improved security through user isolation
- Prevents shared hosting security issues
Cons:
- Performance overhead
- Complex permission management
The modern recommended approach for most deployments:
[www]
user = www-data
group = www-data
listen = /var/run/php/php7.4-fpm.sock
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
Pros:
- Excellent performance and scalability
- Advanced process management
- Works with Nginx and Apache
Cons:
- More complex setup
- Requires separate configuration
Benchmark results (requests/second) on identical hardware:
Handler | Static | WordPress | Laravel |
---|---|---|---|
CGI | 120 | 35 | 28 |
FastCGI | 950 | 210 | 180 |
mod_php | 1100 | 240 | 190 |
suPHP | 400 | 95 | 80 |
PHP-FPM | 1300 | 280 | 230 |
Choose CGI when:
- Maximum security isolation is required
- You need simple deployment
Choose FastCGI when:
- Running older systems
- Need better performance than CGI
Choose mod_php when:
- Running Apache-only environments
- Need best possible Apache integration
Choose suPHP when:
- Running shared hosting environments
- User isolation is critical
Choose PHP-FPM when:
- Performance is key requirement
- Using Nginx or modern Apache