{"id":46668524,"url":"https://github.com/oxphp/oxphp","last_synced_at":"2026-04-02T14:28:42.105Z","repository":{"id":338688674,"uuid":"1152153919","full_name":"oxphp/oxphp","owner":"oxphp","description":"Async PHP application server written in Rust. Replaces nginx + PHP-FPM with a single binary.","archived":false,"fork":false,"pushed_at":"2026-03-27T00:24:45.000Z","size":1758,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-27T10:23:04.762Z","etag":null,"topics":["application-server","async","cloud","docker","http","http-server","http2","hyper","kubernetes","php","php-fpm-alternative","php8","rust","sapi","tokio","zts"],"latest_commit_sha":null,"homepage":"https://oxphp.dev","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oxphp.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-07T12:54:41.000Z","updated_at":"2026-03-27T00:03:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/oxphp/oxphp","commit_stats":null,"previous_names":["oxphp/oxphp"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/oxphp/oxphp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxphp%2Foxphp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxphp%2Foxphp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxphp%2Foxphp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxphp%2Foxphp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oxphp","download_url":"https://codeload.github.com/oxphp/oxphp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxphp%2Foxphp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31308087,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["application-server","async","cloud","docker","http","http-server","http2","hyper","kubernetes","php","php-fpm-alternative","php8","rust","sapi","tokio","zts"],"created_at":"2026-03-08T21:10:35.687Z","updated_at":"2026-04-02T14:28:42.095Z","avatar_url":"https://github.com/oxphp.png","language":"Rust","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"logo.svg\" alt=\"OxPHP\" width=\"300\"\u003e\n\u003c/p\u003e\n\n\u003ch3 align=\"center\"\u003eMultithreaded PHP application server built for cloud-native infrastructure.\u003c/h3\u003e\n\n\u003cp align=\"center\"\u003e\n  OxPHP is an asynchronous PHP application server written in Rust —\u003cbr\u003e\n  built for production workloads that demand low latency, high concurrency, and zero-config observability.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"docs/en/\"\u003eDocs\u003c/a\u003e · \u003ca href=\"docs/ru/\"\u003eRU\u003c/a\u003e · \u003ca href=\"docs/zh/\"\u003e中文\u003c/a\u003e · \u003ca href=\"README.ru.md\"\u003eREADME RU\u003c/a\u003e · \u003ca href=\"README.zh.md\"\u003eREADME 中文\u003c/a\u003e\n  \u003cbr\u003e\n  \u003ca href=\"#quick-start\"\u003eQuick Start\u003c/a\u003e · \u003ca href=\"#why-oxphp\"\u003eWhy OxPHP\u003c/a\u003e · \u003ca href=\"#configuration\"\u003eConfiguration\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"Rust\" src=\"https://img.shields.io/badge/rust-powered-orange\"\u003e\n  \u003cimg alt=\"PHP\" src=\"https://img.shields.io/badge/php-8.4-blue\"\u003e\n  \u003cimg alt=\"License\" src=\"https://img.shields.io/github/license/oxphp/oxphp\"\u003e\n  \u003cimg alt=\"Release\" src=\"https://img.shields.io/github/v/release/oxphp/oxphp\"\u003e\n  \u003cimg alt=\"Stars\" src=\"https://img.shields.io/github/stars/oxphp/oxphp?style=flat\"\u003e\n  \u003cimg alt=\"Docker\" src=\"https://img.shields.io/badge/docker-ghcr.io-2496ED?logo=docker\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"HTTP/2\" src=\"https://img.shields.io/badge/HTTP%2F2-supported-brightgreen\"\u003e\n  \u003cimg alt=\"TLS\" src=\"https://img.shields.io/badge/TLS-1.3-brightgreen\"\u003e\n\u003c/p\u003e\n\n---\n\n## Quick Start\n\nTwo lines. That's it.\n\n```dockerfile\nFROM ghcr.io/oxphp/oxphp:0.2.0\n\nCOPY --chown=www-data:www-data . /var/www/html\n```\n\n\u003e **Note:** By default, `DOCUMENT_ROOT` is `/var/www/html/public`. Place your entry point scripts (e.g. `index.php`) inside the `public/` subdirectory — OxPHP will serve files from there, not from the root of `/var/www/html`. This matches the conventional layout of frameworks like Laravel, Symfony, and Slim out of the box.\n\n```bash\ndocker build -t my-app . \u0026\u0026 docker run -p 8080:8080 my-app\ncurl http://localhost:8080/\n```\n\nNo nginx config. No PHP-FPM pool tuning. No process manager. Just your app.\n\n---\n\n## Why OxPHP?\n\nOxPHP replaces nginx + PHP-FPM with a single container. The server works out of the box — TLS, Brotli compression, rate limiting, Prometheus metrics, health checks, and structured JSON logs are configured via environment variables.\n\n| | nginx + PHP-FPM | FrankenPHP | RoadRunner | **OxPHP** |\n|---|---|---|---|---|\n| Language | C / C | Go + C | Go | **Rust** |\n| HTTP/2 | ✅ | ✅ | ✅ | ✅ |\n| TLS built-in | ✅ | ✅ | ✅ | ✅ (rustls, TLS 1.3) |\n| Worker mode | ❌ | ✅ | ✅ | ✅ |\n| Backpressure / 529 | manual | ❌ | ❌ | ✅ built-in |\n| Prometheus metrics | plugin | plugin | plugin | ✅ built-in |\n| Per-IP rate limiting | nginx module | ❌ | ❌ | ✅ built-in |\n| Custom error pages | ✅ (nginx config) | ✅ (Caddyfile) | ❌ | ✅ preloaded at startup |\n| HTTP/3 | ✅ | ✅ | ✅ experimental | 🔜 roadmap |\n| HTTP 103 Early Hints | ✅ (v1.29+) | ✅ | ✅ | 🔜 roadmap |\n| Memory safety | ❌ | partial | partial | ✅ Rust |\n\nSee the full [documentation](docs/en/index.md) for details.\n\n---\n\n## Benchmarks\n\n\u003e Formal benchmarks are coming soon. We are working on a reproducible test suite covering req/s, latency (p50/p99), memory usage, and worker throughput under concurrent load.\n \n---\n\n## Features\n\n### PHP Runtime\n- **Native PHP execution** via custom SAPI (`oxphp`) with ZTS worker pool\n- **Full superglobals** support: `$_SERVER`, `$_GET`, `$_POST`, `$_COOKIE`, `$_FILES`, `php://input`\n- **HTTP Object API** — `oxphp_http_request()` returns a typed, lazy-loading request object with built-in JSON body parsing, content-detected MIME types for uploads, and a mutable attributes container for middleware; see [HTTP Request API docs](docs/en/php/request-api.md)\n- **Native Rust↔PHP bridge** — zero-serialization via direct `zval` access through C accessor functions\n- **Plugin system** with typed event dispatch, priority ordering, and PHP function registration\n- **Attribute-based decorators** — intercept function/method calls via PHP 8+ attributes with zero overhead on undecorated code; supports `TARGET_FUNCTION`, `TARGET_METHOD`, `TARGET_CLASS`\n- **Panic isolation** via `catch_unwind` — a PHP crash does not take down the server\n\n### Worker Model\n- **Worker mode** — persistent PHP processes with soft reset, keeping autoloaders and DB connections alive across requests\n- **Fiber multiplexing** — each worker handles multiple concurrent requests via PHP 8.4 Fibers; `oxphp_sleep()` and `oxphp_async_await()` yield the fiber instead of blocking the worker\n- **Automatic recycling** by request count or memory threshold\n- **Worker health monitoring** — dead workers are automatically detected and respawned\n- **Early response** via `oxphp_finish_request()` — send the response and keep running background work\n\n### Async Promises\n- **`oxphp_async()` / `oxphp_async_await()`** — dispatch closures to a dedicated thread pool for true parallel execution\n- **Portable serialization** for `use` variables, arguments, and return values — safe cross-thread binary transfer\n- Supported types: scalars, strings, arrays (nested). Resources and objects rejected with `E_WARNING`\n- **Exception \u0026 die() safety** — exceptions, `die()`, and `exit()` are caught and re-thrown as `OxPHP\\AsyncException`\n- **Timeout support** — per-task timeouts with `OxPHP\\AsyncTimeoutException`\n- **`oxphp_async_await_all()` / `oxphp_async_await_any()`** — batch and race primitives\n\n### HTTP \u0026 Networking\n- **HTTP/1.1 + HTTP/2** auto-detection (h2c) via hyper\n- **TLS 1.3** with ALPN (h2 + http/1.1) via rustls\n- **3 routing modes** — Traditional, Framework (`index.php`), SPA (`index.html`)\n- **SSE streaming** via `Content-Type: text/event-stream` auto-detection or `oxphp_stream_flush()` — cooperative with fiber multiplexing\n- **Configurable timeouts** — header read, request, and keep-alive\n\n### Performance\n- **LRU file cache** for static files (in-memory ≤1 MB, streaming for larger)\n- **HTTP caching** with ETag, Last-Modified, and 304 Not Modified\n- **Brotli compression** for text responses (256 B – 3 MB range)\n- **mimalloc** allocator for lower allocation latency under contention\n- **Configurable Tokio runtime** — multi-threaded by default (CPU/2), tunable via `TOKIO_WORKERS`\n\n### Observability\n- **W3C Trace Context** — automatic `traceparent`/`tracestate` propagation, `$_SERVER['OXPHP_TRACE_ID']` for PHP log correlation\n- **OpenTelemetry** — OTLP span export (gRPC/HTTP) with semantic conventions, configurable sampling, batch processing\n- **APM auto-instrumentation** — 33 internal PHP functions (PDO, mysqli, cURL, Redis, Memcached, file I/O) hooked at the engine level; every call becomes a span with zero code changes\n- **`#[OxPHP\\Tracing\\Trace]` decorator** — annotate any function or method with a PHP 8 attribute to create spans automatically\n- **PHP tracing SDK** — 10 `oxphp_trace_*()` functions for manual span creation, attributes, events, error recording, and trace context propagation\n- **Prometheus metrics** at `/metrics` — per-worker, zero dependencies\n- **Health check** at `/health` — ready for K8s readiness probes\n- **Structured error logging** — PHP errors routed through `tracing` with `php_error_type`, `php_file`, `php_line`\n- **JSON access logging** with optional `trace_id`/`span_id` fields (levels: `all`, `error`, off via `ACCESS_LOG`)\n- **Request ID** generation + pass-through (`X-Request-ID`); trace-derived when OTel enabled\n\n### Reliability \u0026 Operations\n- **Bounded request queue** with 529 backpressure when full\n- **Per-IP rate limiting** with `X-RateLimit-*` headers and 429 responses\n- **Custom error pages** — pre-loaded at startup, zero I/O on the hot path\n- **Path traversal protection** with symlink escape detection\n- **Non-root container** execution as www-data (UID 82)\n\n---\n\n## Architecture\n\n```\n                    ┌──────────────┐\n                    │  Tokio async │  configurable: single- or multi-threaded\n                    │  HTTP server │  (hyper + hyper-util + mimalloc)\n                    └──────┬───────┘\n                           │\n                    ┌──────▼───────┐\n                    │Route dispatch│  static file / PHP / 404\n                    └──────┬───────┘\n              ┌────────────┼────────────┐\n              ▼            ▼            ▼\n         Static file   PHP request   Not found\n         (LRU cache)   (channel)      (404)\n                           │\n                    ┌──────▼───────┐\n                    │Bounded queue │  crossbeam bounded channel\n                    │(backpressure)│  529 when full\n                    └──────┬───────┘\n                           │\n              ┌────────────┼────────────┐\n              ▼            ▼            ▼\n         PHP Worker   PHP Worker   PHP Worker    OS threads (ZTS)\n         (SAPI exec)  (SAPI exec)  (SAPI exec)   with thread-local state\n         ──────────────────┬──────────────────\n                           │\n                    ┌──────▼───────┐\n                    │ Async pool   │  oxphp_async() / oxphp_async_await()\n                    │(crossbeam ch)│  dedicated OS threads (ZTS)\n                    └──────┬───────┘\n              ┌────────────┼────────────┐\n              ▼            ▼            ▼\n         Async Worker  Async Worker  Async Worker\n```\n\n- **Tokio async runtime** — multi-threaded by default, tunable via `TOKIO_WORKERS`\n- **ZTS worker pool** — each worker is a dedicated OS thread with `catch_unwind` isolation\n- Workers receive requests via `crossbeam::bounded`, respond via `ExecuteResult` (immediate or deferred via `oneshot`)\n- **Async pool** — separate OS threads for `oxphp_async()` tasks, preventing deadlocks with the HTTP pool\n- **Worker mode** — persistent PHP with soft reset; keeps bootstrap state (autoloaders, DB connections) alive\n\n### Internal Server\n\nWhen `INTERNAL_ADDR` is set, a lightweight HTTP server starts on a separate port:\n\n| Endpoint | Description |\n|----------|-------------|\n| `GET /health` | JSON health status (uptime, requests, connections) |\n| `GET /metrics` | Prometheus text format metrics |\n| `GET /config` | JSON runtime configuration (TLS paths redacted) |\n\n---\n\n## Configuration\n\nAll settings are via environment variables — no config files required.\n\n| Variable | Default | Description |\n|---|---|---|\n| `LISTEN_ADDR` | `0.0.0.0:8080` | Address and port to bind |\n| `DOCUMENT_ROOT` | `/var/www/html/public` | Filesystem path to serve files from |\n| `INDEX_FILE` | *(unset)* | Routing mode: empty = Traditional, `index.php` = Framework, `index.html` = SPA |\n| `TOKIO_WORKERS` | `0` (CPU / 2, min 1) | Async I/O threads; `0` = auto |\n| `EXECUTOR` | `sapi` | PHP executor: `sapi` (real PHP) or `stub` (test mode) |\n| `PHP_WORKERS` | `0` (CPU / 2, min 1) | Worker pool: `N` = fixed, `MIN:MAX` = dynamic, `0` = auto |\n| `PHP_WORKERS_IDLE_SECONDS` | `30` | Idle timeout before retiring a dynamic worker |\n| `QUEUE_CAPACITY` | `PHP_WORKERS * 128` | Bounded channel size; 529 when full |\n| `DRAIN_TIMEOUT_SECONDS` | `30` | Graceful shutdown drain timeout |\n| `LOG_LEVEL` | `info` | Tracing verbosity: `error`, `warn`, `info`, `debug`, `trace` |\n| `INTERNAL_ADDR` | *(unset)* | Internal server for health/metrics/config (e.g. `0.0.0.0:9090`) |\n| `RATE_LIMIT` | `0` (off) | Max requests per IP per window |\n| `RATE_WINDOW_SECONDS` | `60` | Rate limit window in seconds |\n| `HEADER_TIMEOUT_SECONDS` | `5` | Header read timeout (Slowloris protection) |\n| `REQUEST_TIMEOUT_SECONDS` | `120` | Overall request timeout; 0 = disabled |\n| `TLS_CERT` | *(unset)* | Path to TLS certificate PEM file |\n| `TLS_KEY` | *(unset)* | Path to TLS private key PEM file |\n| `ERROR_PAGES_DIR` | *(unset)* | Directory with custom error pages (`{status}.html`) |\n| `STATIC_CACHE_TTL` | `30d` | Static file cache TTL (`30s`, `5m`, `2h`, `30d`, `1y`, `off`) |\n| `STATIC_CACHE` | *(on)* | Set to `off` to enable mtime revalidation on the in-memory content cache |\n| `COMPRESSION_LEVEL` | `4` | Brotli quality (0 = off, 1–11) |\n| `ACCESS_LOG` | *(off)* | Per-request JSON log: `all`, `error`, or unset |\n| `MAX_CONNECTIONS` | `10000` | Maximum concurrent connections |\n| `WORKER_FILE` | *(unset)* | Path to worker PHP script; enables persistent worker mode |\n| `WORKER_MAX_REQUESTS` | `0` (unlimited) | Max requests per worker before recycling |\n| `WORKER_MAX_MEMORY_MIB` | `0` (unlimited) | Max memory (MiB) per worker before recycling |\n| `ASYNC_WORKERS` | `0` (disabled) | Dedicated async worker threads for `oxphp_async()` |\n| `ASYNC_QUEUE_CAPACITY` | `ASYNC_WORKERS * 64` | Bounded queue for async tasks; rejected when full |\n| `SPLIT_PATH_INFO_ENABLED` | `false` | PATH_INFO splitting for `/script.php/extra/path` URIs (legacy CGI compat) |\n| `TRACE_CONTEXT` | `false` | W3C Trace Context propagation (`traceparent`/`tracestate`). Auto-enabled when `OTEL_ENABLED=true` |\n\n### OpenTelemetry (`plugin-otel` feature)\n\n| Variable | Default | Description |\n|---|---|---|\n| `OTEL_ENABLED` | `false` | Enable span export. Implies `TRACE_CONTEXT=true` |\n| `OTEL_EXPORTER_OTLP_ENDPOINT` | `http://localhost:4317` | OTLP collector endpoint |\n| `OTEL_EXPORTER_OTLP_PROTOCOL` | `grpc` | Export protocol: `grpc` (port 4317) or `http/protobuf` (port 4318) |\n| `OTEL_EXPORTER_OTLP_TIMEOUT` | `10000` | Export timeout in milliseconds |\n| `OTEL_EXPORTER_OTLP_HEADERS` | *(unset)* | Auth headers for hosted backends (`key=value,key=value`) |\n| `OTEL_SERVICE_NAME` | `oxphp` | Service name in exported traces |\n| `OTEL_SERVICE_VERSION` | *(unset)* | Service version in exported traces |\n| `OTEL_RESOURCE_ATTRIBUTES` | *(unset)* | Resource attributes (`key=value,key=value`) |\n| `OTEL_TRACES_SAMPLER` | `parentbased_traceidratio` | Sampler: `always_on`, `always_off`, `traceidratio`, `parentbased_traceidratio` |\n| `OTEL_TRACES_SAMPLER_ARG` | `1.0` | Sampling ratio (0.0–1.0) |\n\n### APM (`plugin-apm` feature)\n\n| Variable | Default | Description |\n|---|---|---|\n| `OTEL_APM_ENABLED` | `false` | Enable APM: auto-instrumentation, error capture, PHP tracing SDK. Requires `OTEL_ENABLED=true` |\n| `OTEL_APM_SLOW_QUERY_MS` | `100` | Slow query threshold (ms). Queries above this get `oxphp.db.slow=true` |\n| `OTEL_APM_DB_CAPTURE_PARAMS_ENABLED` | `false` | Record bind parameters in `db.params` span attribute |\n\n---\n\n## Build\n\n```bash\n# Host (without PHP — all tests pass, no PHP execution)\ncargo build --release\n\n# Docker (with PHP — full functionality)\ndocker compose build\n```\n\n### Run locally (static files only)\n\n```bash\nDOCUMENT_ROOT=./www/public ./target/release/oxphp\n```\n\n## Development\n\n```bash\n# Full verification (host)\ncargo fmt -- --check \u0026\u0026 cargo clippy --no-default-features -- -D warnings \u0026\u0026 cargo test --no-default-features\n\n# Docker smoke tests\ndocker compose build \u0026\u0026 docker compose up -d\ncurl http://localhost:8080/\ncurl \"http://localhost:8080/test_superglobals.php?foo=bar\"\ncurl -X POST -d \"key=value\" http://localhost:8080/test_superglobals.php\ncurl -H \"Cookie: session=abc\" http://localhost:8080/test_superglobals.php\n\n# Async promises\ncurl http://localhost:8080/test_async.php\ncurl http://localhost:8080/test_async_parallel.php\ncurl http://localhost:8080/test_async_die.php\n\n# Internal server\nINTERNAL_ADDR=127.0.0.1:9090 ./target/release/oxphp \u0026\ncurl http://localhost:9090/health\ncurl http://localhost:9090/metrics\n```\n\n---\n\n## Roadmap\n\n\u003e Items are not ordered by priority. Presence on this list does not guarantee implementation.\n\n| Feature | Description |\n|---|---|\n| **PHP 8.5** | Support for PHP 8.5 |\n| ~~**Trace Context (W3C)**~~ | ✅ Implemented — automatic propagation of `traceparent` / `tracestate` headers (W3C spec), enabled via `TRACE_CONTEXT=true` |\n| ~~**OpenTelemetry**~~  | ✅ Implemented — OTLP trace export via `plugin-otel` feature, W3C context propagation, per-request spans with standard semantic conventions |\n| ~~**APM \u0026 Auto-Instrumentation**~~ | ✅ Implemented — `plugin-apm` feature: automatic tracing of 33 internal PHP functions (PDO, mysqli, cURL, Redis, Memcached, file I/O), `#[OxPHP\\Tracing\\Trace]` decorator, 10 `oxphp_trace_*()` SDK functions, PHP error capture |\n| **Custom Metrics** | PHP API for registering application-defined Prometheus metrics from userland code |\n| **Built-in PHP Profiler** | Low-overhead profiling via attribute decorators (`#[Timer]`, `#[Span]`), integrated with server metrics and tracing |\n| **Dockerfile.bookworm** | Official Debian Bookworm-based image as an alternative to Alpine |\n| **Non-Docker Install** | Native installation via system package managers (apt, brew, etc.) |\n| **HTTP/3** | QUIC-based HTTP/3 support |\n| **HTTP 103 Early Hints** | Send `103 Early Hints` responses to allow clients to preload resources before the final response |\n| **Ecosystem Plugins** | Expanded plugin system: more lifecycle hooks, richer PHP API, and documentation for third-party plugin authors |\n| ~~**Shared Async Runtime**~~ | ✅ Implemented — Tokio runtime powers `oxphp_async()` / `oxphp_async_await()` with timeouts, result delivery, and race coordination |\n| **Database Connection Pool** | Built-in connection pooling via `sqlx`, reducing per-request connection overhead |\n| **gRPC Server** | *(speculative)* An alternative server mode — gRPC instead of HTTP; very uncertain, may not happen |\n| ~~**Promise API**~~ | ✅ Implemented — `oxphp_async()` / `oxphp_async_await()` with dedicated thread pool, portable serialization, and exception safety |\n| ~~**Fiber Multiplexing**~~ | ✅ Implemented — each worker handles multiple concurrent requests via PHP 8.4 Fibers; `oxphp_sleep()` / `oxphp_usleep()` and `oxphp_async_await()` yield the fiber cooperatively |\n| **Diagnostics** | Production doctor: checks OS limits (ulimit, TCP backlog, epoll/kqueue, container settings), identifies performance bottlenecks (worker queue depth, lock contention, GC/alloc pressure, ZTS stats), and gives specific actionable recommendations |\n\n## Documentation\n\n- [English](docs/en/)\n- [Русский](docs/ru/)\n- [中文](docs/zh/)\n\n## License\n\n[AGPL-3.0](LICENSE)","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foxphp%2Foxphp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foxphp%2Foxphp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foxphp%2Foxphp/lists"}