Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs: translated in Chinese #597

Merged
merged 4 commits into from
Feb 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions docs/cn/README.md
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)
104 changes: 104 additions & 0 deletions docs/cn/compile.md
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\'"'`
> (根据您的应用需求更改堆栈大小的值)。
154 changes: 154 additions & 0 deletions docs/cn/config.md
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
```
Loading
Loading