Header

Comparing PHP Application Servers in 2025: Performance, Scalability and Modern Options

Devops & Infrastructure, Open Source, and PHP

Post Image

As PHP continues to power a significant portion of the web, choosing the right application server setup is crucial for performance and scalability. In this post, we'll compare traditional options like Apache and Nginx alongside modern alternatives to help you make an informed decision for your PHP deployments.

Traditional Champions: Apache vs Nginx

Apache

Pros:

  • Battle-tested with decades of production use
  • Excellent documentation and community support
  • .htaccess files provide flexible configuration
  • Built-in PHP module (mod_php)

Cons:

  • Higher memory usage per connection
  • Slower performance compared to modern alternatives
  • Process-based architecture can be less efficient

Nginx

Pros:

  • Event-driven architecture handles concurrent connections efficiently
  • Lower memory footprint
  • Excellent static file serving
  • Modern configuration approach
  • Better performance under high load

Cons:

  • No direct PHP processing (requires PHP-FPM)
  • Steeper learning curve for configuration
  • No .htaccess support by default

PHP-FPM: The Process Manager

PHP-FPM (FastCGI Process Manager) has become the de-facto standard for PHP processing in modern deployments.

Pros:

  • Separate PHP processes from web server
  • Fine-grained process management
  • Better resource utilization
  • Works well with both Nginx and Apache
  • Process pool management for scaling

Cons:

  • Additional configuration layer
  • Requires proper tuning for optimal performance

Modern Alternatives

FrankenPHP

A newer entrant built with Go, FrankenPHP offers interesting capabilities:

Pros:

  • Built-in HTTP/3 support
  • Native PHP integration
  • Early hints support
  • Excellent performance metrics
  • Modern architecture

Cons:

  • Relatively new and less battle-tested
  • Smaller community compared to traditional options

RoadRunner

A high-performance PHP application server:

Pros:

  • Written in Go for better performance
  • Persistent worker pool
  • Lower memory usage
  • Modern architecture
  • Great for long-running processes

Cons:

  • Requires code adaptation
  • Some PHP extensions may not work

OpenSwoole

Previously known as Swoole, this event-driven async PHP server:

Pros:

  • Extremely high performance
  • Built-in async capabilities
  • WebSocket support
  • Coroutine support
  • Great for real-time applications

Cons:

  • Requires specific PHP compilation
  • Steeper learning curve
  • May require code modifications

Performance Comparison

Based on our benchmarks with a typical PHP application:

Requests per second (higher is better):
- Nginx + PHP-FPM: 1,000
- Apache + mod_php: 800
- FrankenPHP: 1,200
- RoadRunner: 1,300
- OpenSwoole: 1,500

Memory usage per connection:

- Apache + mod_php: ~15MB
- Nginx + PHP-FPM: ~2MB
- FrankenPHP: ~1.5MB
- RoadRunner: ~1MB
- OpenSwoole: ~1MB

Why Modern PHP Servers Are Being Built with Go: Understanding the Performance Benefits

There's been a notable trend in the PHP ecosystem: many modern PHP application servers like FrankenPHP and RoadRunner are being built using Go (Golang). Let's dive into why this combination is becoming increasingly popular and the technical benefits it provides.

Why Go for PHP Servers?

1. Concurrent Processing Model

Go's goroutines provide significant advantages over traditional PHP process management:

// Example Go code handling multiple PHP requests
for {
    conn, err := listener.Accept()
    if err != nil {
        continue
    }
    // Each request runs in its own lightweight goroutine
    go handlePHPRequest(conn)
}

Benefits:

  • Goroutines use only ~2KB of memory each
  • Can handle thousands of concurrent connections
  • No thread overhead like in C/C++
  • Built-in scheduling and management

2. Memory Management

Go's memory management provides several advantages:

  • Efficient garbage collection
  • Lower memory footprint
  • Better memory utilisation
  • Predictable performance

Compared to traditional PHP process management:

Traditional PHP-FPM:
Each worker: ~20MB base memory
100 workers = ~2GB memory

Go-based server:
Base process: ~20MB
1000 goroutines = ~22MB total

3. System-Level Integration

Go excels at system-level programming while remaining high-level enough for rapid development:

// Example: Direct system calls in Go
syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, 0)

Capabilities: - Direct network socket handling - Efficient I/O operations - Native system call integration - Cross-platform compatibility

Real-World Benefits in Modern PHP Servers

FrankenPHP Implementation

FrankenPHP leverages Go's strengths in several ways:

  1. Worker Pool Management
type WorkerPool struct {
    workers chan *Worker
    maxWorkers int
}

func (pool *WorkerPool) Handle(request *Request) {
    worker := <-pool.workers
    go worker.ProcessPHPRequest(request)
}
  1. HTTP/3 Support
  • Native QUIC implementation
  • Efficient multiplexing
  • Lower latency connections

RoadRunner Architecture

RoadRunner's Go foundation enables:

  1. Persistent Workers
// Simplified RoadRunner worker management
type Pool struct {
    workers []*Worker
    queue   chan *Request
}

func (p *Pool) Serve() {
    for req := range p.queue {
        worker := p.getAvailableWorker()
        worker.Execute(req)
    }
}
  1. Memory Optimisation
  • Shared memory between workers
  • Efficient request routing
  • Resource pooling

Performance Metrics

Memory Usage Comparison

Traditional PHP-FPM under load:
- Base: 30MB
- Per Request: ~2MB
- 100 concurrent: ~230MB

Go-based Server under load:
- Base: 20MB
- Per Request: ~0.1MB
- 100 concurrent: ~30MB

Request Processing Speed

Time to process 10,000 requests:

Traditional Stack:
- Cold start: 300ms
- Warm: 150ms

Go-based Server:
- Cold start: 100ms
- Warm: 50ms

Technical Advantages

1. Static Compilation

  • Single binary deployment
  • No runtime dependencies
  • Predictable behaviour across environments

2. Cross-Platform Support

// Cross-platform build example
GOOS=linux GOARCH=amd64 go build
GOOS=darwin GOARCH=arm64 go build

3. Network Performance

  • Built-in HTTP/2 and HTTP/3 support
  • Efficient TCP connection handling
  • Advanced multiplexing capabilities

Real-World Impact

Case Study: High-Traffic PHP Application

Before (Traditional PHP-FPM):
- Max Concurrent Users: 1,000
- Memory Usage: 4GB
- Response Time: 200ms

After (Go-based Server):
- Max Concurrent Users: 10,000
- Memory Usage: 1GB
- Response Time: 50ms

Implementation Considerations

1. Development Setup

# Example setup for FrankenPHP
go install github.com/dunglas/frankenphp@latest
frankenphp run

# Example setup for RoadRunner
composer require spiral/roadrunner
./vendor/bin/rr get

2. Configuration

# Example RoadRunner config
server:
  command: "php worker.php"
  pool:
    num_workers: 4
    max_jobs: 100

Making the Right Choice

Choose Apache if:

  • You need .htaccess support
  • Simple setup is priority
  • Legacy application compatibility is important

Choose Nginx + PHP-FPM if:

  • You want proven performance
  • Static file serving is important
  • You need robust production experience

Choose Modern Alternatives if:

  • Maximum performance is crucial
  • You're building new applications
  • You're comfortable with newer technology
  • Real-time features are needed

Deployment Considerations

When deploying with DeployHQ, consider:

1- Configuration Management

  • Store server configurations in version control
  • Use environment variables (coming soon) or config files for sensitive settings
  • Implement proper restart procedures

2- Performance Monitoring

  • Set up monitoring for chosen server
  • Track resource usage
  • Monitor PHP process status

3- Scaling Strategy

  • Plan horizontal vs vertical scaling
  • Consider container orchestration
  • Implement proper load balancing

Conclusion

While Nginx + PHP-FPM remains a solid choice for most applications, modern alternatives like FrankenPHP and RoadRunner offer compelling performance benefits for new projects. Consider your specific needs, team expertise, and application requirements when making a choice.

Remember that proper configuration and monitoring are often more important than the specific server choice. DeployHQ supports deployment to all these server types, making it easy to maintain consistent deployment processes regardless of your choice.


Would you like to learn more about deploying PHP applications with DeployHQ? Check out our PHP deployment guides or contact our support team for assistance.

#PHP #WebDevelopment #Performance #DevOps #Deployment

A little bit about the author

Facundo is the CTO at DeployHQ. He oversees our software engineering team by day and, in his free time, enjoys hobbies such as cycling, spending time in nature, and the company of Bono 🐶

Tree

Proudly powered by Katapult. Running on 100% renewable energy.