mirror of
https://github.com/Qbix/webserver.git
synced 2026-07-22 07:57:23 +02:00
Updated README to mention HTTP/2 and amphp autodetection
This commit is contained in:
@@ -20,6 +20,7 @@ One process serves static files, PHP scripts, WebSocket connections, and a live
|
|||||||
- [Building](#-building)
|
- [Building](#-building)
|
||||||
- [With Qbix Platform](#-with-qbix-platform)
|
- [With Qbix Platform](#-with-qbix-platform)
|
||||||
- [Architecture](#-architecture)
|
- [Architecture](#-architecture)
|
||||||
|
- [HTTP/2 Support](#-http2-support)
|
||||||
- [Requirements](#-requirements)
|
- [Requirements](#-requirements)
|
||||||
- [License](#-license)
|
- [License](#-license)
|
||||||
|
|
||||||
@@ -166,6 +167,7 @@ The 0.05ms you lose on static files, you gain back 30ms on every PHP request. An
|
|||||||
|---|---|
|
|---|---|
|
||||||
| **Static files** | ETag, 304 Not Modified, Last-Modified, MIME type detection, in-memory response cache |
|
| **Static files** | ETag, 304 Not Modified, Last-Modified, MIME type detection, in-memory response cache |
|
||||||
| **Keep-alive** | HTTP/1.0 and 1.1, TCP_NODELAY, configurable limits |
|
| **Keep-alive** | HTTP/1.0 and 1.1, TCP_NODELAY, configurable limits |
|
||||||
|
| **HTTP/2** | Via amphp — multiplexed streams, header compression, TLS (optional) |
|
||||||
| **PHP execution** | `.php` files in document root run in-process or via pre-fork worker pool |
|
| **PHP execution** | `.php` files in document root run in-process or via pre-fork worker pool |
|
||||||
| **Compression** | On-the-fly gzip/brotli + pre-compressed `.gz`/`.br` siblings |
|
| **Compression** | On-the-fly gzip/brotli + pre-compressed `.gz`/`.br` siblings |
|
||||||
| **WebSocket** | RFC 6455 upgrade on any path |
|
| **WebSocket** | RFC 6455 upgrade on any path |
|
||||||
@@ -540,6 +542,61 @@ performance from pure interpreted PHP is about as good as it gets.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 🌐 HTTP/2 Support
|
||||||
|
|
||||||
|
The built-in event loop uses `stream_select` — zero dependencies, works everywhere.
|
||||||
|
But if you install [amphp](https://amphp.org/), the server upgrades to a full
|
||||||
|
HTTP/2 server with no code changes:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer require amphp/http-server amphp/socket
|
||||||
|
php server.php --port=8443
|
||||||
|
```
|
||||||
|
|
||||||
|
The server detects amphp automatically and switches to its event loop and HTTP
|
||||||
|
driver. You get:
|
||||||
|
|
||||||
|
| | HTTP/1.1 (built-in) | HTTP/2 (amphp) |
|
||||||
|
|---|---|---|
|
||||||
|
| Connections per page load | ~6 parallel | 1 multiplexed |
|
||||||
|
| Header overhead | Full headers per request | HPACK compressed |
|
||||||
|
| Event loop | `stream_select` (portable) | `epoll`/`kqueue` via Revolt |
|
||||||
|
| TLS | `stream_socket_enable_crypto` | amphp native TLS |
|
||||||
|
| Server push | No | Yes (push static assets before browser asks) |
|
||||||
|
|
||||||
|
### How it works
|
||||||
|
|
||||||
|
The server has a clean two-layer architecture. `Q_WebServer::route()` handles
|
||||||
|
all request logic (static files, PHP dispatch, cache, access control) and returns
|
||||||
|
a `[status, headers, body]` array. The transport layer is pluggable:
|
||||||
|
|
||||||
|
```
|
||||||
|
Built-in: stream_select → accept → fread → route() → fwrite
|
||||||
|
amphp: Revolt loop → amphp HTTP server → route() → amphp response
|
||||||
|
```
|
||||||
|
|
||||||
|
All the server's features — response cache, X-Accel-Redirect, component cache
|
||||||
|
invalidation, keep-alive, compression — work identically on both transports.
|
||||||
|
The `Q_Evented` facade abstracts the event loop, so timers, signals, and socket
|
||||||
|
watchers work the same way whether you're on `stream_select` or Revolt.
|
||||||
|
|
||||||
|
### When to use which
|
||||||
|
|
||||||
|
**Built-in (default):** Zero dependencies. Works on any PHP 8.1+ installation.
|
||||||
|
Good for development, small-to-medium sites, and environments where you can't
|
||||||
|
install Composer packages.
|
||||||
|
|
||||||
|
**amphp:** Better performance under high concurrency thanks to `epoll`/`kqueue`.
|
||||||
|
HTTP/2 multiplexing reduces connection overhead for asset-heavy pages.
|
||||||
|
Required if you need server push or HTTP/2-only clients.
|
||||||
|
|
||||||
|
**Either way:** You can always put Cloudflare, CloudFront, or nginx in front
|
||||||
|
as a reverse proxy. The CDN terminates HTTP/2 (and HTTP/3) for you, forwarding
|
||||||
|
HTTP/1.1 to the backend. In that configuration, the built-in transport is all
|
||||||
|
you need — the CDN handles the protocol upgrade.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 📋 Requirements
|
## 📋 Requirements
|
||||||
|
|
||||||
**For server.php and PHAR:**
|
**For server.php and PHAR:**
|
||||||
|
|||||||
Reference in New Issue
Block a user