Skip to content
Open
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
25 changes: 16 additions & 9 deletions docs/cn/worker.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,13 @@ frankenphp php-server --worker /path/to/your/worker/script.php
frankenphp php-server --worker /path/to/your/worker/script.php --watch="/path/to/your/app/**/*.php"
```

此功能通常与[热重载](hot-reload.md)结合使用。

## Symfony Runtime

> [!TIP]
> 以下部分仅在 Symfony 7.4 之前是必需的,因为 Symfony 7.4 引入了对 FrankenPHP worker 模式的原生支持。

FrankenPHP 的 worker 模式由 [Symfony Runtime Component](https://symfony.com/doc/current/components/runtime.html) 支持。
要在 worker 中启动任何 Symfony 应用程序,请安装 [PHP Runtime](https://github.com/php-runtime/runtime) 的 FrankenPHP 包:

Expand Down Expand Up @@ -67,9 +72,6 @@ docker run \
<?php
// public/index.php

// 防止客户端连接中断时 worker 脚本终止
ignore_user_abort(true);

// 启动你的应用程序
require __DIR__.'/vendor/autoload.php';

Expand All @@ -78,9 +80,15 @@ $myApp->boot();

// 在循环外的处理器以获得更好的性能(减少工作量)
$handler = static function () use ($myApp) {
// 当收到请求时调用,
// 超全局变量、php://input 等都会被重置
echo $myApp->handle($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
try {
// 当收到请求时调用,
// 超全局变量、php://input 等都会被重置
echo $myApp->handle($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
} catch (\Throwable $exception) {
// `set_exception_handler` 仅在 worker 脚本结束时调用,
// 这可能不是您所期望的,因此在此处捕获并处理异常
(new \MyCustomExceptionHandler)->handleException($exception);
}
};

$maxRequests = (int)($_SERVER['MAX_REQUESTS'] ?? 0);
Expand Down Expand Up @@ -144,7 +152,7 @@ curl -X POST http://localhost:2019/frankenphp/workers/restart
但是,如果 worker 脚本在短时间内继续以非零退出代码失败
(例如,脚本中有拼写错误),FrankenPHP 将崩溃并出现错误:`too many consecutive failures`。

可以在你的 [Caddyfile](config.md#caddyfile-配置) 中使用 `max_consecutive_failures` 选项配置连续失败的次数:
可以在你的 [Caddyfile](config.md#caddyfile-config) 中使用 `max_consecutive_failures` 选项配置连续失败的次数:

```caddyfile
frankenphp {
Expand All @@ -157,7 +165,7 @@ frankenphp {

## 超全局变量行为

[PHP 超全局变量](https://www.php.net/manual/zh/language.variables.superglobals.php)(`$_SERVER`、`$_ENV`、`$_GET`...)
[PHP 超全局变量](https://www.php.net/manual/en/language.variables.superglobals.php)(`$_SERVER`、`$_ENV`、`$_GET`...)
行为如下:

- 在第一次调用 `frankenphp_handle_request()` 之前,超全局变量包含绑定到 worker 脚本本身的值
Expand All @@ -176,4 +184,3 @@ $handler = static function () use ($workerServer) {
};

// ...
```
38 changes: 19 additions & 19 deletions docs/fr/worker.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,24 @@ docker run \

### Binaire autonome

Utilisez l'option --worker de la commande php-server pour servir le contenu du répertoire courant en utilisant un worker :
Utilisez l'option `--worker` de la commande `php-server` pour servir le contenu du répertoire courant en utilisant un worker :

```console
frankenphp php-server --worker /path/to/your/worker/script.php
```

Si votre application PHP est [intégrée dans le binaire](embed.md), vous pouvez également ajouter un `Caddyfile` personnalisé dans le répertoire racine de l'application.
Si votre application PHP est [intégrée dans le binaire](embed.md), vous pouvez ajouter un `Caddyfile` personnalisé dans le répertoire racine de l'application.
Il sera utilisé automatiquement.

Il est également possible de [redémarrer le worker en cas de changement de fichier](config.md#surveillance-des-modifications-de-fichier) avec l'option `--watch`.
Il est également possible de [redémarrer le worker en cas de changement de fichier](config.md#watching-for-file-changes) avec l'option `--watch`.
La commande suivante déclenchera un redémarrage si un fichier se terminant par `.php` dans le répertoire `/path/to/your/app/` ou ses sous-répertoires est modifié :

```console
frankenphp php-server --worker /path/to/your/worker/script.php --watch="/path/to/your/app/**/*.php"
```

Cette fonctionnalité est souvent utilisée en combinaison avec le [rechargement à chaud](hot-reload.md).

## Runtime Symfony

> [!TIP]
Expand Down Expand Up @@ -70,20 +72,23 @@ L'exemple suivant montre comment créer votre propre script worker sans dépendr
<?php
// public/index.php

// Empêcher la terminaison du script worker lorsqu'une connexion client est interrompue
ignore_user_abort(true);

// Démarrer votre application
require __DIR__.'/vendor/autoload.php';

$myApp = new \App\Kernel();
$myApp->boot();

// En dehors de la boucle pour de meilleures performances (moins de travail effectué)
// Gestionnaire en dehors de la boucle pour de meilleures performances (moins de travail effectué)
$handler = static function () use ($myApp) {
// Appelé lorsqu'une requête est reçue,
// les superglobales, php://input, etc., sont réinitialisés
echo $myApp->handle($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
try {
// Appelé lorsqu'une requête est reçue,
// les superglobales, php://input, etc., sont réinitialisés
echo $myApp->handle($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
} catch (\Throwable $exception) {
// `set_exception_handler` est appelé uniquement lorsque le script worker se termine,
// ce qui peut ne pas être ce que vous attendez, alors interceptez et gérez les exceptions ici
(new \MyCustomExceptionHandler)->handleException($exception);
}
};

$maxRequests = (int)($_SERVER['MAX_REQUESTS'] ?? 0);
Expand Down Expand Up @@ -133,27 +138,23 @@ Le code du worker précédent permet de configurer un nombre maximal de requête

### Redémarrer les workers manuellement

Bien qu'il soit possible de redémarrer les workers [en cas de changement de fichier](config.md#surveillance-des-modifications-de-fichier),
Bien qu'il soit possible de redémarrer les workers [en cas de changement de fichier](config.md#watching-for-file-changes),
il est également possible de redémarrer tous les workers de manière élégante via l'[API Admin de Caddy](https://caddyserver.com/docs/api).
Si l'administration est activée dans votre [Caddyfile](config.md#configuration-du-caddyfile), vous pouvez envoyer un ping
Si l'administration est activée dans votre [Caddyfile](config.md#caddyfile-config), vous pouvez envoyer un ping
à l'endpoint de redémarrage avec une simple requête POST comme celle-ci :

```console
curl -X POST http://localhost:2019/frankenphp/workers/restart
```

> [!NOTE]
>
> C'est une fonctionnalité expérimentale et peut être modifiée ou supprimée dans le futur.

### Worker Failures
### Échecs des workers

Si un script de worker se plante avec un code de sortie non nul, FrankenPHP le redémarre avec une stratégie de backoff exponentielle.
Si le script worker reste en place plus longtemps que le dernier backoff \* 2, FrankenPHP ne pénalisera pas le script et le redémarrera à nouveau.
Toutefois, si le script de worker continue d'échouer avec un code de sortie non nul dans un court laps de temps
(par exemple, une faute de frappe dans un script), FrankenPHP plantera avec l'erreur : `too many consecutive failures` (trop d'échecs consécutifs).

Le nombre d'échecs consécutifs peut être configuré dans votre [Caddyfile](config.md#configuration-du-caddyfile) avec l'option `max_consecutive_failures` :
Le nombre d'échecs consécutifs peut être configuré dans votre [Caddyfile](config.md#caddyfile-config) avec l'option `max_consecutive_failures` :

```caddyfile
frankenphp {
Expand Down Expand Up @@ -185,4 +186,3 @@ $handler = static function () use ($workerServer) {
};

// ...
```
29 changes: 18 additions & 11 deletions docs/ja/worker.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,13 @@ PHPアプリが[バイナリに埋め込まれている](embed.md)場合は、
frankenphp php-server --worker /path/to/your/worker/script.php --watch="/path/to/your/app/**/*.php"
```

この機能は、[ホットリロード](hot-reload.md)と組み合わせてよく使用されます。

## Symfonyランタイム

> [!TIP]
> 以下のセクションは、FrankenPHPワーカーモードのネイティブサポートが導入されたSymfony 7.4より前のバージョンでのみ必要です。

FrankenPHPのワーカーモードは[Symfony Runtime Component](https://symfony.com/doc/current/components/runtime.html)によってサポートされています。
ワーカーでSymfonyアプリケーションを開始するには、FrankenPHP用の[PHP Runtime](https://github.com/php-runtime/runtime)パッケージをインストールします:

Expand Down Expand Up @@ -67,30 +72,33 @@ docker run \
<?php
// public/index.php

// クライアント接続が中断されたときのワーカースクリプト終了を防ぐ
ignore_user_abort(true);

// アプリを起動
// アプリケーションを起動
require __DIR__.'/vendor/autoload.php';

$myApp = new \App\Kernel();
$myApp->boot();

// ループの外側にハンドラーを配置してパフォーマンスを向上(処理量を減らす
// パフォーマンス向上のため、ループの外側にハンドラーを配置(処理を減らす
$handler = static function () use ($myApp) {
// リクエストを受信した際に呼び出され、
// スーパーグローバルや php://input などがリセットされます。
echo $myApp->handle($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
try {
// リクエストを受信すると呼び出され、
// スーパーグローバル、php://inputなどがリセットされます。
echo $myApp->handle($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
} catch (\Throwable $exception) {
// `set_exception_handler`はワーカースクリプトが終了するときにのみ呼び出されるため、
// 予期しない動作になる可能性があります。そのため、ここで例外をキャッチして処理します。
(new \MyCustomExceptionHandler)->handleException($exception);
}
};

$maxRequests = (int)($_SERVER['MAX_REQUESTS'] ?? 0);
for ($nbRequests = 0; !$maxRequests || $nbRequests < $maxRequests; ++$nbRequests) {
$keepRunning = \frankenphp_handle_request($handler);

// HTTPレスポンスの送信後に何か処理を行います
// HTTPレスポンス送信後に何らかの処理を実行
$myApp->terminate();

// ページ生成の途中でガベージコレクタが起動する可能性を減らすために、ここでガベージコレクタを明示的に呼び出す
// ページ生成中にガベージコレクタが起動する可能性を減らすため、ここでガベージコレクタを明示的に呼び出す
gc_collect_cycles();

if (!$keepRunning) break;
Expand Down Expand Up @@ -178,4 +186,3 @@ $handler = static function () use ($workerServer) {
};

// ...
```
Loading