-
-
Notifications
You must be signed in to change notification settings - Fork 238
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* docs: translated in Chinese * fix: readme md links and duplicate images * docs: lint and remove outdated parts --------- Co-authored-by: Pierre Clavequin <[email protected]> Co-authored-by: ginifizz <[email protected]> Co-authored-by: Kévin Dunglas <[email protected]>
- Loading branch information
1 parent
b71dae9
commit 2c6e201
Showing
13 changed files
with
1,196 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
# FrankenPHP: 适用于 PHP 的现代应用服务器 | ||
|
||
<h1 align="center"><a href="https://frankenphp.dev"><img src="frankenphp.png" alt="FrankenPHP" width="600"></a></h1> | ||
|
||
FrankenPHP 是建立在 [Caddy](https://caddyserver.com/) Web 服务器之上的现代 PHP 应用程序服务器。 | ||
|
||
FrankenPHP 凭借其令人惊叹的功能为您的 PHP 应用程序提供了超能力:[早期提示](early-hints.md)、[worker 模式](worker.md)、[实时功能](mercure.md)、自动 HTTPS、HTTP/2 和 HTTP/3 支持...... | ||
|
||
FrankenPHP 可与任何 PHP 应用程序一起使用,并且由于提供了与 worker 模式的集成,使您的 Symfony 和 Laravel 项目比以往任何时候都更快。 | ||
|
||
FrankenPHP 也可以用作独立的 Go 库,将 PHP 嵌入到任何使用 net/http 的应用程序中。 | ||
|
||
[**了解更多** *frankenphp.dev*](https://frankenphp.dev/cn) 以及在以下地址中: | ||
|
||
<a href="https://dunglas.dev/2022/10/frankenphp-the-modern-php-app-server-written-in-go/"><img src="https://dunglas.dev/wp-content/uploads/2022/10/frankenphp.png" alt="Slides" width="600"></a> | ||
|
||
## 开始 | ||
|
||
### Docker | ||
|
||
```console | ||
docker run -v $PWD:/app/public \ | ||
-p 80:80 -p 443:443 -p 443:443/udp \ | ||
dunglas/frankenphp | ||
``` | ||
|
||
访问 `https://localhost`, 并享受吧! | ||
|
||
> [!提示] | ||
> | ||
> 不要尝试使用 `https://127.0.0.1`。使用 `localhost` 并接受自签名证书。 | ||
> 使用 [`SERVER_NAME` 环境变量](config.md#环境变量) 更改要使用的域。 | ||
### 独立二进制 | ||
|
||
如果您不想使用 Docker,我们为 Linux 和 macOS 提供独立的 FrankenPHP 二进制文件 | ||
包含 [PHP 8.3](https://www.php.net/releases/8.3/en.php) 和最流行的 PHP 扩展:[下载 FrankenPHP](https://github.com/dunglas/frankenphp/releases) | ||
|
||
若要启动当前目录的内容,请运行: | ||
|
||
```console | ||
./frankenphp php-server | ||
``` | ||
|
||
您还可以使用以下命令运行命令行脚本: | ||
|
||
```console | ||
./frankenphp php-cli /path/to/your/script.php | ||
``` | ||
|
||
## 文档 | ||
|
||
* [worker 模式](worker.md) | ||
* [早期提示支持(103 HTTP status code)](early-hints.md) | ||
* [实时功能](mercure.md) | ||
* [配置](config.md) | ||
* [Docker 镜像](docker.md) | ||
* [在生产环境中部署](production.md) | ||
* [创建独立、可自行执行的 PHP 应用程序](embed.md) | ||
* [创建静态二进制文件](static.md) | ||
* [从源代码编译](compile.md) | ||
* [Laravel 集成](laravel.md) | ||
* [已知问题](known-issues.md) | ||
* [演示应用程序 (Symfony) 和基准测试](https://github.com/dunglas/frankenphp-demo) | ||
* [Go 库文档](https://pkg.go.dev/github.com/dunglas/frankenphp) | ||
* [贡献和调试](https://frankenphp.dev/docs/contributing/) | ||
|
||
## 示例和框架 | ||
|
||
* [Symfony](https://github.com/dunglas/symfony-docker) | ||
* [API Platform](https://api-platform.com/docs/distribution/) | ||
* [Laravel](laravel.md) | ||
* [Sulu](https://sulu.io/blog/running-sulu-with-frankenphp) | ||
* [WordPress](https://github.com/dunglas/frankenphp-wordpress) | ||
* [Drupal](https://github.com/dunglas/frankenphp-drupal) | ||
* [Joomla](https://github.com/alexandreelise/frankenphp-joomla) | ||
* [TYPO3](https://github.com/ochorocho/franken-typo3) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
# 从源代码编译 | ||
|
||
本文档解释了如何创建一个 FrankenPHP 构建,它将 PHP 加载为一个动态库。 | ||
这是推荐的方法。 | ||
|
||
或者,[创建静态构建](static.md)也是可能的。 | ||
|
||
## 安装 PHP | ||
|
||
FrankenPHP 与 PHP 8.2 及更高版本兼容。 | ||
|
||
首先,[获取PHP的源代码](https://www.php.net/downloads.php)并提取它们: | ||
|
||
```console | ||
tar xf php-* | ||
cd php-*/ | ||
``` | ||
|
||
然后,为您的平台配置 PHP: | ||
|
||
### Linux | ||
|
||
```console | ||
./configure \ | ||
--enable-embed \ | ||
--enable-zts \ | ||
--disable-zend-signals \ | ||
--enable-zend-max-execution-timers | ||
``` | ||
|
||
最后,编译并安装 PHP: | ||
|
||
```console | ||
make -j$(nproc) | ||
sudo make install | ||
``` | ||
|
||
### Mac | ||
|
||
使用 [Homebrew](https://brew.sh/) 包管理器安装 | ||
`libiconv`, `bison`, `re2c` 和 `pkg-config`: | ||
|
||
```console | ||
brew install libiconv bison re2c pkg-config | ||
echo 'export PATH="/opt/homebrew/opt/bison/bin:$PATH"' >> ~/.zshrc | ||
``` | ||
|
||
然后运行配置脚本: | ||
|
||
```console | ||
./configure \ | ||
--enable-embed=static \ | ||
--enable-zts \ | ||
--disable-zend-signals \ | ||
--disable-opcache-jit \ | ||
--enable-static \ | ||
--enable-shared=no \ | ||
--with-iconv=/opt/homebrew/opt/libiconv/ | ||
``` | ||
|
||
这些标志是必需的,但您可以添加其他标志(例如额外的扩展) | ||
如果需要。 | ||
|
||
最后,编译并安装 PHP: | ||
|
||
```console | ||
make -j$(sysctl -n hw.logicalcpu) | ||
sudo make install | ||
``` | ||
|
||
## 编译 Go 应用 | ||
|
||
您现在可以使用 Go 库并编译我们的 Caddy 构建: | ||
|
||
```console | ||
curl -L https://github.com/dunglas/frankenphp/archive/refs/heads/main.tar.gz | tar x | ||
cd frankenphp-main/caddy/frankenphp | ||
CGO_CFLAGS=$(php-config --includes) CGO_LDFLAGS="$(php-config --ldflags) $(php-config --libs)" go build | ||
``` | ||
|
||
### 使用 xcaddy | ||
|
||
或者,使用 [xcaddy](https://github.com/caddyserver/xcaddy) 用 [自定义 Caddy 模块](https://caddyserver.com/docs/modules/) 编译 FrankenPHP: | ||
|
||
```console | ||
CGO_ENABLED=1 \ | ||
XCADDY_GO_BUILD_FLAGS="-ldflags '-w -s'" \ | ||
xcaddy build \ | ||
--output frankenphp \ | ||
--with github.com/dunglas/frankenphp/caddy \ | ||
--with github.com/dunglas/mercure/caddy \ | ||
--with github.com/dunglas/vulcain/caddy | ||
# Add extra Caddy modules here | ||
``` | ||
|
||
> [!提示] | ||
> | ||
> 如果您使用的是 musl libc(Alpine Linux 上的默认值)和 Symfony, | ||
> 您可能需要增加默认堆栈大小。 | ||
> 否则,您可能会收到如下错误 `PHP Fatal error: Maximum call stack size of 83360 bytes reached during compilation. Try splitting expression` | ||
> | ||
> 为此,请将 `XCADDY_GO_BUILD_FLAGS` 环境变量更改为类似 | ||
> `XCADDY_GO_BUILD_FLAGS=$'-ldflags "-w -s -extldflags \'-Wl,-z,stack-size=0x80000\'"'` | ||
> (根据您的应用需求更改堆栈大小的值)。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
# 配置 | ||
|
||
FrankenPHP,Caddy 以及 Mercure 和 Vulcain 模块可以使用 [Caddy 支持的格式](https://caddyserver.com/docs/getting-started#your-first-config) 进行配置。 | ||
|
||
在 Docker 镜像中,`Caddyfile` 位于 `/etc/caddy/Caddyfile`。 | ||
|
||
您也可以像往常一样使用 `php.ini` 配置 PHP。 | ||
|
||
在 Docker 镜像中,`php.ini` 文件不存在,您可以手动创建它或 `复制`。 | ||
|
||
```dockerfile | ||
FROM dunglas/frankenphp | ||
|
||
# 开发: | ||
RUN cp $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini | ||
|
||
# 还是生产: | ||
RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini | ||
``` | ||
|
||
## Caddyfile 配置 | ||
|
||
要注册 FrankenPHP 执行器,必须设置 `frankenphp` [全局选项](https://caddyserver.com/docs/caddyfile/concepts#global-options),然后可以在站点块中使用 `php_server` 或 `php` [HTTP 指令](https://caddyserver.com/docs/caddyfile/concepts#directives)来为您的 PHP 应用程序提供服务。 | ||
|
||
极小示例: | ||
|
||
```caddyfile | ||
{ | ||
# 启用 FrankenPHP | ||
frankenphp | ||
# 配置何时必须执行指令 | ||
order php_server before file_server | ||
} | ||
localhost { | ||
# 启用压缩(可选) | ||
encode zstd br gzip | ||
# 执行当前目录中的 PHP 文件并提供资产 | ||
php_server | ||
} | ||
``` | ||
|
||
或者,可以在全局选项下指定要创建的线程数和要从服务器启动的 [worker scripts](worker.md)。 | ||
|
||
```caddyfile | ||
{ | ||
frankenphp { | ||
num_threads <num_threads> # 设置要启动的 PHP 线程数。默认值:可用 CPU 数量的 2 倍。 | ||
worker { | ||
file <path> # 设置 worker 脚本的路径。 | ||
num <num> # 设置要启动的 PHP 线程数,默认为可用 CPU 数的 2 倍。 | ||
env <key> <value> # 将额外的环境变量设置为给定值。可以为多个环境变量多次指定。 | ||
} | ||
} | ||
} | ||
# ... | ||
``` | ||
|
||
或者,您可以使用 `worker` 选项的一行缩写形式: | ||
|
||
```caddyfile | ||
{ | ||
frankenphp { | ||
worker <file> <num> | ||
} | ||
} | ||
# ... | ||
``` | ||
|
||
如果在同一服务器上提供多个应用,还可以定义多个 worker: | ||
|
||
```caddyfile | ||
{ | ||
frankenphp { | ||
worker /path/to/app/public/index.php <num> | ||
worker /path/to/other/public/index.php <num> | ||
} | ||
} | ||
app.example.com { | ||
root * /path/to/app/public | ||
php_server | ||
} | ||
other.example.com { | ||
root * /path/to/other/public | ||
php_server | ||
} | ||
... | ||
``` | ||
|
||
使用 `php_server` 指令通常是您需要的, | ||
但是,如果您需要完全控制,则可以使用较低级别的 `php` 指令: | ||
|
||
使用 `php_server` 指令等效于以下配置: | ||
|
||
```caddyfile | ||
route { | ||
# 为目录请求添加尾部斜杠 | ||
@canonicalPath { | ||
file {path}/index.php | ||
not path */ | ||
} | ||
redir @canonicalPath {path}/ 308 | ||
# 如果请求的文件不存在,请尝试 index 文件 | ||
@indexFiles file { | ||
try_files {path} {path}/index.php index.php | ||
split_path .php | ||
} | ||
rewrite @indexFiles {http.matchers.file.relative} | ||
# FrankenPHP! | ||
@phpFiles path *.php | ||
php @phpFiles | ||
file_server | ||
} | ||
``` | ||
|
||
`php_server` 和 `php` 指令具有以下选项: | ||
|
||
```caddyfile | ||
php_server [<matcher>] { | ||
root <directory> # 设置站点的根文件夹。默认值:`root` 指令。 | ||
split_path <delim...> # 设置用于将 URI 拆分为两部分的子字符串。第一个匹配的子字符串将用于从路径中拆分“路径信息”。第一个部分以匹配的子字符串为后缀,并将假定为实际资源(CGI 脚本)名称。第二部分将设置为PATH_INFO,供 脚本使用。默认值:`.php` | ||
resolve_root_symlink # 允许通过计算符号链接(如果存在)将 `根` 目录解析为其实际值。 | ||
env <key> <value> # 将额外的环境变量设置为给定值。可以为多个环境变量多次指定。 | ||
} | ||
``` | ||
|
||
## 环境变量 | ||
|
||
以下环境变量可用于在 `Caddyfile` 中注入 Caddy 指令,而无需对其进行修改: | ||
|
||
* `SERVER_NAME`: 更改 [要监听的地址](https://caddyserver.com/docs/caddyfile/concepts#addresses),提供的主机名也将用于生成的 TLS 证书 | ||
* `CADDY_GLOBAL_OPTIONS`: 注入 [全局选项](https://caddyserver.com/docs/caddyfile/options) | ||
* `FRANKENPHP_CONFIG`: 在 `frankenphp` 指令下注入配置 | ||
|
||
## PHP 配置 | ||
|
||
要加载[其他PHP配置文件](https://www.php.net/manual/en/configuration.file.php#configuration.file.scan), | ||
可以使用 `PHP_INI_SCAN_DIR` 环境变量。 | ||
设置后,PHP 将加载给定目录中存在 `.ini` 扩展名的所有文件。 | ||
|
||
## 启用调试模式 | ||
|
||
使用 Docker 镜像时,将 `CADDY_GLOBAL_OPTIONS` 环境变量设置为 `debug` 以启用调试模式: | ||
|
||
```console | ||
docker run -v $PWD:/app/public \ | ||
-e CADDY_GLOBAL_OPTIONS=debug \ | ||
-p 80:80 -p 443:443 -p 443:443/udp \ | ||
dunglas/frankenphp | ||
``` |
Oops, something went wrong.