|
| 1 | +# PivotPHP ReactPHP v0.0.1 Release Notes |
| 2 | + |
| 3 | +**Release Date:** December 2024 |
| 4 | +**Version:** 0.0.1 (Initial Release) |
| 5 | + |
| 6 | +## 🎉 Introduction |
| 7 | + |
| 8 | +This is the initial release of PivotPHP ReactPHP - a high-performance continuous runtime extension for PivotPHP using ReactPHP's event-driven, non-blocking I/O model. This extension enables long-running PHP applications with persistent state and eliminates the bootstrap overhead of traditional PHP-FPM deployments. |
| 9 | + |
| 10 | +## 🚀 Key Features |
| 11 | + |
| 12 | +### Continuous Runtime |
| 13 | +- **Persistent Application State**: Application remains in memory between requests |
| 14 | +- **Elimination of Bootstrap Overhead**: No need to initialize the framework for each request |
| 15 | +- **Connection Persistence**: Database connections and other resources stay alive |
| 16 | +- **Shared Cache**: In-memory caching persists across requests |
| 17 | + |
| 18 | +### Event-Driven Architecture |
| 19 | +- **Non-Blocking I/O**: Handle multiple concurrent requests efficiently |
| 20 | +- **ReactPHP Integration**: Built on ReactPHP's proven event loop |
| 21 | +- **Async Support**: Native support for promises and async operations |
| 22 | +- **High Concurrency**: Handle thousands of concurrent connections |
| 23 | + |
| 24 | +### PSR-7 Compatibility |
| 25 | +- **Bridge Pattern**: Seamless conversion between ReactPHP and PivotPHP PSR-7 implementations |
| 26 | +- **Header Handling**: Proper conversion of HTTP headers to PivotPHP's camelCase format |
| 27 | +- **Request/Response Conversion**: Complete request/response lifecycle support |
| 28 | +- **Stream Support**: Efficient handling of request/response streams |
| 29 | + |
| 30 | +## 📦 Installation |
| 31 | + |
| 32 | +```bash |
| 33 | +composer require pivotphp/reactphp:^0.0.1 |
| 34 | +``` |
| 35 | + |
| 36 | +### Requirements |
| 37 | +- PHP 8.1 or higher |
| 38 | +- PivotPHP Core ^1.0 |
| 39 | +- ReactPHP packages (automatically installed) |
| 40 | + |
| 41 | +## 🏗️ Architecture |
| 42 | + |
| 43 | +### Core Components |
| 44 | + |
| 45 | +#### ReactServer (`src/Server/ReactServer.php`) |
| 46 | +Main server class that bridges ReactPHP's HttpServer with PivotPHP Application: |
| 47 | +- Event loop management |
| 48 | +- Signal handling for graceful shutdown |
| 49 | +- Request/response processing |
| 50 | +- Error handling and logging |
| 51 | + |
| 52 | +#### Bridge System (`src/Bridge/`) |
| 53 | +- **RequestBridge**: Converts ReactPHP requests to PivotPHP requests using global state manipulation |
| 54 | +- **ResponseBridge**: Converts PivotPHP responses to ReactPHP responses with streaming support |
| 55 | + |
| 56 | +#### Service Provider (`src/Providers/ReactPHPServiceProvider.php`) |
| 57 | +Registers all ReactPHP services with PivotPHP's dependency injection container: |
| 58 | +- Event loop registration |
| 59 | +- Bridge services |
| 60 | +- Server configuration |
| 61 | +- Console commands |
| 62 | + |
| 63 | +#### Console Command (`src/Commands/ServeCommand.php`) |
| 64 | +Provides CLI interface for server management: |
| 65 | +- Server startup with configurable host/port |
| 66 | +- Environment configuration |
| 67 | +- Multi-worker support (experimental) |
| 68 | + |
| 69 | +### PSR-7 Compatibility Layer |
| 70 | +- **Psr7CompatibilityAdapter**: Handles version differences between ReactPHP's PSR-7 v1.x and PivotPHP's implementation |
| 71 | +- **Global State Management**: Temporary manipulation of PHP globals for PivotPHP compatibility |
| 72 | +- **Header Conversion**: Automatic conversion of HTTP headers to PivotPHP's camelCase format |
| 73 | + |
| 74 | +## 🔧 Configuration |
| 75 | + |
| 76 | +### Default Configuration |
| 77 | +```php |
| 78 | +return [ |
| 79 | + 'server' => [ |
| 80 | + 'debug' => env('APP_DEBUG', false), |
| 81 | + 'streaming' => env('REACTPHP_STREAMING', false), |
| 82 | + 'max_concurrent_requests' => env('REACTPHP_MAX_CONCURRENT_REQUESTS', 100), |
| 83 | + 'request_body_size_limit' => env('REACTPHP_REQUEST_BODY_SIZE_LIMIT', 67108864), // 64MB |
| 84 | + 'request_body_buffer_size' => env('REACTPHP_REQUEST_BODY_BUFFER_SIZE', 8192), // 8KB |
| 85 | + ], |
| 86 | +]; |
| 87 | +``` |
| 88 | + |
| 89 | +### Environment Variables |
| 90 | +- `REACTPHP_HOST`: Server host (default: 0.0.0.0) |
| 91 | +- `REACTPHP_PORT`: Server port (default: 8080) |
| 92 | +- `REACTPHP_STREAMING`: Enable streaming requests |
| 93 | +- `REACTPHP_MAX_CONCURRENT_REQUESTS`: Concurrent request limit |
| 94 | +- `APP_DEBUG`: Enable debug mode for detailed error messages |
| 95 | + |
| 96 | +## 🎯 Usage Examples |
| 97 | + |
| 98 | +### Basic Server Setup |
| 99 | +```php |
| 100 | +<?php |
| 101 | +use PivotPHP\Core\Application; |
| 102 | +use PivotPHP\ReactPHP\Providers\ReactPHPServiceProvider; |
| 103 | +use PivotPHP\ReactPHP\Server\ReactServer; |
| 104 | + |
| 105 | +$app = new Application(__DIR__); |
| 106 | +$app->register(new ReactPHPServiceProvider()); |
| 107 | + |
| 108 | +// Define routes |
| 109 | +$router = $app->get('router'); |
| 110 | +$router->get('/', fn() => Response::json(['message' => 'Hello, ReactPHP!'])); |
| 111 | + |
| 112 | +// Start server |
| 113 | +$server = $app->get(ReactServer::class); |
| 114 | +$server->listen('0.0.0.0:8080'); |
| 115 | +``` |
| 116 | + |
| 117 | +### Console Command |
| 118 | +```bash |
| 119 | +# Start server with default settings |
| 120 | +php artisan serve:reactphp |
| 121 | + |
| 122 | +# Custom configuration |
| 123 | +php artisan serve:reactphp --host=127.0.0.1 --port=8000 --env=development |
| 124 | +``` |
| 125 | + |
| 126 | +### Async Operations |
| 127 | +```php |
| 128 | +use React\Promise\Promise; |
| 129 | + |
| 130 | +$router->get('/async/fetch', function () use ($browser): Promise { |
| 131 | + return $browser->get('https://api.example.com/data')->then( |
| 132 | + fn($response) => Response::json(json_decode((string) $response->getBody())) |
| 133 | + ); |
| 134 | +}); |
| 135 | +``` |
| 136 | + |
| 137 | +## 🧪 Testing |
| 138 | + |
| 139 | +### Test Suite |
| 140 | +- **Bridge Tests**: Request/response conversion testing |
| 141 | +- **Server Tests**: Server lifecycle and request handling |
| 142 | +- **Integration Tests**: End-to-end functionality testing |
| 143 | +- **PHPStan Level 9**: Strict static analysis compliance |
| 144 | + |
| 145 | +### Quality Assurance |
| 146 | +```bash |
| 147 | +# Run all tests |
| 148 | +composer test |
| 149 | + |
| 150 | +# Run tests with coverage |
| 151 | +composer test:coverage |
| 152 | + |
| 153 | +# Quality checks (CS, PHPStan, Tests) |
| 154 | +composer quality:check |
| 155 | + |
| 156 | +# Code style checks |
| 157 | +composer cs:check |
| 158 | +composer cs:fix |
| 159 | +``` |
| 160 | + |
| 161 | +## 📊 Performance |
| 162 | + |
| 163 | +### Benefits |
| 164 | +- **2-3x Higher Throughput**: Compared to traditional PHP-FPM |
| 165 | +- **50% Lower Memory Per Request**: Shared application state |
| 166 | +- **Faster Response Times**: No bootstrap overhead |
| 167 | +- **Persistent Connections**: Database and cache connections stay alive |
| 168 | + |
| 169 | +### Benchmarking |
| 170 | +```bash |
| 171 | +# ReactPHP server |
| 172 | +ab -n 10000 -c 100 http://localhost:8080/ |
| 173 | + |
| 174 | +# Start development server for testing |
| 175 | +composer server:start |
| 176 | +``` |
| 177 | + |
| 178 | +## 🚨 Known Limitations |
| 179 | + |
| 180 | +### Memory Management |
| 181 | +- Long-running processes require careful memory management |
| 182 | +- Memory leaks can accumulate over time |
| 183 | +- Periodic monitoring recommended |
| 184 | + |
| 185 | +### PHP Extension Compatibility |
| 186 | +- Some PHP extensions may not be compatible with async operations |
| 187 | +- Global state must be handled carefully |
| 188 | +- File uploads are buffered in memory by default |
| 189 | + |
| 190 | +### Development Considerations |
| 191 | +- Debugging can be more complex than traditional PHP |
| 192 | +- Application state persists between requests |
| 193 | +- Error handling requires async-aware patterns |
| 194 | + |
| 195 | +## 🔄 Production Deployment |
| 196 | + |
| 197 | +### Process Management |
| 198 | +Use a process manager like Supervisor: |
| 199 | +```ini |
| 200 | +[program:pivotphp-reactphp] |
| 201 | +command=php /path/to/app/artisan serve:reactphp --port=8080 |
| 202 | +autostart=true |
| 203 | +autorestart=true |
| 204 | +user=www-data |
| 205 | +numprocs=4 |
| 206 | +``` |
| 207 | + |
| 208 | +### Load Balancing |
| 209 | +Use Nginx as a reverse proxy: |
| 210 | +```nginx |
| 211 | +upstream pivotphp_backend { |
| 212 | + server 127.0.0.1:8080; |
| 213 | + server 127.0.0.1:8081; |
| 214 | + server 127.0.0.1:8082; |
| 215 | + server 127.0.0.1:8083; |
| 216 | +} |
| 217 | +
|
| 218 | +server { |
| 219 | + listen 80; |
| 220 | + location / { |
| 221 | + proxy_pass http://pivotphp_backend; |
| 222 | + } |
| 223 | +} |
| 224 | +``` |
| 225 | + |
| 226 | +## 🛣️ Future Roadmap |
| 227 | + |
| 228 | +### Upcoming Features |
| 229 | +- **WebSocket Support**: Real-time communication capabilities |
| 230 | +- **HTTP/2 and HTTP/3**: Modern protocol support |
| 231 | +- **Built-in Clustering**: Multi-core utilization |
| 232 | +- **GraphQL Subscriptions**: Real-time GraphQL support |
| 233 | +- **Server-Sent Events (SSE)**: Streaming updates |
| 234 | +- **Enhanced Memory Management**: Automatic memory optimization |
| 235 | + |
| 236 | +### Version 0.1.0 Goals |
| 237 | +- Stability improvements |
| 238 | +- Enhanced error handling |
| 239 | +- Performance optimizations |
| 240 | +- Extended middleware support |
| 241 | +- Comprehensive documentation |
| 242 | + |
| 243 | +## 🐛 Known Issues |
| 244 | + |
| 245 | +1. **PSR-7 Version Compatibility**: Currently requires PivotPHP Core's PSR-7 version switching script |
| 246 | +2. **Memory Accumulation**: Long-running processes may accumulate memory over time |
| 247 | +3. **Global State Handling**: Some edge cases in global state management |
| 248 | +4. **Multi-Worker Mode**: Experimental and not fully implemented |
| 249 | + |
| 250 | +## 📚 Documentation |
| 251 | + |
| 252 | +### Available Documentation |
| 253 | +- `README.md`: Quick start guide and basic usage |
| 254 | +- `CLAUDE.md`: Development guidance for AI assistants |
| 255 | +- `docs/IMPLEMENTATION_GUIDE.md`: Detailed implementation guide |
| 256 | +- `docs/TROUBLESHOOTING.md`: Common issues and solutions |
| 257 | + |
| 258 | +### Examples |
| 259 | +- `examples/server.php`: Basic server implementation |
| 260 | +- `examples/async-example.php`: Async operations demonstration |
| 261 | + |
| 262 | +## 🤝 Contributing |
| 263 | + |
| 264 | +### Development Setup |
| 265 | +```bash |
| 266 | +git clone https://github.com/pivotphp/pivotphp-reactphp.git |
| 267 | +cd pivotphp-reactphp |
| 268 | +composer install |
| 269 | +``` |
| 270 | + |
| 271 | +### Quality Standards |
| 272 | +- PHP 8.1+ with strict typing |
| 273 | +- PSR-12 coding standard |
| 274 | +- PHPStan Level 9 compliance |
| 275 | +- Comprehensive test coverage |
| 276 | +- Documentation for all public APIs |
| 277 | + |
| 278 | +### Testing |
| 279 | +```bash |
| 280 | +# Run all quality checks |
| 281 | +composer quality:check |
| 282 | + |
| 283 | +# Individual checks |
| 284 | +composer phpstan |
| 285 | +composer cs:check |
| 286 | +composer test |
| 287 | +``` |
| 288 | + |
| 289 | +## 📄 License |
| 290 | + |
| 291 | +This project is licensed under the MIT License - see the LICENSE file for details. |
| 292 | + |
| 293 | +## 📞 Support |
| 294 | + |
| 295 | +- **GitHub Issues**: Report bugs and request features |
| 296 | +- **Email**: team@pivotphp.com |
| 297 | +- **Documentation**: Check the docs/ directory |
| 298 | + |
| 299 | +## 🙏 Acknowledgments |
| 300 | + |
| 301 | +- ReactPHP team for the excellent event-driven PHP foundation |
| 302 | +- PivotPHP Core team for the flexible microframework architecture |
| 303 | +- PHP community for continuous support and feedback |
| 304 | + |
| 305 | +--- |
| 306 | + |
| 307 | +**Note**: This is an initial release intended for early adopters and testing. Production use should be carefully evaluated and monitored. Please report any issues or feedback to help improve future versions. |
0 commit comments