A high-performance QUIC-enabled PHP server written in Zig that compiles to a single static binary. Supports Linux, Windows, and WebAssembly targets.
- QUIC Protocol Support: Built-in HTTP/3 over QUIC for improved performance
- Single Static Binary: No dependencies, runs anywhere
- Custom Routing:
_index.phpfiles provide directory-level routing - Multi-Platform: Linux, Windows (.exe), and WebAssembly builds
- Daemon Mode: Built-in daemonization support
- Thread Pool: Concurrent request handling
- PHP Extensions: Custom QUIC functions available in PHP
Key Features:
Single Static Binary - Compiles to indexphp (Linux) or indexphp.exe (Windows) QUIC Protocol Support - Built-in HTTP/3 over QUIC using Cloudflare's Quiche Custom Routing - _index.php files in directories provide custom routing logic Multi-Platform - Supports Linux, Windows, and WebAssembly builds Daemon Mode - Built-in daemonization for production deployment PHP Integration - Embeds PHP directly with custom QUIC functions
Architecture:
Zig for the core server and system programming Quiche (Rust) for QUIC protocol implementation PHP Embed SAPI for executing PHP code Custom PHP Extension providing QUIC-specific functions
Build Process: bash# Static Linux binary ./scripts/build_static.sh
zig build -Dtarget=x86_64-windows
./scripts/build_wasm.sh Usage: bash# Serve current directory with QUIC ./indexphp
./indexphp --root /var/www --port 4433 --workers 8 The system provides high-performance PHP execution with QUIC streaming capabilities, making it ideal for real-time applications, APIs, and modern web services. The single binary approach means easy deployment without dependencies.
- Zig 0.11.0 or later
- PHP 8.3+ development headers
- OpenSSL development libraries
- Rust toolchain (for Quiche)
chmod +x scripts/build_static.sh
./scripts/build_static.shThis creates a fully static indexphp binary in the dist/ directory.
zig build -Dtarget=x86_64-windows -Doptimize=ReleaseSafeCreates indexphp.exe.
chmod +x scripts/build_wasm.sh
./scripts/build_wasm.shCreates WASM modules and JavaScript runtime.
# Serve current directory on QUIC port 4433
./indexphp
# Serve specific directory
./indexphp --root /var/www --port 8080
# Run in foreground (no daemon)
./indexphp --no-daemon
# Use HTTP instead of QUIC
./indexphp --http --port 8080--port, -p: Port to listen on (default: 4433)--host, -h: Host to bind to (default: 0.0.0.0)--root, -r: Root directory to serve (default: .)--no-daemon: Run in foreground--workers, -w: Number of worker threads (default: 4)--http: Use HTTP instead of QUIC
Each directory can contain a _index.php file that handles routing for that directory and its subdirectories:
<?php
// /api/_index.php
$path = $_SERVER['REQUEST_URI'];
if (preg_match('/^\/api\/v1\/(.+)$/', $path, $matches)) {
$endpoint = $matches[1];
// Route to appropriate handler
switch ($endpoint) {
case 'users':
require __DIR__ . '/handlers/users.php';
break;
case 'posts':
require __DIR__ . '/handlers/posts.php';
break;
default:
http_response_code(404);
echo json_encode(['error' => 'Endpoint not found']);
}
exit;
}
?>IndexPHP provides custom PHP functions for QUIC functionality:
<?php
// Broadcast data to all connected QUIC streams
quic_broadcast("Hello, QUIC world!");
// Send data to specific stream
quic_send_stream($stream_id, "Stream-specific data");
// Get connection information
$info = quic_get_connection_info();
/*
Array(
'protocol' => 'QUIC',
'version' => '1',
'connected' => true,
'streams_active' => 5
)
*/
?>mysite/
├── index.php # Homepage
├── about.php # About page
├── api/
│ ├── _index.php # API router
│ └── handlers/ # API handlers
├── static/
│ ├── css/ # CSS files
│ ├── js/ # JavaScript files
│ └── images/ # Images
└── _index.php # Global router
<?php
// stream.php - Real-time data streaming
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while (true) {
$data = [
'time' => microtime(true),
'value' => rand(0, 100)
];
// Use QUIC broadcast for efficient streaming
quic_broadcast(json_encode($data));
echo "data: " . json_encode($data) . "\n\n";
ob_flush();
flush();
usleep(100000); // 100ms
}
?><!DOCTYPE html>
<html>
<head>
<title>IndexPHP WASM Demo</title>
<script type="module">
import IndexPHP from './indexphp.js';
const server = new IndexPHP();
await server.init();
// Upload your PHP files
await server.fs.writeFile('/index.php', `<?php
echo "<h1>Running PHP in the browser!</h1>";
echo "<p>Powered by IndexPHP WASM</p>";
?>`);
// Server is now running in your browser!
</script>
</head>
<body>
<h1>IndexPHP WASM</h1>
</body>
</html>IndexPHP achieves high performance through:
- QUIC Protocol: Reduced latency, multiplexed streams
- Zero-Copy Operations: Efficient memory usage
- Thread Pool: Concurrent request handling
- Static Binary: No dynamic linking overhead
- Compiled Routing: Fast path resolution
Benchmarks (on typical hardware):
- Static files: 100k+ requests/second
- PHP execution: 20k+ requests/second
- QUIC streaming: 1M+ messages/second
- Automatic HTTPS with QUIC
- Path traversal protection
- Process isolation in daemon mode
- Configurable worker limits
MIT License
Pull requests welcome! Please ensure:
- Code passes
zig fmt - Tests pass with
zig build test - Static analysis clean