# frankenphp **Repository Path**: hk/frankenphp ## Basic Information - **Project Name**: frankenphp - **Description**: No description available - **Primary Language**: PHP - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-06 - **Last Updated**: 2025-10-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ``` . ├── Caddyfile ├── ext.php ├── php.ini ├── public │   └── index.php └── ReadMe.md ``` > Caddyfile ```nginx a.com { tls internal # 启用压缩(可选) encode zstd br gzip # 在当前目录中执行 PHP 文件并提供资源服务 php_server } ``` 根目录下执行 ```bash frankenphp run ``` ``` [root@master1 frankenphp]# curl -I http://a.com/public/index.php HTTP/1.1 308 Permanent Redirect Connection: close Location: https://a.com/public/index.php Server: Caddy Date: Mon, 06 Oct 2025 11:00:56 GMT [root@master1 frankenphp]# curl -I https://a.com/public/index.php HTTP/2 200 alt-svc: h3=":443"; ma=2592000 content-type: text/html; charset=UTF-8 server: Caddy x-powered-by: PHP/8.4.8 date: Mon, 06 Oct 2025 11:03:51 GMT ``` 根目录下执行 ```bash frankenphp php-server --worker ./public/index.php ``` 以此方式启动,**默认不支持HTTPS**。如果想让此命令启动的服务支持HTTPS,可能需要额外的复杂配置,远不如 `run` 命令配 `Caddyfile` 来得直接和强大 ``` [root@master1 frankenphp]# curl -I http://a.com/public/index.php HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Server: Caddy X-Powered-By: PHP/8.4.8 Date: Mon, 06 Oct 2025 11:05:47 GMT [root@master1 frankenphp]# curl -I https://a.com/public/index.php curl: (7) Failed to connect to a.com port 443: Connection refused ``` `run` 和 `frankenphp php-server --worker` 这两个命令的区别,关键在于认清它们一个是**功能完整、面向生产的服务器**,另一个则是**侧重于快速测试和开发的工具**。下面的表格清晰地展示了它们的核心差异。 | 特性维度 | `frankenphp run` (生产级服务器) | `frankenphp php-server --worker` (开发工具) | | :------------- | :------------------------------------------------- | :------------------------------------------ | | **核心定位** | 读取Caddyfile配置,启动功能完整的Caddy服务器 | 快速启动一个内置的简易PHP服务器 | | **配置方式** | 通过`Caddyfile`文件进行灵活、强大的配置 | 通过命令行参数进行简单配置 | | **Worker模式** | 在`Caddyfile`的全局配置块中通过`worker`指令启用 | 通过`--worker`选项直接指定Worker脚本路径 | | **HTTPS支持** | **支持**。可借助Caddy自动配置HTTPS、HTTP/2和HTTP/3 | **通常不支持**,默认以HTTP方式运行 | | **功能完整性** | 功能完整,支持压缩、自动HTTPS等所有Caddy模块 | 功能受限,主要为快速启动和Worker测试 | ### frankenphp run 是一个强大且面向生产的命令,它依赖于 **Caddyfile** 配置文件来工作。它对目录结构没有硬性要求,其行为完全由你的 `Caddyfile` 定义。 不过,遵循一些常见的约定能让配置变得更简单。 下面这个表格梳理了运行 `frankenphp run` 的核心条件与常见项目结构 | 项目 | 说明 | | :--------------------- | :----------------------------------------------------------- | | **必要条件** | 当前工作目录下存在 **`Caddyfile`** | | **常见目录结构** | 项目根目录下包含 `public/` 文件夹,静态资源(CSS, JS, 图片)和 `index.php` 等入口文件通常放置于此。你的PHP源代码、框架文件等可以放在其他目录。 | | **Caddyfile 基础配置** | 1. 在全局配置块 `{ }` 中启用 FrankenPHP:`frankenphp`。 2. 在服务器块(如 `a.com { }`)中使用 `php_server` 指令处理PHP请求。 | | **Worker 模式配置** | 在 `Caddyfile` 的全局配置块 `{ }` 中,使用 `worker` 指令指定启动脚本和进程数。 | #### 指定Caddyfile路径的方法 虽然标准的 `frankenphp run` 命令会在其**启动目录**中查找 `Caddyfile`,但你可以通过以下两种主要方式来指定一个不同的路径: 1. **使用环境变量** 这是最直接和推荐的方法。你可以通过 `CADDY_GLOBAL_OPTIONS` 环境变量来注入 Caddy 的全局选项,其中就包括指定配置文件路径。 **命令示例**: bash ``` CADDY_GLOBAL_OPTIONS="-config /path/to/your/Caddyfile" frankenphp run ``` ## ## `num_threads` 与num区别 ### `num_threads` (全局设置) - **作用范围**:整个 FrankenPHP 服务器的 PHP 线程总数 - **功能**:控制并发处理 HTTP 请求的 PHP 线程数量 - **默认值**:CPU 核心数的 2 倍 ### worker 中的 `num` (工作器设置) - **作用范围**:特定工作器脚本的进程数量 - **功能**:控制运行指定 PHP 脚本的工作进程数量 - **默认值**:CPU 核心数的 2 倍 - **在您的配置中**:设置为 1,意味着只有 1 个进程运行该工作器 ## 联系 ### 资源分配关系 text ``` 总 PHP 线程数 (num_threads: 2) ├── 处理普通 HTTP 请求的线程 └── 工作器进程使用的线程 (worker num: 1) ``` ### 实际运行情况 在您的配置中: - **总并发能力**:2 个 PHP 线程 - **工作器占用**:1 个线程运行 `/var/www/webman-admin/frankenphp/public/index.php` - **剩余能力**:1 个线程可用于处理其他 HTTP 请求 ## 使用场景示例 ``` { frankenphp { num_threads 10 # 总共10个PHP线程 max_threads 20 # 最大扩展到20个线程 } } # 多个工作器配置 worker { file /path/to/queue-worker.php num 3 # 启动3个队列处理进程 } worker { file /path/to/scheduler.php num 2 # 启动2个定时任务进程 } ```