A high-performance HTTP server for Symfony applications using Workerman. Make your Symfony application faster with minimal changes.
- Features
- Requirements
- Installation
- Quick Start
- Commands
- Architecture
- Performance Optimizations
- Development Mode
- Production Deployment
- Advanced Usage
- Troubleshooting
- Contributing
- License
- High Performance: Built on Workerman's event-driven architecture
- Symfony Integration: Full support for Symfony's request/response lifecycle
- Static File Serving: Automatic static file serving with MIME type detection
- Long-lived Connections: HTTP keep-alive support
- Process Management: Built-in process management (start/stop/restart/reload)
- Auto-reload: File monitoring and auto-reload in development mode
- Memory Protection: Automatic worker restart after max requests
- PSR Standards: PSR-7, PSR-15, PSR-17 compliant
- PHP 8.1+
- Symfony 6.4+
- ext-pcntl
- ext-posix
- ext-fileinfo
composer require tourze/workerman-server-bundleAdd the bundle to your config/bundles.php:
return [
// ...
Tourze\WorkermanServerBundle\WorkermanServerBundle::class => ['all' => true],
];# Start the server
php bin/console workerman:http start
# Start as daemon
php bin/console workerman:http start -d
# Stop the server
php bin/console workerman:http stop
# Restart the server
php bin/console workerman:http restart
# Check server status
php bin/console workerman:http status
# Reload workers (graceful restart)
php bin/console workerman:http reload
# View connection details
php bin/console workerman:http connectionsThe server will start on http://127.0.0.1:8080 by default.
The main command to manage the Workerman HTTP server.
Description: Start Workerman HTTP server for your Symfony application
Usage:
php bin/console workerman:http <action>Available actions:
start: Start the serverstop: Stop the serverrestart: Restart the serverstatus: Show server statusreload: Gracefully reload all workersconnections: Show current connections
Options:
-d: Run as daemon (for start/restart actions)
Features:
- Serves both dynamic Symfony routes and static files
- Automatic worker restart after 10,000 requests (configurable)
- File monitoring in debug mode for auto-reload
- Integrated Messenger consumer support
- Keep-alive connection support
- Workerman receives HTTP request
- Request is converted to PSR-7 ServerRequest
- Static file check (serves from
public/directory if exists) - PSR-7 request is converted to Symfony Request
- Symfony kernel handles the request
- Symfony Response is converted to PSR-7 Response
- Response is sent back through Workerman
- Kernel terminate event is triggered
- WorkermanHttpCommand: Console command for server management
- OnMessage: Core request handler
- PsrRequestFactory: Converts Workerman requests to PSR-7
- WorkermanResponseEmitter: Sends PSR-7 responses to clients
- ProperHeaderCasingResponseFactory: Ensures proper HTTP header casing
- Memory Management: Workers automatically restart after processing 10,000 requests
- File Monitoring: Only enabled in debug mode to avoid overhead
- Static File Serving: Direct file serving bypasses Symfony kernel
- Connection Reuse: HTTP keep-alive reduces connection overhead
- Error Tracking: Optimized backtrace with ignored vendor files
In development mode (APP_ENV=dev), the bundle provides:
- Automatic file monitoring for changes in:
config/src/templates/translations/
- Auto-reload when PHP, YAML files change
- Detailed error output
For production use:
# Start as daemon with production environment
APP_ENV=prod php bin/console workerman:http start -d
# Monitor server status
php bin/console workerman:http status
# Graceful reload without downtime
php bin/console workerman:http reloadYou can extend the request handling by implementing PSR-15 middleware:
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
class CustomHandler implements RequestHandlerInterface
{
public function handle(ServerRequestInterface $request): ResponseInterface
{
// Your custom logic here
}
}The bundle automatically starts a Messenger consumer worker when the HTTP server starts, allowing you to process async messages without separate processes.
- Check if port 8080 is already in use
- Ensure PHP has pcntl and posix extensions enabled
- Check file permissions for pid and log files
- Reduce max request count per worker
- Check for memory leaks in your application code
- Monitor with
workerman:http status
Contributions are welcome! Please feel free to submit a Pull Request.
The MIT License (MIT). Please see License File for more information.