From 3d304b6699d05299f0402fcfcafccc89b510db45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 12 May 2026 15:35:30 +0200 Subject: [PATCH 1/4] fix: translate.php Gemini payload + drop // from php.net URLs - translate.php: use top-level systemInstruction and array-of-parts payload (Gemini 400'd on role:model + parts-as-object). - Refresh translate.php system/user prompts. - Strip /en/, /es/, /fr/, /zh/ language segments from php.net URLs in all English and translated docs (use language-agnostic form). --- docs/cn/config.md | 4 +-- docs/cn/known-issues.md | 10 +++--- docs/cn/performance.md | 6 ++-- docs/cn/worker.md | 2 +- docs/config.md | 6 ++-- docs/es/config.md | 6 ++-- docs/es/known-issues.md | 10 +++--- docs/es/performance.md | 6 ++-- docs/es/worker.md | 2 +- docs/fr/config.md | 6 ++-- docs/fr/known-issues.md | 10 +++--- docs/fr/performance.md | 6 ++-- docs/fr/worker.md | 2 +- docs/ja/config.md | 6 ++-- docs/ja/known-issues.md | 10 +++--- docs/ja/performance.md | 6 ++-- docs/ja/worker.md | 2 +- docs/known-issues.md | 10 +++--- docs/performance.md | 6 ++-- docs/pt-br/config.md | 6 ++-- docs/ru/config.md | 6 ++-- docs/ru/known-issues.md | 10 +++--- docs/ru/performance.md | 6 ++-- docs/ru/worker.md | 2 +- docs/tr/config.md | 6 ++-- docs/tr/known-issues.md | 4 +-- docs/tr/performance.md | 6 ++-- docs/tr/worker.md | 2 +- docs/translate.php | 79 +++++++++++++++++++++++------------------ docs/worker.md | 2 +- 30 files changed, 127 insertions(+), 118 deletions(-) diff --git a/docs/cn/config.md b/docs/cn/config.md index 850d67fa4f..78d440f2c0 100644 --- a/docs/cn/config.md +++ b/docs/cn/config.md @@ -17,7 +17,7 @@ php_server 一个更高级的 `Caddyfile`,支持更多功能并提供方便的环境变量,可以在 [FrankenPHP 仓库中](https://github.com/php/frankenphp/blob/main/caddy/frankenphp/Caddyfile)找到,并随 Docker 镜像提供。 -PHP 本身可以[使用 `php.ini` 文件](https://www.php.net/manual/en/configuration.file.php)进行配置。 +PHP 本身可以[使用 `php.ini` 文件](https://www.php.net/manual/configuration.file.php)进行配置。 根据你的安装方法,FrankenPHP 和 PHP 解释器将在以下位置查找配置文件。 @@ -275,7 +275,7 @@ Workers 可以通过 `watch` 指令在文件更改时重新启动。 ## PHP 配置 -为了加载[附加的 PHP 配置文件](https://www.php.net/manual/en/configuration.file.php#configuration.file.scan),可以使用 `PHP_INI_SCAN_DIR` 环境变量。设置后,PHP 将加载给定目录中所有带有 `.ini` 扩展名的文件。 +为了加载[附加的 PHP 配置文件](https://www.php.net/manual/configuration.file.php#configuration.file.scan),可以使用 `PHP_INI_SCAN_DIR` 环境变量。设置后,PHP 将加载给定目录中所有带有 `.ini` 扩展名的文件。 您还可以通过在 `Caddyfile` 中使用 `php_ini` 指令来更改 PHP 配置: diff --git a/docs/cn/known-issues.md b/docs/cn/known-issues.md index a2bc0f8fb6..99a01b2d59 100644 --- a/docs/cn/known-issues.md +++ b/docs/cn/known-issues.md @@ -6,7 +6,7 @@ | 名称 | 原因 | 替代方案 | | ----------------------------------------------------------------------------------------------------------- | ------------ | -------------------------------------------------------------------------------------------------------------------- | -| [imap](https://www.php.net/manual/en/imap.installation.php) | 不安全的线程 | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | +| [imap](https://www.php.net/manual/imap.installation.php) | 不安全的线程 | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | | [newrelic](https://docs.newrelic.com/docs/apm/agents/php-agent/getting-started/introduction-new-relic-php/) | 不安全的线程 | - | ## 有缺陷的 PHP 扩展 @@ -15,15 +15,15 @@ | 名称 | 问题 | | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [ext-openssl](https://www.php.net/manual/en/book.openssl.php) | 在使用静态构建的 FrankenPHP(使用 musl libc 构建)时,在重负载下 OpenSSL 扩展可能会崩溃。一个解决方法是使用动态链接的构建(如 Docker 镜像中使用的版本)。此错误正在由 PHP 跟踪。[查看问题](https://github.com/php/php-src/issues/13648)。 | +| [ext-openssl](https://www.php.net/manual/book.openssl.php) | 在使用静态构建的 FrankenPHP(使用 musl libc 构建)时,在重负载下 OpenSSL 扩展可能会崩溃。一个解决方法是使用动态链接的构建(如 Docker 镜像中使用的版本)。此错误正在由 PHP 跟踪。[查看问题](https://github.com/php/php-src/issues/13648)。 | ## get_browser -[get_browser()](https://www.php.net/manual/en/function.get-browser.php) 函数在一段时间后似乎表现不佳。解决方法是缓存(例如使用 [APCu](https://www.php.net/manual/zh/book.apcu.php))每个 User-Agent,因为它们是不变的。 +[get_browser()](https://www.php.net/manual/function.get-browser.php) 函数在一段时间后似乎表现不佳。解决方法是缓存(例如使用 [APCu](https://www.php.net/manual/book.apcu.php))每个 User-Agent,因为它们是不变的。 ## 独立的二进制和基于 Alpine 的 Docker 镜像 -独立的二进制文件和基于 Alpine 的 Docker 镜像 (`dunglas/frankenphp:*-alpine`) 使用的是 [musl libc](https://musl.libc.org/) 而不是 [glibc and friends](https://www.etalabs.net/compare_libcs.html),为的是保持较小的二进制大小。这可能会导致一些兼容性问题。特别是,glob 标志 `GLOB_BRACE` [不可用](https://www.php.net/manual/en/function.glob.php)。 +独立的二进制文件和基于 Alpine 的 Docker 镜像 (`dunglas/frankenphp:*-alpine`) 使用的是 [musl libc](https://musl.libc.org/) 而不是 [glibc and friends](https://www.etalabs.net/compare_libcs.html),为的是保持较小的二进制大小。这可能会导致一些兼容性问题。特别是,glob 标志 `GLOB_BRACE` [不可用](https://www.php.net/manual/function.glob.php)。 ## 在 Docker 中使用 `https://127.0.0.1` @@ -122,7 +122,7 @@ error:0A000086:SSL routines::certificate verify failed 由于静态二进制不捆绑 TLS 证书,因此您需要将 OpenSSL 指向本地 CA 证书安装。 -检查 [`openssl_get_cert_locations()`](https://www.php.net/manual/en/function.openssl-get-cert-locations.php) 的输出, +检查 [`openssl_get_cert_locations()`](https://www.php.net/manual/function.openssl-get-cert-locations.php) 的输出, 以找到 CA 证书必须安装的位置,并将它们存储在该位置。 > [!WARNING] diff --git a/docs/cn/performance.md b/docs/cn/performance.md index 9007e06e8d..e5bb224a13 100644 --- a/docs/cn/performance.md +++ b/docs/cn/performance.md @@ -23,7 +23,7 @@ `max_threads` 可以帮助你确定需要多少线程来处理你的流量,并可以使服务器对延迟峰值更具弹性。 如果设置为 `auto`,限制将基于你的 `php.ini` 中的 `memory_limit` 进行估算。如果无法这样做, `auto` 将默认为 2x `num_threads`。请记住,`auto` 可能会严重低估所需的线程数。 -`max_threads` 类似于 PHP FPM 的 [pm.max_children](https://www.php.net/manual/en/install.fpm.configuration.php#pm.max-children)。主要区别是 FrankenPHP 使用线程而不是 +`max_threads` 类似于 PHP FPM 的 [pm.max_children](https://www.php.net/manual/install.fpm.configuration.php#pm.max-children)。主要区别是 FrankenPHP 使用线程而不是 进程,并根据需要自动在不同的 worker 脚本和"经典模式"之间委派它们。 ## Worker 模式 @@ -160,10 +160,10 @@ FrankenPHP 使用官方 PHP 解释器。 特别是: -- 检查 [OPcache](https://www.php.net/manual/zh/book.opcache.php) 是否已安装、启用并正确配置 +- 检查 [OPcache](https://www.php.net/manual/book.opcache.php) 是否已安装、启用并正确配置 - 启用 [Composer 自动加载器优化](https://getcomposer.org/doc/articles/autoloader-optimization.md) - 确保 `realpath` 缓存对于你的应用程序需求足够大 -- 使用[预加载](https://www.php.net/manual/zh/opcache.preloading.php) +- 使用[预加载](https://www.php.net/manual/opcache.preloading.php) 有关更多详细信息,请阅读[专门的 Symfony 文档条目](https://symfony.com/doc/current/performance.html) (即使你不使用 Symfony,大多数提示也很有用)。 diff --git a/docs/cn/worker.md b/docs/cn/worker.md index f39dd4a9f1..f98dc13024 100644 --- a/docs/cn/worker.md +++ b/docs/cn/worker.md @@ -165,7 +165,7 @@ frankenphp { ## 超全局变量行为 -[PHP 超全局变量](https://www.php.net/manual/zh/language.variables.superglobals.php)(`$_SERVER`、`$_ENV`、`$_GET`...) +[PHP 超全局变量](https://www.php.net/manual/language.variables.superglobals.php)(`$_SERVER`、`$_ENV`、`$_GET`...) 行为如下: - 在第一次调用 `frankenphp_handle_request()` 之前,超全局变量包含绑定到 worker 脚本本身的值 diff --git a/docs/config.md b/docs/config.md index 575d8e12e9..ada3840970 100644 --- a/docs/config.md +++ b/docs/config.md @@ -25,7 +25,7 @@ php_server A more advanced `Caddyfile` enabling more features and providing convenient environment variables is provided [in the FrankenPHP repository](https://github.com/php/frankenphp/blob/main/caddy/frankenphp/Caddyfile), and with Docker images. -PHP itself can be configured [using a `php.ini` file](https://www.php.net/manual/en/configuration.file.php). +PHP itself can be configured [using a `php.ini` file](https://www.php.net/manual/configuration.file.php). Depending on your installation method, FrankenPHP and the PHP interpreter will look for configuration files in locations described below. @@ -301,11 +301,11 @@ The following environment variables can be used to inject Caddy directives in th As for FPM and CLI SAPIs, environment variables are exposed by default in the `$_SERVER` superglobal. -The `S` value of [the `variables_order` PHP directive](https://www.php.net/manual/en/ini.core.php#ini.variables-order) is always equivalent to `ES` regardless of the placement of `E` elsewhere in this directive. +The `S` value of [the `variables_order` PHP directive](https://www.php.net/manual/ini.core.php#ini.variables-order) is always equivalent to `ES` regardless of the placement of `E` elsewhere in this directive. ## PHP config -To load [additional PHP configuration files](https://www.php.net/manual/en/configuration.file.php#configuration.file.scan), +To load [additional PHP configuration files](https://www.php.net/manual/configuration.file.php#configuration.file.scan), the `PHP_INI_SCAN_DIR` environment variable can be used. When set, PHP will load all the files with the `.ini` extension present in the given directories. diff --git a/docs/es/config.md b/docs/es/config.md index 3954f82b09..f55be64720 100644 --- a/docs/es/config.md +++ b/docs/es/config.md @@ -20,7 +20,7 @@ php_server Un `Caddyfile` más avanzado que habilita más características y proporciona variables de entorno convenientes está disponible [en el repositorio de FrankenPHP](https://github.com/php/frankenphp/blob/main/caddy/frankenphp/Caddyfile), y con las imágenes de Docker. -PHP en sí puede configurarse [usando un archivo `php.ini`](https://www.php.net/manual/es/configuration.file.php). +PHP en sí puede configurarse [usando un archivo `php.ini`](https://www.php.net/manual/configuration.file.php). Dependiendo de su método de instalación, FrankenPHP y el intérprete de PHP buscarán archivos de configuración en las ubicaciones descritas a continuación. @@ -275,11 +275,11 @@ Las siguientes variables de entorno pueden usarse para inyectar directivas de Ca Al igual que en FPM y SAPIs CLI, las variables de entorno se exponen por defecto en la superglobal `$_SERVER`. -El valor `S` de [la directiva `variables_order` de PHP](https://www.php.net/manual/en/ini.core.php#ini.variables-order) siempre es equivalente a `ES` independientemente de la ubicación de `E` en otro lugar de esta directiva. +El valor `S` de [la directiva `variables_order` de PHP](https://www.php.net/manual/ini.core.php#ini.variables-order) siempre es equivalente a `ES` independientemente de la ubicación de `E` en otro lugar de esta directiva. ## Configuración de PHP -Para cargar [archivos de configuración adicionales de PHP](https://www.php.net/manual/en/configuration.file.php#configuration.file.scan), +Para cargar [archivos de configuración adicionales de PHP](https://www.php.net/manual/configuration.file.php#configuration.file.scan), puede usarse la variable de entorno `PHP_INI_SCAN_DIR`. Cuando se establece, PHP cargará todos los archivos con la extensión `.ini` presentes en los directorios dados. diff --git a/docs/es/known-issues.md b/docs/es/known-issues.md index e4ce1cf56a..280f190f57 100644 --- a/docs/es/known-issues.md +++ b/docs/es/known-issues.md @@ -6,7 +6,7 @@ Las siguientes extensiones se sabe que no son compatibles con FrankenPHP: | Nombre | Razón | Alternativas | | ----------------------------------------------------------------------------------------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------- | -| [imap](https://www.php.net/manual/es/imap.installation.php) | No es thread-safe | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | +| [imap](https://www.php.net/manual/imap.installation.php) | No es thread-safe | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | | [newrelic](https://docs.newrelic.com/docs/apm/agents/php-agent/getting-started/introduction-new-relic-php/) | No es thread-safe | - | ## Extensiones PHP con Errores @@ -15,17 +15,17 @@ Las siguientes extensiones tienen errores conocidos y comportamientos inesperado | Nombre | Problema | | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [ext-openssl](https://www.php.net/manual/es/book.openssl.php) | Cuando se usa musl libc, la extensión OpenSSL puede fallar bajo cargas pesadas. El problema no ocurre cuando se usa la más popular GNU libc. Este error está [siendo rastreado por PHP](https://github.com/php/php-src/issues/13648). | +| [ext-openssl](https://www.php.net/manual/book.openssl.php) | Cuando se usa musl libc, la extensión OpenSSL puede fallar bajo cargas pesadas. El problema no ocurre cuando se usa la más popular GNU libc. Este error está [siendo rastreado por PHP](https://github.com/php/php-src/issues/13648). | ## get_browser -La función [get_browser()](https://www.php.net/manual/es/function.get-browser.php) parece funcionar mal después de un tiempo. Una solución es almacenar en caché (por ejemplo, con [APCu](https://www.php.net/manual/es/book.apcu.php)) los resultados por User Agent, ya que son estáticos. +La función [get_browser()](https://www.php.net/manual/function.get-browser.php) parece funcionar mal después de un tiempo. Una solución es almacenar en caché (por ejemplo, con [APCu](https://www.php.net/manual/book.apcu.php)) los resultados por User Agent, ya que son estáticos. ## Binario Autónomo e Imágenes Docker Basadas en Alpine Los binarios completamente estáticos y las imágenes Docker basadas en Alpine (`dunglas/frankenphp:*-alpine`) usan [musl libc](https://musl.libc.org/) en lugar de [glibc](https://www.etalabs.net/compare_libcs.html), para mantener un tamaño de binario más pequeño. Esto puede llevar a algunos problemas de compatibilidad. -En particular, la bandera glob `GLOB_BRACE` [no está disponible](https://www.php.net/manual/es/function.glob.php). +En particular, la bandera glob `GLOB_BRACE` [no está disponible](https://www.php.net/manual/function.glob.php). Se recomienda usar la variante GNU del binario estático y las imágenes Docker basadas en Debian si encuentras problemas. @@ -126,7 +126,7 @@ error:0A000086:rutinas de SSL::falló la verificación del certificado Dado que el binario estático no incluye certificados TLS, necesitas indicar a OpenSSL la ubicación de tu instalación local de certificados CA. -Inspecciona la salida de [`openssl_get_cert_locations()`](https://www.php.net/manual/es/function.openssl-get-cert-locations.php), +Inspecciona la salida de [`openssl_get_cert_locations()`](https://www.php.net/manual/function.openssl-get-cert-locations.php), para encontrar dónde deben instalarse los certificados CA y guárdalos en esa ubicación. > [!CAUTION] diff --git a/docs/es/performance.md b/docs/es/performance.md index dc46ab05fd..8431ab24e3 100644 --- a/docs/es/performance.md +++ b/docs/es/performance.md @@ -23,7 +23,7 @@ La configuración `max_threads` [configuración](config.md#caddyfile-config) per `max_threads` puede ayudarte a determinar cuántos hilos necesitas para manejar tu tráfico y puede hacer que el servidor sea más resiliente a picos de latencia. Si se establece en `auto`, el límite se estimará en función del `memory_limit` en tu `php.ini`. Si no puede hacerlo, `auto` se establecerá por defecto en 2x `num_threads`. Ten en cuenta que `auto` puede subestimar fuertemente el número de hilos necesarios. -`max_threads` es similar a [pm.max_children](https://www.php.net/manual/es/install.fpm.configuration.php#pm.max-children) de PHP FPM. La principal diferencia es que FrankenPHP usa hilos en lugar de procesos y los delega automáticamente entre diferentes scripts de worker y el 'modo clásico' según sea necesario. +`max_threads` es similar a [pm.max_children](https://www.php.net/manual/install.fpm.configuration.php#pm.max-children) de PHP FPM. La principal diferencia es que FrankenPHP usa hilos en lugar de procesos y los delega automáticamente entre diferentes scripts de worker y el 'modo clásico' según sea necesario. ## Modo Worker @@ -145,10 +145,10 @@ Todas las optimizaciones de rendimiento habituales relacionadas con PHP se aplic En particular: -- verifica que [OPcache](https://www.php.net/manual/es/book.opcache.php) esté instalado, habilitado y correctamente configurado +- verifica que [OPcache](https://www.php.net/manual/book.opcache.php) esté instalado, habilitado y correctamente configurado - habilita [optimizaciones del autoload de Composer](https://getcomposer.org/doc/articles/autoloader-optimization.md) - asegúrate de que la caché `realpath` sea lo suficientemente grande para las necesidades de tu aplicación -- usa [preloading](https://www.php.net/manual/es/opcache.preloading.php) +- usa [preloading](https://www.php.net/manual/opcache.preloading.php) Para más detalles, lee [la entrada de documentación dedicada de Symfony](https://symfony.com/doc/current/performance.html) (la mayoría de los consejos son útiles incluso si no usas Symfony). diff --git a/docs/es/worker.md b/docs/es/worker.md index 41002cb1eb..411a1c1627 100644 --- a/docs/es/worker.md +++ b/docs/es/worker.md @@ -170,7 +170,7 @@ frankenphp { ## Comportamiento de las Superglobales -Las [superglobales de PHP](https://www.php.net/manual/es/language.variables.superglobals.php) (`$_SERVER`, `$_ENV`, `$_GET`...) +Las [superglobales de PHP](https://www.php.net/manual/language.variables.superglobals.php) (`$_SERVER`, `$_ENV`, `$_GET`...) se comportan de la siguiente manera: - antes de la primera llamada a `frankenphp_handle_request()`, las superglobales contienen valores vinculados al script de worker en sí diff --git a/docs/fr/config.md b/docs/fr/config.md index 23b41a8edf..8d37f0b527 100644 --- a/docs/fr/config.md +++ b/docs/fr/config.md @@ -19,7 +19,7 @@ php_server Un `Caddyfile` plus avancé, activant davantage de fonctionnalités et fournissant des variables d'environnement pratiques, est disponible [dans le dépôt FrankenPHP](https://github.com/php/frankenphp/blob/main/caddy/frankenphp/Caddyfile) et avec les images Docker. -PHP lui-même peut être configuré [en utilisant un fichier `php.ini`](https://www.php.net/manual/fr/configuration.file.php). +PHP lui-même peut être configuré [en utilisant un fichier `php.ini`](https://www.php.net/manual/configuration.file.php). Selon votre méthode d'installation, FrankenPHP et l'interpréteur PHP chercheront les fichiers de configuration aux emplacements décrits ci-dessous. @@ -272,11 +272,11 @@ Les variables d'environnement suivantes peuvent être utilisées pour insérer d Comme pour les SAPI FPM et CLI, les variables d'environnement sont exposées par défaut dans la superglobale `$_SERVER`. -La valeur `S` de [la directive `variables_order` de PHP](https://www.php.net/manual/fr/ini.core.php#ini.variables-order) est toujours équivalente à `ES`, que `E` soit défini ailleurs dans cette directive ou non. +La valeur `S` de [la directive `variables_order` de PHP](https://www.php.net/manual/ini.core.php#ini.variables-order) est toujours équivalente à `ES`, que `E` soit défini ailleurs dans cette directive ou non. ## Configuration PHP -Pour charger [des fichiers de configuration PHP supplémentaires](https://www.php.net/manual/fr/configuration.file.php#configuration.file.scan), +Pour charger [des fichiers de configuration PHP supplémentaires](https://www.php.net/manual/configuration.file.php#configuration.file.scan), la variable d'environnement `PHP_INI_SCAN_DIR` peut être utilisée. Lorsqu'elle est définie, PHP chargera tous les fichiers avec l'extension `.ini` présents dans les répertoires donnés. diff --git a/docs/fr/known-issues.md b/docs/fr/known-issues.md index 8387e38811..5d5d711c44 100644 --- a/docs/fr/known-issues.md +++ b/docs/fr/known-issues.md @@ -6,7 +6,7 @@ Les extensions suivantes sont connues pour ne pas être compatibles avec Franken | Nom | Raison | Alternatives | | ----------------------------------------------------------------------------------------------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------- | -| [imap](https://www.php.net/manual/en/imap.installation.php) | Non thread-safe | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | +| [imap](https://www.php.net/manual/imap.installation.php) | Non thread-safe | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | | [newrelic](https://docs.newrelic.com/docs/apm/agents/php-agent/getting-started/introduction-new-relic-php/) | Non thread-safe | - | ## Extensions PHP boguées @@ -15,15 +15,15 @@ Les extensions suivantes ont des bugs connus ou des comportements inattendus lor | Nom | Problème | | ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [ext-openssl](https://www.php.net/manual/fr/book.openssl.php) | Lors de l'utilisation d'une version statique de FrankenPHP (construite avec la libc musl), l'extension OpenSSL peut planter sous de fortes charges. Une solution consiste à utiliser une version liée dynamiquement (comme celle utilisée dans les images Docker). Ce bogue est [suivi par PHP](https://github.com/php/php-src/issues/13648). | +| [ext-openssl](https://www.php.net/manual/book.openssl.php) | Lors de l'utilisation d'une version statique de FrankenPHP (construite avec la libc musl), l'extension OpenSSL peut planter sous de fortes charges. Une solution consiste à utiliser une version liée dynamiquement (comme celle utilisée dans les images Docker). Ce bogue est [suivi par PHP](https://github.com/php/php-src/issues/13648). | ## get_browser -La fonction [get_browser()](https://www.php.net/manual/fr/function.get-browser.php) semble avoir de mauvaises performances après un certain temps. Une solution est de mettre en cache (par exemple, avec [APCu](https://www.php.net/manual/en/book.apcu.php)) les résultats par agent utilisateur, car ils sont statiques. +La fonction [get_browser()](https://www.php.net/manual/function.get-browser.php) semble avoir de mauvaises performances après un certain temps. Une solution est de mettre en cache (par exemple, avec [APCu](https://www.php.net/manual/book.apcu.php)) les résultats par agent utilisateur, car ils sont statiques. ## Binaire autonome et images Docker basées sur Alpine -Le binaire autonome et les images Docker basées sur Alpine (`dunglas/frankenphp:*-alpine`) utilisent [musl libc](https://musl.libc.org/) au lieu de [glibc et ses amis](https://www.etalabs.net/compare_libcs.html), pour garder une taille de binaire plus petite. Cela peut entraîner des problèmes de compatibilité. En particulier, le drapeau glob `GLOB_BRACE` n'est [pas disponible](https://www.php.net/manual/fr/function.glob.php). +Le binaire autonome et les images Docker basées sur Alpine (`dunglas/frankenphp:*-alpine`) utilisent [musl libc](https://musl.libc.org/) au lieu de [glibc et ses amis](https://www.etalabs.net/compare_libcs.html), pour garder une taille de binaire plus petite. Cela peut entraîner des problèmes de compatibilité. En particulier, le drapeau glob `GLOB_BRACE` n'est [pas disponible](https://www.php.net/manual/function.glob.php). ## Utilisation de `https://127.0.0.1` avec Docker @@ -122,7 +122,7 @@ error:0A000086:SSL routines::certificate verify failed Comme le binaire statique ne contient pas de certificats TLS, vous devez indiquer à OpenSSL l'installation de vos certificats CA locaux. -Inspectez la sortie de [`openssl_get_cert_locations()`](https://www.php.net/manual/en/function.openssl-get-cert-locations.php), +Inspectez la sortie de [`openssl_get_cert_locations()`](https://www.php.net/manual/function.openssl-get-cert-locations.php), pour trouver l'endroit où les certificats CA doivent être installés et stockez-les à cet endroit. > [!WARNING] diff --git a/docs/fr/performance.md b/docs/fr/performance.md index a036d81242..6011add2db 100644 --- a/docs/fr/performance.md +++ b/docs/fr/performance.md @@ -23,7 +23,7 @@ ont tendance à être plus imprévisibles. La [configuration](config.md#configur `max_threads` peut vous aider à déterminer le nombre de threads dont vous avez besoin pour gérer votre trafic et peut rendre le serveur plus résistant aux pics de latence. Si elle est fixée à `auto`, la limite sera estimée en fonction de la valeur de `memory_limit` dans votre `php.ini`. Si ce n'est pas possible, `auto` prendra par défaut 2x `num_threads`. Gardez à l'esprit que `auto` peut fortement sous-estimer le nombre de threads nécessaires. -`max_threads` est similaire à [pm.max_children](https://www.php.net/manual/en/install.fpm.configuration.php#pm.max-children) de PHP FPM. La principale différence est que FrankenPHP utilise des threads au lieu de +`max_threads` est similaire à [pm.max_children](https://www.php.net/manual/install.fpm.configuration.php#pm.max-children) de PHP FPM. La principale différence est que FrankenPHP utilise des threads au lieu de processus et les délègue automatiquement à différents scripts worker et au 'mode classique' selon les besoins. ## Mode worker @@ -160,10 +160,10 @@ Toutes les optimisations de performances habituelles liées à PHP s'appliquent En particulier : -- vérifiez que [OPcache](https://www.php.net/manual/en/book.opcache.php) est installé, activé et correctement configuré +- vérifiez que [OPcache](https://www.php.net/manual/book.opcache.php) est installé, activé et correctement configuré - activez [les optimisations de l'autoloader de Composer](https://getcomposer.org/doc/articles/autoloader-optimization.md) - assurez-vous que le cache `realpath` est suffisamment grand pour les besoins de votre application -- utilisez le [pré-chargement](https://www.php.net/manual/en/opcache.preloading.php) +- utilisez le [pré-chargement](https://www.php.net/manual/opcache.preloading.php) Pour plus de détails, lisez [l'entrée de la documentation dédiée de Symfony](https://symfony.com/doc/current/performance.html) (la plupart des conseils sont utiles même si vous n'utilisez pas Symfony). diff --git a/docs/fr/worker.md b/docs/fr/worker.md index 0c86b75082..ed86dd8f6c 100644 --- a/docs/fr/worker.md +++ b/docs/fr/worker.md @@ -167,7 +167,7 @@ frankenphp { ## Comportement des superglobales -[Les superglobales PHP](https://www.php.net/manual/fr/language.variables.superglobals.php) (`$_SERVER`, `$_ENV`, `$_GET`...) +[Les superglobales PHP](https://www.php.net/manual/language.variables.superglobals.php) (`$_SERVER`, `$_ENV`, `$_GET`...) se comportent comme suit : - avant le premier appel à `frankenphp_handle_request()`, les superglobales contiennent des valeurs liées au script worker lui-même diff --git a/docs/ja/config.md b/docs/ja/config.md index 12a54462a6..c92cef1ffa 100644 --- a/docs/ja/config.md +++ b/docs/ja/config.md @@ -19,7 +19,7 @@ php_server より多くの機能を有効にし、便利な環境変数を提供するより高度な`Caddyfile`は、[FrankenPHPリポジトリ](https://github.com/php/frankenphp/blob/main/caddy/frankenphp/Caddyfile)およびDockerイメージに同梱されています。 -PHP自体は、[`php.ini` ファイルを使用](https://www.php.net/manual/en/configuration.file.php)して設定できます。 +PHP自体は、[`php.ini` ファイルを使用](https://www.php.net/manual/configuration.file.php)して設定できます。 インストール方法に応じて、FrankenPHPとPHPインタープリターは以下の場所に記載された設定ファイルを探します。 @@ -275,11 +275,11 @@ PHPファイルに変更を加えても即座には反映されません。 FPM や CLI SAPI と同様に、環境変数はデフォルトで`$_SERVER`スーパーグローバルで公開されます。 -[`variables_order` PHPディレクティブ](https://www.php.net/manual/en/ini.core.php#ini.variables-order)の`S`値は、このディレクティブ内での`E`の位置にかかわらず常に`ES`と同等です。 +[`variables_order` PHPディレクティブ](https://www.php.net/manual/ini.core.php#ini.variables-order)の`S`値は、このディレクティブ内での`E`の位置にかかわらず常に`ES`と同等です。 ## PHP設定 -[追加のPHP設定ファイル](https://www.php.net/manual/en/configuration.file.php#configuration.file.scan)を読み込むには、 +[追加のPHP設定ファイル](https://www.php.net/manual/configuration.file.php#configuration.file.scan)を読み込むには、 `PHP_INI_SCAN_DIR`環境変数を使用できます。 設定されると、PHPは指定されたディレクトリに存在する`.ini`拡張子を持つすべてのファイルを読み込みます。 diff --git a/docs/ja/known-issues.md b/docs/ja/known-issues.md index 19e6330698..884daa3ac2 100644 --- a/docs/ja/known-issues.md +++ b/docs/ja/known-issues.md @@ -6,7 +6,7 @@ | 名前 | 理由 | 代替手段 | | ----------------------------------------------------------------------------------------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------------------- | -| [imap](https://www.php.net/manual/en/imap.installation.php) | スレッドセーフでない | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | +| [imap](https://www.php.net/manual/imap.installation.php) | スレッドセーフでない | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | | [newrelic](https://docs.newrelic.com/docs/apm/agents/php-agent/getting-started/introduction-new-relic-php/) | スレッドセーフでない | - | ## バグのあるPHP拡張モジュール @@ -15,15 +15,15 @@ | 名前 | 問題 | | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| [ext-openssl](https://www.php.net/manual/en/book.openssl.php) | FrankenPHPの静的ビルド(musl libcでビルド)を使用した場合、高負荷時にOpenSSL拡張がクラッシュすることがあります。回避策として動的リンクのビルド(Dockerイメージで使用されているもの)を使用してください。このバグは[PHP側で追跡中](https://github.com/php/php-src/issues/13648)です。 | +| [ext-openssl](https://www.php.net/manual/book.openssl.php) | FrankenPHPの静的ビルド(musl libcでビルド)を使用した場合、高負荷時にOpenSSL拡張がクラッシュすることがあります。回避策として動的リンクのビルド(Dockerイメージで使用されているもの)を使用してください。このバグは[PHP側で追跡中](https://github.com/php/php-src/issues/13648)です。 | ## get_browser -[get_browser()](https://www.php.net/manual/en/function.get-browser.php)関数は継続使用するとパフォーマンスが悪化することが確認されています。回避策として、User Agentごとの結果をキャッシュ(例:[APCu](https://www.php.net/manual/en/book.apcu.php)を利用)してください。User Agentごとの結果は静的なためです。 +[get_browser()](https://www.php.net/manual/function.get-browser.php)関数は継続使用するとパフォーマンスが悪化することが確認されています。回避策として、User Agentごとの結果をキャッシュ(例:[APCu](https://www.php.net/manual/book.apcu.php)を利用)してください。User Agentごとの結果は静的なためです。 ## スタンドアロンバイナリおよびAlpineベースのDockerイメージ -スタンドアロンバイナリおよびAlpineベースのDockerイメージ(`dunglas/frankenphp:*-alpine`)は、バイナリサイズを小さく保つために[glibc and friends](https://www.etalabs.net/compare_libcs.html)ではなく[musl libc](https://musl.libc.org/)を使用しています。これによりいくつかの互換性問題が発生する可能性があります。特に、globフラグ`GLOB_BRACE`は [サポートされていません](https://www.php.net/manual/en/function.glob.php) 。 +スタンドアロンバイナリおよびAlpineベースのDockerイメージ(`dunglas/frankenphp:*-alpine`)は、バイナリサイズを小さく保つために[glibc and friends](https://www.etalabs.net/compare_libcs.html)ではなく[musl libc](https://musl.libc.org/)を使用しています。これによりいくつかの互換性問題が発生する可能性があります。特に、globフラグ`GLOB_BRACE`は [サポートされていません](https://www.php.net/manual/function.glob.php) 。 ## Dockerで`https://127.0.0.1`を使用する @@ -122,7 +122,7 @@ error:0A000086:SSL routines::certificate verify failed 静的バイナリにはTLS証明書がバンドルされていないため、OpenSSLにローカルのCA証明書の位置を明示する必要があります。 -[`openssl_get_cert_locations()`](https://www.php.net/manual/en/function.openssl-get-cert-locations.php)の出力を調べて、 +[`openssl_get_cert_locations()`](https://www.php.net/manual/function.openssl-get-cert-locations.php)の出力を調べて、 CA証明書をどこにインストールすべきか確認し、その場所に保存してください。 > [!WARNING] diff --git a/docs/ja/performance.md b/docs/ja/performance.md index 2bbeaecd99..df8f56bdab 100644 --- a/docs/ja/performance.md +++ b/docs/ja/performance.md @@ -23,7 +23,7 @@ `max_threads`はトラフィックを処理するために必要なスレッド数を把握するのに役立ち、レイテンシのスパイクに対してサーバーをより回復力のあるものにできます。 `auto`に設定すると、制限は`php.ini`の`memory_limit`に基づいて推定されます。推定できない場合、 `auto`は代わりに`num_threads`の2倍がデフォルトになります。`auto`は必要なスレッド数を大幅に過小評価する可能性があることに留意してください。 -`max_threads`はPHP FPMの[pm.max_children](https://www.php.net/manual/en/install.fpm.configuration.php#pm.max-children)に似ています。主な違いは、FrankenPHPがプロセスではなくスレッドを使用し、 +`max_threads`はPHP FPMの[pm.max_children](https://www.php.net/manual/install.fpm.configuration.php#pm.max-children)に似ています。主な違いは、FrankenPHPがプロセスではなくスレッドを使用し、 必要に応じて異なるワーカースクリプトと「クラシックモード」間で自動的に委譲することです。 ## ワーカーモード @@ -160,10 +160,10 @@ FrankenPHPは公式のPHPインタープリターを使用しています。 特に以下の点を確認してください: -- [OPcache](https://www.php.net/manual/en/book.opcache.php)がインストールされ、有効化され、適切に設定されていること +- [OPcache](https://www.php.net/manual/book.opcache.php)がインストールされ、有効化され、適切に設定されていること - [Composer autoloader optimizations](https://getcomposer.org/doc/articles/autoloader-optimization.md)を有効にすること - `realpath`キャッシュがアプリケーションのニーズに合わせて十分な大きさであること -- [preloading](https://www.php.net/manual/en/opcache.preloading.php)を使用すること +- [preloading](https://www.php.net/manual/opcache.preloading.php)を使用すること 詳細については、[Symfonyの専用ドキュメントエントリ](https://symfony.com/doc/current/performance.html)をお読みください (Symfonyを使用していなくても、多くのヒントが役立ちます)。 diff --git a/docs/ja/worker.md b/docs/ja/worker.md index ffda677b71..ed8880f8bf 100644 --- a/docs/ja/worker.md +++ b/docs/ja/worker.md @@ -167,7 +167,7 @@ frankenphp { ## スーパーグローバルの動作 -[PHPのスーパーグローバル](https://www.php.net/manual/en/language.variables.superglobals.php)(`$_SERVER`、`$_ENV`、`$_GET`など) +[PHPのスーパーグローバル](https://www.php.net/manual/language.variables.superglobals.php)(`$_SERVER`、`$_ENV`、`$_GET`など) は以下のように動作します: - `frankenphp_handle_request()`が最初に呼び出される前は、スーパーグローバルにはワーカースクリプト自体にバインドされた値が格納されています diff --git a/docs/known-issues.md b/docs/known-issues.md index 4dcc1a6498..f26bd2bb29 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -11,7 +11,7 @@ The following extensions are known not to be compatible with FrankenPHP: | Name | Reason | Alternatives | | ----------------------------------------------------------------------------------------------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------- | -| [imap](https://www.php.net/manual/en/imap.installation.php) | Not thread-safe | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | +| [imap](https://www.php.net/manual/imap.installation.php) | Not thread-safe | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | | [newrelic](https://docs.newrelic.com/docs/apm/agents/php-agent/getting-started/introduction-new-relic-php/) | Not thread-safe | - | ## Buggy PHP extensions @@ -20,17 +20,17 @@ The following extensions have known bugs and unexpected behaviors when used with | Name | Problem | | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [ext-openssl](https://www.php.net/manual/en/book.openssl.php) | When using musl libc, the OpenSSL extension may crash under heavy loads. The problem doesn't occur when using the more popular GNU libc. This bug is [being tracked by PHP](https://github.com/php/php-src/issues/13648). | +| [ext-openssl](https://www.php.net/manual/book.openssl.php) | When using musl libc, the OpenSSL extension may crash under heavy loads. The problem doesn't occur when using the more popular GNU libc. This bug is [being tracked by PHP](https://github.com/php/php-src/issues/13648). | ## get_browser -The [get_browser()](https://www.php.net/manual/en/function.get-browser.php) function seems to perform badly after a while. A workaround is to cache (e.g. with [APCu](https://www.php.net/manual/en/book.apcu.php)) the results per User Agent, as they are static. +The [get_browser()](https://www.php.net/manual/function.get-browser.php) function seems to perform badly after a while. A workaround is to cache (e.g. with [APCu](https://www.php.net/manual/book.apcu.php)) the results per User Agent, as they are static. ## Standalone binary and Alpine-based Docker images The fully static binary and Alpine-based Docker images (`dunglas/frankenphp:*-alpine`) use [musl libc](https://musl.libc.org/) instead of [glibc and friends](https://www.etalabs.net/compare_libcs.html), to keep a smaller binary size. This may lead to some compatibility issues. -In particular, the glob flag `GLOB_BRACE` is [not available](https://www.php.net/manual/en/function.glob.php) +In particular, the glob flag `GLOB_BRACE` is [not available](https://www.php.net/manual/function.glob.php) Prefer using the GNU variant of the static binary and Debian-based Docker images if you encounter issues. @@ -132,7 +132,7 @@ error:0A000086:SSL routines::certificate verify failed As the static binary doesn't bundle TLS certificates, you need to point OpenSSL to your local CA certificates installation. -Inspect the output of [`openssl_get_cert_locations()`](https://www.php.net/manual/en/function.openssl-get-cert-locations.php), +Inspect the output of [`openssl_get_cert_locations()`](https://www.php.net/manual/function.openssl-get-cert-locations.php), to find where CA certificates must be installed and store them at this location. > [!WARNING] diff --git a/docs/performance.md b/docs/performance.md index 97e09e852e..0197e2dc23 100644 --- a/docs/performance.md +++ b/docs/performance.md @@ -28,7 +28,7 @@ unpredictable. The `max_threads` [configuration](config.md#caddyfile-config) all `max_threads` can help you figure out how many threads you need to handle your traffic and can make the server more resilient to latency spikes. If set to `auto`, the limit will be estimated based on the `memory_limit` in your `php.ini`. If not able to do so, `auto` will instead default to 2x `num_threads`. Keep in mind that `auto` might strongly underestimate the number of threads needed. -`max_threads` is similar to PHP FPM's [pm.max_children](https://www.php.net/manual/en/install.fpm.configuration.php#pm.max-children). The main difference is that FrankenPHP uses threads instead of +`max_threads` is similar to PHP FPM's [pm.max_children](https://www.php.net/manual/install.fpm.configuration.php#pm.max-children). The main difference is that FrankenPHP uses threads instead of processes and automatically delegates them across different worker scripts and 'classic mode' as needed. ## Worker mode for higher throughput @@ -166,10 +166,10 @@ All usual PHP-related performance optimizations apply with FrankenPHP. In particular: -- check that [OPcache](https://www.php.net/manual/en/book.opcache.php) is installed, enabled, and properly configured +- check that [OPcache](https://www.php.net/manual/book.opcache.php) is installed, enabled, and properly configured - enable [Composer autoloader optimizations](https://getcomposer.org/doc/articles/autoloader-optimization.md) - ensure that the `realpath` cache is big enough for the needs of your application -- use [preloading](https://www.php.net/manual/en/opcache.preloading.php) +- use [preloading](https://www.php.net/manual/opcache.preloading.php) For more details, read [the Symfony performance tuning documentation](https://symfony.com/doc/current/performance.html) (most tips are useful even if you don't use Symfony). diff --git a/docs/pt-br/config.md b/docs/pt-br/config.md index 82d17db493..23a239d699 100644 --- a/docs/pt-br/config.md +++ b/docs/pt-br/config.md @@ -20,7 +20,7 @@ php_server Um `Caddyfile` mais avançado, que habilita mais recursos e fornece variáveis de ambiente convenientes, é disponibilizado [no repositório FrankenPHP](https://github.com/php/frankenphp/blob/main/caddy/frankenphp/Caddyfile), e com as imagens Docker. -O próprio PHP pode ser configurado [usando um arquivo `php.ini`](https://www.php.net/manual/en/configuration.file.php). +O próprio PHP pode ser configurado [usando um arquivo `php.ini`](https://www.php.net/manual/configuration.file.php). Dependendo do seu método de instalação, o FrankenPHP e o interpretador PHP procurarão por arquivos de configuração nos locais descritos abaixo. @@ -276,11 +276,11 @@ As seguintes variáveis de ambiente podem ser usadas para injetar diretivas Cadd Assim como para as SAPIs FPM e CLI, as variáveis de ambiente são expostas por padrão na superglobal `$_SERVER`. -O valor `S` da [diretiva `variables_order` do PHP](https://www.php.net/manual/en/ini.core.php#ini.variables-order) é sempre equivalente a `ES` independentemente da colocação de `E` em outra parte desta diretiva. +O valor `S` da [diretiva `variables_order` do PHP](https://www.php.net/manual/ini.core.php#ini.variables-order) é sempre equivalente a `ES` independentemente da colocação de `E` em outra parte desta diretiva. ## Configuração do PHP -Para carregar [arquivos de configuração adicionais do PHP](https://www.php.net/manual/en/configuration.file.php#configuration.file.scan), +Para carregar [arquivos de configuração adicionais do PHP](https://www.php.net/manual/configuration.file.php#configuration.file.scan), a variável de ambiente `PHP_INI_SCAN_DIR` pode ser usada. Quando definida, o PHP carregará todos os arquivos com a extensão `.ini` presentes nos diretórios fornecidos. diff --git a/docs/ru/config.md b/docs/ru/config.md index 03d1856d1d..232ab16fcd 100644 --- a/docs/ru/config.md +++ b/docs/ru/config.md @@ -19,7 +19,7 @@ php_server Более продвинутый `Caddyfile`, включающий дополнительные функции и предоставляющий удобные переменные окружения, можно найти [в репозитории FrankenPHP](https://github.com/php/frankenphp/blob/main/caddy/frankenphp/Caddyfile), а также в Docker-образах. -PHP можно настроить [с помощью файла `php.ini`](https://www.php.net/manual/en/configuration.file.php). +PHP можно настроить [с помощью файла `php.ini`](https://www.php.net/manual/configuration.file.php). В зависимости от метода установки, FrankenPHP и PHP-интерпретатор будут искать конфигурационные файлы в местах, описанных ниже. @@ -275,11 +275,11 @@ php_server [] { Как и для FPM и CLI SAPIs, переменные окружения по умолчанию доступны в суперглобальной переменной `$_SERVER`. -Значение `S` в [директиве PHP `variables_order`](https://www.php.net/manual/en/ini.core.php#ini.variables-order) всегда эквивалентно `ES`, независимо от того, где расположена `E` в этой директиве. +Значение `S` в [директиве PHP `variables_order`](https://www.php.net/manual/ini.core.php#ini.variables-order) всегда эквивалентно `ES`, независимо от того, где расположена `E` в этой директиве. ## Конфигурация PHP -Для загрузки [дополнительных конфигурационных файлов PHP](https://www.php.net/manual/en/configuration.file.php#configuration.file.scan) можно использовать переменную окружения `PHP_INI_SCAN_DIR`. +Для загрузки [дополнительных конфигурационных файлов PHP](https://www.php.net/manual/configuration.file.php#configuration.file.scan) можно использовать переменную окружения `PHP_INI_SCAN_DIR`. Если она установлена, PHP загрузит все файлы с расширением `.ini`, находящиеся в указанных директориях. Вы также можете изменить конфигурацию PHP с помощью директивы `php_ini` в `Caddyfile`: diff --git a/docs/ru/known-issues.md b/docs/ru/known-issues.md index 06b8558ecb..14de020de1 100644 --- a/docs/ru/known-issues.md +++ b/docs/ru/known-issues.md @@ -6,7 +6,7 @@ | Название | Причина | Альтернативы | | ----------------------------------------------------------------------------------------------------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -| [imap](https://www.php.net/manual/en/imap.installation.php) | Не поддерживает потокобезопасность | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | +| [imap](https://www.php.net/manual/imap.installation.php) | Не поддерживает потокобезопасность | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | | [newrelic](https://docs.newrelic.com/docs/apm/agents/php-agent/getting-started/introduction-new-relic-php/) | Не поддерживает потокобезопасность | - | ## Проблемные расширения PHP @@ -15,15 +15,15 @@ | Название | Проблема | | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [ext-openssl](https://www.php.net/manual/en/book.openssl.php) | При использовании статической сборки FrankenPHP (на базе musl libc) расширение OpenSSL может аварийно завершаться при высокой нагрузке. Решение — использовать динамически связанную сборку (например, ту, что используется в Docker-образах). Ошибка [отслеживается сообществом PHP](https://github.com/php/php-src/issues/13648). | +| [ext-openssl](https://www.php.net/manual/book.openssl.php) | При использовании статической сборки FrankenPHP (на базе musl libc) расширение OpenSSL может аварийно завершаться при высокой нагрузке. Решение — использовать динамически связанную сборку (например, ту, что используется в Docker-образах). Ошибка [отслеживается сообществом PHP](https://github.com/php/php-src/issues/13648). | ## `get_browser` -Функция [get_browser()](https://www.php.net/manual/en/function.get-browser.php) начинает работать медленно через некоторое время. Решение — кэшировать результаты для каждого User-Agent, например, с помощью [APCu](https://www.php.net/manual/en/book.apcu.php), так как они статичны. +Функция [get_browser()](https://www.php.net/manual/function.get-browser.php) начинает работать медленно через некоторое время. Решение — кэшировать результаты для каждого User-Agent, например, с помощью [APCu](https://www.php.net/manual/book.apcu.php), так как они статичны. ## Автономные бинарные файлы и образы на базе Alpine -Автономные бинарные файлы и образы на базе Alpine (`dunglas/frankenphp:*-alpine`) используют [musl libc](https://musl.libc.org/) вместо [glibc](https://www.etalabs.net/compare_libcs.html) для уменьшения размера бинарных файлов. Это может вызвать проблемы совместимости. В частности, флаг `GLOB_BRACE` в функции glob [не поддерживается](https://www.php.net/manual/en/function.glob.php). +Автономные бинарные файлы и образы на базе Alpine (`dunglas/frankenphp:*-alpine`) используют [musl libc](https://musl.libc.org/) вместо [glibc](https://www.etalabs.net/compare_libcs.html) для уменьшения размера бинарных файлов. Это может вызвать проблемы совместимости. В частности, флаг `GLOB_BRACE` в функции glob [не поддерживается](https://www.php.net/manual/function.glob.php). ## Использование `https://127.0.0.1` с Docker @@ -121,7 +121,7 @@ error:0A000086:SSL routines::certificate verify failed Статический бинарный файл не включает TLS-сертификаты, поэтому необходимо указать OpenSSL местоположение локальных сертификатов CA. -Выполните [`openssl_get_cert_locations()`](https://www.php.net/manual/en/function.openssl-get-cert-locations.php), чтобы определить, где должны находиться сертификаты CA, и поместите их туда. +Выполните [`openssl_get_cert_locations()`](https://www.php.net/manual/function.openssl-get-cert-locations.php), чтобы определить, где должны находиться сертификаты CA, и поместите их туда. > [!WARNING] > Веб и CLI контексты могут иметь разные настройки. diff --git a/docs/ru/performance.md b/docs/ru/performance.md index d79e101090..9b10fcee20 100644 --- a/docs/ru/performance.md +++ b/docs/ru/performance.md @@ -14,7 +14,7 @@ ### `max_threads` -Хотя всегда лучше точно знать, как будет выглядеть ваш трафик, реальные приложения, как правило, более непредсказуемы. [Конфигурация](config.md#конфигурация-caddyfile) `max_threads` позволяет FrankenPHP автоматически создавать дополнительные потоки во время выполнения до указанного предела. `max_threads` может помочь вам определить, сколько потоков требуется для обработки вашего трафика, и может сделать сервер более устойчивым к скачкам задержки. Если установлено значение `auto`, лимит будет оценен на основе `memory_limit` в вашем `php.ini`. Если это невозможно, `auto` вместо этого будет по умолчанию равно 2x `num_threads`. Имейте в виду, что `auto` может сильно недооценивать необходимое количество потоков. `max_threads` похожа на [pm.max_children](https://www.php.net/manual/en/install.fpm.configuration.php#pm.max-children) в PHP FPM. Основное отличие состоит в том, что FrankenPHP использует потоки вместо процессов и автоматически распределяет их между различными скриптами воркеров и 'классическим режимом' по мере необходимости. +Хотя всегда лучше точно знать, как будет выглядеть ваш трафик, реальные приложения, как правило, более непредсказуемы. [Конфигурация](config.md#конфигурация-caddyfile) `max_threads` позволяет FrankenPHP автоматически создавать дополнительные потоки во время выполнения до указанного предела. `max_threads` может помочь вам определить, сколько потоков требуется для обработки вашего трафика, и может сделать сервер более устойчивым к скачкам задержки. Если установлено значение `auto`, лимит будет оценен на основе `memory_limit` в вашем `php.ini`. Если это невозможно, `auto` вместо этого будет по умолчанию равно 2x `num_threads`. Имейте в виду, что `auto` может сильно недооценивать необходимое количество потоков. `max_threads` похожа на [pm.max_children](https://www.php.net/manual/install.fpm.configuration.php#pm.max-children) в PHP FPM. Основное отличие состоит в том, что FrankenPHP использует потоки вместо процессов и автоматически распределяет их между различными скриптами воркеров и 'классическим режимом' по мере необходимости. ## Режим воркера @@ -131,10 +131,10 @@ FrankenPHP использует официальный интерпретато В частности: -- убедитесь, что [OPcache](https://www.php.net/manual/en/book.opcache.php) установлен, включён и настроен должным образом; +- убедитесь, что [OPcache](https://www.php.net/manual/book.opcache.php) установлен, включён и настроен должным образом; - включите [оптимизацию автозагрузки Composer](https://getcomposer.org/doc/articles/autoloader-optimization.md); - убедитесь, что кеш `realpath` достаточно велик для нужд вашего приложения; -- используйте [предварительную загрузку](https://www.php.net/manual/en/opcache.preloading.php). +- используйте [предварительную загрузку](https://www.php.net/manual/opcache.preloading.php). Для получения более подробной информации ознакомьтесь с [разделом документации Symfony, посвященным производительности](https://symfony.com/doc/current/performance.html) (большинство советов полезны, даже если вы не используете Symfony). diff --git a/docs/ru/worker.md b/docs/ru/worker.md index 57babc77d9..fe55d92504 100644 --- a/docs/ru/worker.md +++ b/docs/ru/worker.md @@ -163,7 +163,7 @@ frankenphp { ## Поведение суперглобальных переменных -[PHP суперглобальные переменные](https://www.php.net/manual/en/language.variables.superglobals.php) (`$_SERVER`, `$_ENV`, `$_GET`...) ведут себя следующим образом: +[PHP суперглобальные переменные](https://www.php.net/manual/language.variables.superglobals.php) (`$_SERVER`, `$_ENV`, `$_GET`...) ведут себя следующим образом: - до первого вызова `frankenphp_handle_request()`, суперглобальные переменные содержат значения, связанные с самим worker-скриптом - во время и после вызова `frankenphp_handle_request()`, суперглобальные переменные содержат значения, сгенерированные на основе обработанного HTTP-запроса, каждый вызов `frankenphp_handle_request()` изменяет значения суперглобальных переменных diff --git a/docs/tr/config.md b/docs/tr/config.md index 790690199f..c15968e8bc 100644 --- a/docs/tr/config.md +++ b/docs/tr/config.md @@ -17,7 +17,7 @@ php_server Daha fazla özellik sağlayan ve kullanışlı ortam değişkenleri sunan daha gelişmiş bir `Caddyfile`, [FrankenPHP deposunda](https://github.com/php/frankenphp/blob/main/caddy/frankenphp/Caddyfile) ve Docker imajlarıyla birlikte sağlanır. -PHP'nin kendisi [bir `php.ini` dosyası kullanılarak yapılandırılabilir](https://www.php.net/manual/en/configuration.file.php). +PHP'nin kendisi [bir `php.ini` dosyası kullanılarak yapılandırılabilir](https://www.php.net/manual/configuration.file.php). Kurulum yönteminize bağlı olarak, FrankenPHP ve PHP yorumlayıcısı, aşağıda açıklanan konumlardaki yapılandırma dosyalarını arayacaktır. @@ -263,11 +263,11 @@ Aşağıdaki ortam değişkenleri `Caddyfile` içinde değişiklik yapmadan Cadd FPM ve CLI SAPI'lerinde olduğu gibi, ortam değişkenleri varsayılan olarak `$_SERVER` süper globalinde gösterilir. -[`variables_order`'a ait PHP yönergesinin](https://www.php.net/manual/en/ini.core.php#ini.variables-order) `S` değeri bu yönergede `E`'nin başka bir yere yerleştirilmesinden bağımsız olarak her zaman `ES` ile eş değerdir. +[`variables_order`'a ait PHP yönergesinin](https://www.php.net/manual/ini.core.php#ini.variables-order) `S` değeri bu yönergede `E`'nin başka bir yere yerleştirilmesinden bağımsız olarak her zaman `ES` ile eş değerdir. ## PHP konfigürasyonu -Ek olarak [PHP yapılandırma dosyalarını](https://www.php.net/manual/en/configuration.file.php#configuration.file.scan) yüklemek için, +Ek olarak [PHP yapılandırma dosyalarını](https://www.php.net/manual/configuration.file.php#configuration.file.scan) yüklemek için, `PHP_INI_SCAN_DIR` ortam değişkeni kullanılabilir. Ayarlandığında, PHP verilen dizinlerde bulunan `.ini` uzantılı tüm dosyaları yükleyecektir. diff --git a/docs/tr/known-issues.md b/docs/tr/known-issues.md index a934375a12..efb3590ebe 100644 --- a/docs/tr/known-issues.md +++ b/docs/tr/known-issues.md @@ -6,7 +6,7 @@ Aşağıdaki eklentilerin FrankenPHP ile uyumlu olmadığı bilinmektedir: | Adı | Nedeni | Alternatifleri | | ----------------------------------------------------------- | -------------------------- | -------------------------------------------------------------------------------------------------------------------- | -| [imap](https://www.php.net/manual/en/imap.installation.php) | İş parçacığı güvenli değil | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | +| [imap](https://www.php.net/manual/imap.installation.php) | İş parçacığı güvenli değil | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | ## Sorunlu PHP Eklentileri @@ -17,7 +17,7 @@ Aşağıdaki eklentiler FrankenPHP ile kullanıldığında bilinen hatalara ve b ## get_browser -[get_browser()](https://www.php.net/manual/en/function.get-browser.php) fonksiyonu bir süre sonra kötü performans gösteriyor gibi görünüyor. Geçici bir çözüm, statik oldukları için User-Agent başına sonuçları önbelleğe almaktır (örneğin [APCu](https://www.php.net/manual/en/book.apcu.php) ile). +[get_browser()](https://www.php.net/manual/function.get-browser.php) fonksiyonu bir süre sonra kötü performans gösteriyor gibi görünüyor. Geçici bir çözüm, statik oldukları için User-Agent başına sonuçları önbelleğe almaktır (örneğin [APCu](https://www.php.net/manual/book.apcu.php) ile). ## Binary Çıktısı ve Alpine Tabanlı Docker İmajları diff --git a/docs/tr/performance.md b/docs/tr/performance.md index d037b78499..1c6f4e453c 100644 --- a/docs/tr/performance.md +++ b/docs/tr/performance.md @@ -23,7 +23,7 @@ tahmin edilemez olma eğilimindedir. `max_threads` [yapılandırması](config.md `max_threads`, trafiğinizi yönetmek için kaç iş parçacığına ihtiyacınız olduğunu anlamanıza yardımcı olabilir ve sunucuyu gecikme artışlarına karşı daha dirençli hale getirebilir. Eğer `auto` olarak ayarlanırsa, sınır `php.ini` dosyanızdaki `memory_limit` değerine göre tahmin edilecektir. Bunu yapamazsa, `auto` bunun yerine varsayılan olarak 2x `num_threads` olacaktır. `auto`'nun ihtiyaç duyulan iş parçacığı sayısını büyük ölçüde küçümseyebileceğini unutmayın. -`max_threads`, PHP FPM'nin [pm.max_children](https://www.php.net/manual/en/install.fpm.configuration.php#pm.max-children) ile benzerdir. Temel fark, FrankenPHP'nin süreçler yerine +`max_threads`, PHP FPM'nin [pm.max_children](https://www.php.net/manual/install.fpm.configuration.php#pm.max-children) ile benzerdir. Temel fark, FrankenPHP'nin süreçler yerine iş parçacıkları kullanması ve gerektiğinde bunları farklı işçi komut dosyaları ve 'klasik mod' arasında otomatik olarak devretmesidir. ## İşçi Modu @@ -158,10 +158,10 @@ Tüm olağan PHP ile ilgili performans optimizasyonları FrankenPHP ile de geçe Özellikle: -- [OPcache](https://www.php.net/manual/en/book.opcache.php)'in kurulu, etkin ve doğru şekilde yapılandırıldığını kontrol edin +- [OPcache](https://www.php.net/manual/book.opcache.php)'in kurulu, etkin ve doğru şekilde yapılandırıldığını kontrol edin - [Composer otomatik yükleyici optimizasyonlarını](https://getcomposer.org/doc/articles/autoloader-optimization.md) etkinleştirin - `realpath` önbelleğinin uygulamanızın ihtiyaçları için yeterince büyük olduğundan emin olun -- [ön yüklemeyi](https://www.php.net/manual/en/opcache.preloading.php) kullanın +- [ön yüklemeyi](https://www.php.net/manual/opcache.preloading.php) kullanın Daha fazla ayrıntı için, [Symfony'nin bu konuya ayrılmış dokümantasyon girişini](https://symfony.com/doc/current/performance.html) okuyun (ipuçlarının çoğu Symfony kullanmasanız bile faydalıdır). diff --git a/docs/tr/worker.md b/docs/tr/worker.md index 1aa65ba411..7db478ab3e 100644 --- a/docs/tr/worker.md +++ b/docs/tr/worker.md @@ -161,7 +161,7 @@ frankenphp { ## Süper Küresel Değişkenlerin Davranışı -[PHP süper küresel değişkenleri](https://www.php.net/manual/en/language.variables.superglobals.php) (`$_SERVER`, `$_ENV`, `$_GET`...) aşağıdaki gibi davranır: +[PHP süper küresel değişkenleri](https://www.php.net/manual/language.variables.superglobals.php) (`$_SERVER`, `$_ENV`, `$_GET`...) aşağıdaki gibi davranır: - `frankenphp_handle_request()`'e ilk çağrıdan önce, süper küresel değişkenler worker betiğinin kendisine bağlı değerleri içerir - `frankenphp_handle_request()` çağrısı sırasında ve sonrasında, süper küresel değişkenler işlenen HTTP isteğinden üretilen değerleri içerir, `frankenphp_handle_request()`'e yapılan her çağrı süper küresel değişken değerlerini değiştirir diff --git a/docs/translate.php b/docs/translate.php index f7568e43db..2abd71916c 100644 --- a/docs/translate.php +++ b/docs/translate.php @@ -2,7 +2,7 @@ # update all translations to match the english docs # usage: php docs/translate.php [specific-file.md] -# needs: php with openssl and gemini api key +# needs: php with openssl and Gemini api key const MODEL = 'gemini-2.5-flash'; const SLEEP_SECONDS_BETWEEN_REQUESTS = 10; @@ -14,29 +14,32 @@ 'ru' => 'Russian', 'tr' => 'Turkish', ]; -const SYSTEM_PROMPT = << ["parts" => [["text" => $systemPrompt]]], "contents" => [ - ["role" => "model", "parts" => ['text' => $systemPrompt]], - ["role" => "user", "parts" => ['text' => $userPrompt]] + ["role" => "user", "parts" => [["text" => $userPrompt]]], ], ]); @@ -53,11 +56,14 @@ function makeGeminiRequest(string $systemPrompt, string $userPrompt, string $mod if (!$response || !$generatedDocs) { print_r(error_get_last()); print_r($response); + if ($reties > 0) { echo "Retrying... ($reties retries left)\n"; sleep(SLEEP_SECONDS_BETWEEN_REQUESTS); + return makeGeminiRequest($systemPrompt, $userPrompt, $model, $apiKey, $reties - 1); } + exit(1); } @@ -67,23 +73,23 @@ function makeGeminiRequest(string $systemPrompt, string $userPrompt, string $mod function createPrompt(string $language, string $englishFile, string $currentTranslation): array { $languageName = LANGUAGES[$language]; - $userPrompt = << $languageName) { echo "Translating $file to $languageName\n"; $currentTranslation = file_get_contents(__DIR__ . "/$language/$file") ?: ''; diff --git a/docs/worker.md b/docs/worker.md index cd78811a28..b299ed3782 100644 --- a/docs/worker.md +++ b/docs/worker.md @@ -153,7 +153,7 @@ frankenphp { ## Superglobals behavior -[PHP superglobals](https://www.php.net/manual/en/language.variables.superglobals.php) (`$_SERVER`, `$_ENV`, `$_GET`...) +[PHP superglobals](https://www.php.net/manual/language.variables.superglobals.php) (`$_SERVER`, `$_ENV`, `$_GET`...) behave as follows: - before the first call to `frankenphp_handle_request()`, superglobals contain values bound to the worker script itself From 89625d05c718524e25dc0e5e5778f9a2d4ea798e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 12 May 2026 15:47:35 +0200 Subject: [PATCH 2/4] fix(docs): refine translate.php prompt, sanitization, and file checks - createPrompt: branch the user prompt on whether the target translation already exists, instead of feeding the model an empty translation block. - sanitizeMarkdown: strip leading ```/```markdown and trailing ``` via regex so optional whitespace or missing language tag don't bleed through to the written file. - main loop: check file_exists before reading the per-language file to avoid a PHP warning on first-time translations. --- docs/translate.php | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/docs/translate.php b/docs/translate.php index 2abd71916c..f470ad2a59 100644 --- a/docs/translate.php +++ b/docs/translate.php @@ -73,34 +73,23 @@ function makeGeminiRequest(string $systemPrompt, string $userPrompt, string $mod function createPrompt(string $language, string $englishFile, string $currentTranslation): array { $languageName = LANGUAGES[$language]; - $userPrompt = << $languageName) { echo "Translating $file to $languageName\n"; - $currentTranslation = file_get_contents(__DIR__ . "/$language/$file") ?: ''; + $translationPath = __DIR__ . "/$language/$file"; + $currentTranslation = file_exists($translationPath) ? file_get_contents($translationPath) : ''; [$systemPrompt, $userPrompt] = createPrompt($language, $englishFile, $currentTranslation); $markdown = makeGeminiRequest($systemPrompt, $userPrompt, MODEL, $apiKey); echo "Writing translated file to $language/$file\n"; - file_put_contents(__DIR__ . "/$language/$file", sanitizeMarkdown($markdown)); + file_put_contents($translationPath, sanitizeMarkdown($markdown)); echo "sleeping to avoid rate limiting...\n"; sleep(SLEEP_SECONDS_BETWEEN_REQUESTS); From 0ebd8716832cb1928dd755b7f5011790dc3082d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 12 May 2026 15:53:10 +0200 Subject: [PATCH 3/4] fix(docs): translate.php nits from Copilot review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename $reties → $retries (typo). - Capitalize "English" / "Gemini API key" in script header and STDIN prompt. --- docs/translate.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/translate.php b/docs/translate.php index f470ad2a59..0a375b5a1b 100644 --- a/docs/translate.php +++ b/docs/translate.php @@ -1,8 +1,8 @@ 0) { - echo "Retrying... ($reties retries left)\n"; + if ($retries > 0) { + echo "Retrying... ($retries retries left)\n"; sleep(SLEEP_SECONDS_BETWEEN_REQUESTS); - return makeGeminiRequest($systemPrompt, $userPrompt, $model, $apiKey, $reties - 1); + return makeGeminiRequest($systemPrompt, $userPrompt, $model, $apiKey, $retries - 1); } exit(1); @@ -99,7 +99,7 @@ function sanitizeMarkdown(string $markdown): string $fileToTranslate = array_map(fn($filename) => trim($filename), $fileToTranslate); $apiKey = $_SERVER['GEMINI_API_KEY'] ?? $_ENV['GEMINI_API_KEY'] ?? ''; if (!$apiKey) { - echo 'Enter gemini api key ($GEMINI_API_KEY): '; + echo 'Enter Gemini API key ($GEMINI_API_KEY): '; $apiKey = trim(fgets(STDIN)); } From b16ab363653adf2011768cc6076c7c960c3a93f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 12 May 2026 16:14:29 +0200 Subject: [PATCH 4/4] =?UTF-8?q?docs:=20cosmetic=20pass=20=E2=80=94=20typos?= =?UTF-8?q?,=20grammar,=20headings,=20php.net=20pt=5FBR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - English: ~28 fixes across 13 files (typos, "superior" → "higher", "allows to X" → "makes it easy to X" / "provides", "On Mac" → "On macOS", filler-opener removals, capitalization). - French (16 files): titles to sentence case, French typographic spacing before colons/semicolons, accent fixes ("inpectez" → "inspectez", "echoue" → "échoue"), "200$" → "200 $", drop English fragment in JSON logs note, "Build:" → "Construisez :". - Spanish (17 files): titles to sentence case, gender/article fixes ("La Hot Reload" → "El hot reload"), inverted "¡" added, fix broken link in performance.md, stray punctuation in logging.md. - pt-BR (9 files): typo "suite" → "suíte", singular agreement "extraia-os" → "extraia-o", drop non-standard "embedagem" → "incorporação", missing periods, list markdown break. - Strip the remaining /pt_BR/ language segment from php.net URLs. --- docs/compile.md | 4 +- docs/config.md | 4 +- docs/docker.md | 6 +- docs/embed.md | 2 +- docs/es/classic.md | 2 +- docs/es/docker.md | 6 +- docs/es/early-hints.md | 2 +- docs/es/embed.md | 16 ++--- docs/es/extension-workers.md | 34 +++++------ docs/es/extensions.md | 100 ++++++++++++++++---------------- docs/es/github-actions.md | 4 +- docs/es/hot-reload.md | 16 ++--- docs/es/known-issues.md | 12 ++-- docs/es/laravel.md | 8 +-- docs/es/logging.md | 6 +- docs/es/mercure.md | 10 ++-- docs/es/performance.md | 16 ++--- docs/es/production.md | 12 ++-- docs/es/static.md | 14 ++--- docs/es/wordpress.md | 6 +- docs/es/worker.md | 20 +++---- docs/extensions.md | 14 ++--- docs/fr/CONTRIBUTING.md | 16 ++--- docs/fr/README.md | 4 +- docs/fr/config.md | 6 +- docs/fr/docker.md | 2 +- docs/fr/embed.md | 2 +- docs/fr/extension-workers.md | 10 ++-- docs/fr/extensions.md | 72 +++++++++++------------ docs/fr/hot-reload.md | 6 +- docs/fr/known-issues.md | 8 +-- docs/fr/laravel.md | 10 ++-- docs/fr/mercure.md | 4 +- docs/fr/metrics.md | 16 ++--- docs/fr/production.md | 6 +- docs/fr/static.md | 4 +- docs/fr/worker.md | 4 +- docs/fr/x-sendfile.md | 2 +- docs/github-actions.md | 2 +- docs/known-issues.md | 4 +- docs/laravel.md | 2 +- docs/metrics.md | 2 +- docs/performance.md | 6 +- docs/production.md | 6 +- docs/pt-br/CONTRIBUTING.md | 2 +- docs/pt-br/compile.md | 2 +- docs/pt-br/config.md | 2 +- docs/pt-br/extension-workers.md | 4 +- docs/pt-br/extensions.md | 2 +- docs/pt-br/known-issues.md | 12 ++-- docs/pt-br/laravel.md | 2 +- docs/pt-br/performance.md | 6 +- docs/pt-br/worker.md | 2 +- docs/static.md | 2 +- docs/worker.md | 2 +- 55 files changed, 273 insertions(+), 273 deletions(-) diff --git a/docs/compile.md b/docs/compile.md index 065006a32b..cff982ea1a 100644 --- a/docs/compile.md +++ b/docs/compile.md @@ -12,7 +12,7 @@ Alternatively, [fully and mostly static builds](static.md) can also be created. ## Install PHP -FrankenPHP is compatible with PHP 8.2 and superior. +FrankenPHP is compatible with PHP 8.2 and higher. ### With Homebrew (Linux and Mac) @@ -97,7 +97,7 @@ You can now build the final binary. ### Using xcaddy The recommended way is to use [xcaddy](https://github.com/caddyserver/xcaddy) to compile FrankenPHP. -`xcaddy` also allows to easily add [custom Caddy modules](https://caddyserver.com/docs/modules/) and FrankenPHP extensions: +`xcaddy` also makes it easy to add [custom Caddy modules](https://caddyserver.com/docs/modules/) and FrankenPHP extensions: ```console CGO_ENABLED=1 \ diff --git a/docs/config.md b/docs/config.md index ada3840970..5655142bbb 100644 --- a/docs/config.md +++ b/docs/config.md @@ -5,7 +5,7 @@ description: Configure FrankenPHP and Caddy via Caddyfile, JSON, or environment # Configuration -FrankenPHP, Caddy as well as the [Mercure](mercure.md) and [Vulcain](https://vulcain.rocks) modules can be configured using [the formats supported by Caddy](https://caddyserver.com/docs/getting-started#your-first-config). +FrankenPHP, Caddy, as well as the [Mercure](mercure.md) and [Vulcain](https://vulcain.rocks) modules, can be configured using [the formats supported by Caddy](https://caddyserver.com/docs/getting-started#your-first-config). The most common format is the `Caddyfile`, which is a simple, human-readable text format. By default, FrankenPHP will look for a `Caddyfile` in the current directory. @@ -338,7 +338,7 @@ If you want to use HTTPS with the `127.0.0.1` IP address instead of the `localho ### Full duplex (HTTP/1) When using HTTP/1.x, it may be desirable to enable full-duplex mode to allow writing a response before the entire body -has been read. (for example: [Mercure](mercure.md), WebSocket, Server-Sent Events, etc.) +has been read (for example: [Mercure](mercure.md), WebSocket, Server-Sent Events, etc.). This is an opt-in configuration that needs to be added to the global options in the `Caddyfile`: diff --git a/docs/docker.md b/docs/docker.md index ed39639d10..c72bd8a58f 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -92,7 +92,7 @@ COPY --from=builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp ``` The `builder` image provided by FrankenPHP contains a compiled version of `libphp`. -[Builders images](https://hub.docker.com/r/dunglas/frankenphp/tags?name=builder) are provided for all versions of FrankenPHP and PHP, both for Debian and Alpine. +[Builder images](https://hub.docker.com/r/dunglas/frankenphp/tags?name=builder) are provided for all versions of FrankenPHP and PHP, both for Debian and Alpine. > [!TIP] > @@ -121,7 +121,7 @@ docker run -v $PWD:/app/public -p 80:80 -p 443:443 -p 443:443/udp --tty my-php-a > [!TIP] > -> The `--tty` option allows to have nice human-readable logs instead of JSON logs. +> The `--tty` option provides nice human-readable logs instead of JSON logs. With Docker Compose: @@ -143,7 +143,7 @@ services: - ./:/app/public - caddy_data:/data - caddy_config:/config - # comment the following line in production, it allows to have nice human-readable logs in dev + # comment the following line in production, it provides nice human-readable logs in dev tty: true # Volumes needed for Caddy certificates and configuration diff --git a/docs/embed.md b/docs/embed.md index 627a7e3ca4..eb250e7ae1 100644 --- a/docs/embed.md +++ b/docs/embed.md @@ -146,5 +146,5 @@ To customize the extensions, use the `PHP_EXTENSIONS` environment variable. On Linux, the created binary is compressed using [UPX](https://upx.github.io). -On Mac, to reduce the size of the file before sending it, you can compress it. +On macOS, to reduce the size of the file before sending it, you can compress it. We recommend `xz`. diff --git a/docs/es/classic.md b/docs/es/classic.md index 154daeaf9f..7c7b563fbd 100644 --- a/docs/es/classic.md +++ b/docs/es/classic.md @@ -1,4 +1,4 @@ -# Usando el Modo Clásico +# Usando el modo clásico Sin ninguna configuración adicional, FrankenPHP opera en modo clásico. En este modo, FrankenPHP funciona como un servidor PHP tradicional, sirviendo directamente archivos PHP. Esto lo convierte en un reemplazo directo para PHP-FPM o Apache con mod_php. diff --git a/docs/es/docker.md b/docs/es/docker.md index b90b62cf1d..14854a1c6b 100644 --- a/docs/es/docker.md +++ b/docs/es/docker.md @@ -93,7 +93,7 @@ Se proporcionan [imágenes de constructor](https://hub.docker.com/r/dunglas/fran > Si está usando Alpine Linux y Symfony, > es posible que deba [aumentar el tamaño de pila predeterminado](compile.md#using-xcaddy). -## Habilitar el modo Worker por defecto +## Habilitar el modo worker por defecto Establezca la variable de entorno `FRANKENPHP_CONFIG` para iniciar FrankenPHP con un script de worker: @@ -200,7 +200,7 @@ Las imágenes Docker se construyen: - Cuando se etiqueta una nueva versión - Diariamente a las 4 am UTC, si hay nuevas versiones de las imágenes oficiales de PHP disponibles -## Endurecimiento de Imágenes +## Endurecimiento de imágenes Para reducir aún más la superficie de ataque y el tamaño de tus imágenes Docker de FrankenPHP, también es posible construirlas sobre una imagen [Google distroless](https://github.com/GoogleContainerTools/distroless) o @@ -260,7 +260,7 @@ COPY --from=builder /tmp/libs /usr/lib COPY --from=builder /usr/local/etc/php/conf.d /usr/local/etc/php/conf.d COPY --from=builder /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini -# Directorios de datos de Caddy — deben ser escribibles para nonroot, incluso en un sistema de archivos raíz de solo lectura +# Directorios de datos de Caddy: deben ser escribibles para nonroot, incluso en un sistema de archivos raíz de solo lectura ENV XDG_CONFIG_HOME=/config \ XDG_DATA_HOME=/data COPY --from=builder --chown=nonroot:nonroot /data/caddy /data/caddy diff --git a/docs/es/early-hints.md b/docs/es/early-hints.md index 9b929fcb27..3ffd0983fd 100644 --- a/docs/es/early-hints.md +++ b/docs/es/early-hints.md @@ -1,4 +1,4 @@ -# Early Hints (Pistas Tempranas) +# Early Hints (pistas tempranas) FrankenPHP soporta nativamente el [código de estado 103 Early Hints](https://developer.chrome.com/blog/early-hints/). El uso de Early Hints puede mejorar el tiempo de carga de sus páginas web hasta en un 30%. diff --git a/docs/es/embed.md b/docs/es/embed.md index 5841ce3414..77b2574dad 100644 --- a/docs/es/embed.md +++ b/docs/es/embed.md @@ -1,4 +1,4 @@ -# Aplicaciones PHP como Binarios Autónomos +# Aplicaciones PHP como binarios autónomos FrankenPHP tiene la capacidad de incrustar el código fuente y los activos de aplicaciones PHP en un binario estático y autónomo. @@ -8,7 +8,7 @@ Obtenga más información sobre esta característica [en la presentación realiz Para incrustar aplicaciones Laravel, [lea esta entrada específica de documentación](laravel.md#laravel-apps-as-standalone-binaries). -## Preparando su Aplicación +## Preparando su aplicación Antes de crear el binario autónomo, asegúrese de que su aplicación esté lista para ser incrustada. @@ -42,12 +42,12 @@ composer install --ignore-platform-reqs --no-dev -a composer dump-env prod ``` -### Personalizar la Configuración +### Personalizar la configuración Para personalizar [la configuración](config.md), puede colocar un archivo `Caddyfile` así como un archivo `php.ini` en el directorio principal de la aplicación a incrustar (`$TMPDIR/my-prepared-app` en el ejemplo anterior). -## Crear un Binario para Linux +## Crear un binario para Linux La forma más fácil de crear un binario para Linux es usar el constructor basado en Docker que proporcionamos. @@ -85,7 +85,7 @@ La forma más fácil de crear un binario para Linux es usar el constructor basad El binario resultante es el archivo llamado `my-app` en el directorio actual. -## Crear un Binario para Otros Sistemas Operativos +## Crear un binario para otros sistemas operativos Si no desea usar Docker o desea construir un binario para macOS, use el script de shell que proporcionamos: @@ -97,7 +97,7 @@ EMBED=/path/to/your/app ./build-static.sh El binario resultante es el archivo llamado `frankenphp--` en el directorio `dist/`. -## Usar el Binario +## Usar el binario ¡Listo! El archivo `my-app` (o `dist/frankenphp--` en otros sistemas operativos) contiene su aplicación autónoma. @@ -132,11 +132,11 @@ Si el archivo `composer.json` no existe, se construirán las extensiones predete Para personalizar las extensiones, use la variable de entorno `PHP_EXTENSIONS`. -## Personalizar la Compilación +## Personalizar la compilación [Lea la documentación de compilación estática](static.md) para ver cómo personalizar el binario (extensiones, versión de PHP, etc.). -## Distribuir el Binario +## Distribuir el binario En Linux, el binario creado se comprime usando [UPX](https://upx.github.io). diff --git a/docs/es/extension-workers.md b/docs/es/extension-workers.md index c7e3654507..5fbac4c5cf 100644 --- a/docs/es/extension-workers.md +++ b/docs/es/extension-workers.md @@ -2,9 +2,9 @@ Los Extension Workers permiten que tu [extensión FrankenPHP](https://frankenphp.dev/docs/extensions/) gestione un pool dedicado de hilos PHP para ejecutar tareas en segundo plano, manejar eventos asíncronos o implementar protocolos personalizados. Útil para sistemas de colas, listeners de eventos, programadores, etc. -## Registrando el Worker +## Registrando el worker -### Registro Estático +### Registro estático Si no necesitas hacer que el worker sea configurable por el usuario (ruta de script fija, número fijo de hilos), simplemente puedes registrar el worker en la función `init()`. @@ -33,23 +33,23 @@ func init() { } ``` -### En un Módulo Caddy (Configurable por el usuario) +### En un módulo Caddy (configurable por el usuario) Si planeas compartir tu extensión (como una cola genérica o listener de eventos), deberías envolverla en un módulo Caddy. Esto permite a los usuarios configurar la ruta del script y el número de hilos a través de su `Caddyfile`. Esto requiere implementar la interfaz `caddy.Provisioner` y analizar el Caddyfile ([ver un ejemplo](https://github.com/dunglas/frankenphp-queue/blob/989120d394d66dd6c8e2101cac73dd622fade334/caddy.go)). -### En una Aplicación Go Pura (Embedding) +### En una aplicación Go pura (embedding) Si estás [embebiendo FrankenPHP en una aplicación Go estándar sin caddy](https://pkg.go.dev/github.com/dunglas/frankenphp#example-ServeHTTP), puedes registrar extension workers usando `frankenphp.WithExtensionWorkers` al inicializar las opciones. -## Interactuando con Workers +## Interactuando con workers Una vez que el pool de workers está activo, puedes enviar tareas a él. Esto se puede hacer dentro de [funciones nativas exportadas a PHP](https://frankenphp.dev/docs/extensions/#writing-the-extension), o desde cualquier lógica Go como un programador cron, un listener de eventos (MQTT, Kafka), o cualquier otra goroutine. -### Modo Sin Cabeza: `SendMessage` +### Modo sin cabeza: `SendMessage` Usa `SendMessage` para pasar datos sin procesar directamente a tu script worker. Esto es ideal para colas o comandos simples. -#### Ejemplo: Una Extensión de Cola Asíncrona +#### Ejemplo: una extensión de cola asíncrona ```go // #include @@ -109,7 +109,7 @@ func my_worker_http_request(path *C.zend_string) unsafe.Pointer { } ``` -## Script Worker +## Script worker El script worker PHP se ejecuta en un bucle y puede manejar tanto mensajes sin procesar como solicitudes HTTP. @@ -117,12 +117,12 @@ El script worker PHP se ejecuta en un bucle y puede manejar tanto mensajes sin p name` no funcionará) -- **Interfaz solo de métodos** - Todas las interacciones deben pasar a través de los métodos que defines -- **Mejor encapsulación** - La estructura de datos interna está completamente controlada por el código Go -- **Seguridad de tipos** - Sin riesgo de que el código PHP corrompa el estado interno con tipos incorrectos -- **API más limpia** - Obliga a diseñar una interfaz pública adecuada +- **Sin acceso directo a propiedades**: no puedes leer o escribir propiedades directamente desde PHP (`$user->name` no funcionará) +- **Interfaz solo de métodos**: todas las interacciones deben pasar a través de los métodos que defines +- **Mejor encapsulación**: la estructura de datos interna está completamente controlada por el código Go +- **Seguridad de tipos**: sin riesgo de que el código PHP corrompa el estado interno con tipos incorrectos +- **API más limpia**: obliga a diseñar una interfaz pública adecuada Este enfoque proporciona una mejor encapsulación y evita que el código PHP corrompa accidentalmente el estado interno de tus objetos Go. Todas las interacciones con el objeto deben pasar a través de los métodos que defines explícitamente. -#### Añadiendo Métodos a las Clases +#### Añadiendo métodos a las clases Dado que las propiedades no son directamente accesibles, **debes definir métodos** para interactuar con tus clases opacas. Usa la directiva `//export_php:method` para definir el comportamiento: @@ -318,7 +318,7 @@ func (us *UserStruct) SetNamePrefix(prefix *C.zend_string) { } ``` -#### Parámetros Nulos +#### Parámetros nulos El generador soporta parámetros nulos usando el prefijo `?` en las firmas de PHP. Cuando un parámetro es nulo, se convierte en un puntero en tu función Go, permitiéndote verificar si el valor era `null` en PHP: @@ -354,10 +354,10 @@ func (us *UserStruct) UpdateInfo(name *C.zend_string, age *int64, active *bool) **Puntos clave sobre parámetros nulos:** -- **Tipos primitivos nulos** (`?int`, `?float`, `?bool`) se convierten en punteros (`*int64`, `*float64`, `*bool`) en Go -- **Strings nulos** (`?string`) permanecen como `*C.zend_string` pero pueden ser `nil` +- **Tipos primitivos nulos** (`?int`, `?float`, `?bool`): se convierten en punteros (`*int64`, `*float64`, `*bool`) en Go +- **Strings nulos** (`?string`): permanecen como `*C.zend_string` pero pueden ser `nil` - **Verificar `nil`** antes de desreferenciar valores de puntero -- **`null` de PHP se convierte en `nil` de Go** - cuando PHP pasa `null`, tu función Go recibe un puntero `nil` +- **`null` de PHP se convierte en `nil` de Go**: cuando PHP pasa `null`, tu función Go recibe un puntero `nil` > [!CAUTION] > @@ -388,11 +388,11 @@ $user->updateInfo(null, 25, null); // Name y active son null Este diseño asegura que tu código Go tenga control completo sobre cómo se accede y modifica el estado del objeto, proporcionando una mejor encapsulación y seguridad de tipos. -### Declarando Constantes +### Declarando constantes El generador soporta exportar constantes Go a PHP usando dos directivas: `//export_php:const` para constantes globales y `//export_php:classconst` para constantes de clase. Esto te permite compartir valores de configuración, códigos de estado y otras constantes entre código Go y PHP. -#### Constantes Globales +#### Constantes globales Usa la directiva `//export_php:const` para crear constantes globales de PHP: @@ -412,7 +412,7 @@ const STATUS_OK = iota const STATUS_ERROR = iota ``` -#### Constantes de Clase +#### Constantes de clase Usa la directiva `//export_php:classconst ClassName` para crear constantes que pertenecen a una clase PHP específica: @@ -517,11 +517,11 @@ func (sp *StringProcessorStruct) Process(input *C.zend_string, mode int64) unsaf } ``` -### Usando Espacios de Nombres +### Usando espacios de nombres El generador soporta organizar las funciones, clases y constantes de tu extensión PHP bajo un espacio de nombres usando la directiva `//export_php:namespace`. Esto ayuda a evitar conflictos de nombres y proporciona una mejor organización para la API de tu extensión. -#### Declarando un Espacio de Nombres +#### Declarando un espacio de nombres Usa la directiva `//export_php:namespace` al inicio de tu archivo Go para colocar todos los símbolos exportados bajo un espacio de nombres específico: @@ -537,7 +537,7 @@ import ( //export_php:function hello(): string func hello() string { - return "Hola desde el espacio de nombres Mi\\Extensión!" + return "¡Hola desde el espacio de nombres Mi\\Extensión!" } //export_php:class User @@ -554,14 +554,14 @@ func (u *UserStruct) GetName() unsafe.Pointer { const STATUS_ACTIVE = 1 ``` -#### Usando la Extensión con Espacio de Nombres en PHP +#### Usando la extensión con espacio de nombres en PHP Cuando se declara un espacio de nombres, todas las funciones, clases y constantes se colocan bajo ese espacio de nombres en PHP: ```php getName(); // "John Doe" @@ -569,14 +569,14 @@ echo $user->getName(); // "John Doe" echo Mi\Extensión\STATUS_ACTIVE; // 1 ``` -#### Notas Importantes +#### Notas importantes - Solo se permite **una** directiva de espacio de nombres por archivo. Si se encuentran múltiples directivas de espacio de nombres, el generador devolverá un error. - El espacio de nombres se aplica a **todos** los símbolos exportados en el archivo: funciones, clases, métodos y constantes. - Los nombres de espacios de nombres siguen las convenciones de espacios de nombres de PHP usando barras invertidas (`\`) como separadores. - Si no se declara un espacio de nombres, los símbolos se exportan al espacio de nombres global como de costumbre. -### Generando la Extensión +### Generando la extensión Aquí es donde ocurre la magia, y tu extensión ahora puede ser generada. Puedes ejecutar el generador con el siguiente comando: @@ -589,7 +589,7 @@ GEN_STUB_SCRIPT=php-src/build/gen_stub.php frankenphp extension-init mi_extensi Si todo salió bien, se debería haber creado un nuevo directorio llamado `build`. Este directorio contiene los archivos generados para tu extensión, incluyendo el archivo `mi_extensión.go` con los stubs de funciones PHP generadas. -### Integrando la Extensión Generada en FrankenPHP +### Integrando la extensión generada en FrankenPHP Nuestra extensión ahora está lista para ser compilada e integrada en FrankenPHP. Para hacerlo, consulta la documentación de [compilación de FrankenPHP](compile.md) para aprender cómo compilar FrankenPHP. Agrega el módulo usando la bandera `--with`, apuntando a la ruta de tu módulo: @@ -605,7 +605,7 @@ xcaddy build \ Ten en cuenta que apuntas al subdirectorio `/build` que se creó durante el paso de generación. Sin embargo, esto no es obligatorio: también puedes copiar los archivos generados a tu directorio de módulo y apuntar a él directamente. -### Probando tu Extensión Generada +### Probando tu extensión generada Puedes crear un archivo PHP para probar las funciones y clases que has creado. Por ejemplo, crea un archivo `index.php` con el siguiente contenido: @@ -623,15 +623,15 @@ echo $processor->process('Hola Mundo', StringProcessor::MODE_UPPERCASE); // "HO Una vez que hayas integrado tu extensión en FrankenPHP como se demostró en la sección anterior, puedes ejecutar este archivo de prueba usando `./frankenphp php-server`, y deberías ver tu extensión funcionando. -## Implementación Manual +## Implementación manual Si quieres entender cómo funcionan las extensiones o necesitas un control total sobre tu extensión, puedes escribirlas manualmente. Este enfoque te da control completo pero requiere más código repetitivo. -### Función Básica +### Función básica Veremos cómo escribir una extensión PHP simple en Go que define una nueva función nativa. Esta función será llamada desde PHP y desencadenará una goroutine que registra un mensaje en los logs de Caddy. Esta función no toma ningún parámetro y no devuelve nada. -#### Definir la Función Go +#### Definir la función Go En tu módulo, necesitas definir una nueva función nativa que será llamada desde PHP. Para esto, crea un archivo con el nombre que desees, por ejemplo, `extension.go`, y agrega el siguiente código: @@ -663,7 +663,7 @@ La función `frankenphp.RegisterExtension()` simplifica el proceso de registro d En este ejemplo, nuestra nueva función desencadenará una goroutine que registra un mensaje en los logs de Caddy. -#### Definir la Función PHP +#### Definir la función PHP Para permitir que PHP llame a nuestra función, necesitamos definir una función PHP correspondiente. Para esto, crearemos un archivo stub, por ejemplo, `extension.stub.php`, que contendrá el siguiente código: @@ -685,7 +685,7 @@ php ../php-src/build/gen_stub.php extension.stub.php Este script generará un archivo llamado `extension_arginfo.h` que contiene la información necesaria para que PHP sepa cómo definir y llamar a nuestra función. -#### Escribir el Puente entre Go y C +#### Escribir el puente entre Go y C Ahora, necesitamos escribir el puente entre Go y C. Crea un archivo llamado `extension.h` en el directorio de tu módulo con el siguiente contenido: @@ -747,11 +747,11 @@ Finalmente, definimos los metadatos de la extensión en una estructura `zend_mod El registro de la extensión es manejado automáticamente por la función `RegisterExtension()` de FrankenPHP que llamamos en nuestro código Go. -### Uso Avanzado +### Uso avanzado Ahora que sabemos cómo crear una extensión PHP básica en Go, compliquemos nuestro ejemplo. Ahora crearemos una función PHP que tome una cadena como parámetro y devuelva su versión en mayúsculas. -#### Definir el Stub de la Función PHP +#### Definir el stub de la función PHP Para definir la nueva función PHP, modificaremos nuestro archivo `extension.stub.php` para incluir la nueva firma de la función: @@ -789,7 +789,7 @@ static const zend_function_entry ext_functions[] = { Podemos ver que la función `go_upper` está definida con un parámetro de tipo `string` y un tipo de retorno `string`. -#### Manipulación de Tipos entre Go y PHP/C +#### Manipulación de tipos entre Go y PHP/C Tu función Go no puede aceptar directamente una cadena PHP como parámetro. Necesitas convertirla a una cadena Go. Afortunadamente, FrankenPHP proporciona funciones helper para manejar la conversión entre cadenas PHP y cadenas Go, similar a lo que vimos en el enfoque del generador. @@ -826,7 +826,7 @@ Puedes aprender más sobre `ZEND_PARSE_PARAMETERS_START` y el análisis de pará Solo queda una cosa por hacer: implementar la función `go_upper` en Go. -#### Implementar la Función Go +#### Implementar la función Go Nuestra función Go tomará un `*C.zend_string` como parámetro, lo convertirá a una cadena Go usando la función helper de FrankenPHP, lo procesará y devolverá el resultado como un nuevo `*C.zend_string`. Las funciones helper manejan toda la complejidad de gestión de memoria y conversión por nosotros. @@ -860,7 +860,7 @@ El parámetro `false` en `PHPString()` indica que queremos crear una nueva caden > > En este ejemplo, no realizamos ningún manejo de errores, pero siempre debes verificar que los punteros no sean `nil` y que los datos sean válidos antes de usarlos en tus funciones Go. -### Integrando la Extensión en FrankenPHP +### Integrando la extensión en FrankenPHP Nuestra extensión ahora está lista para ser compilada e integrada en FrankenPHP. Para hacerlo, consulta la documentación de [compilación de FrankenPHP](compile.md) para aprender cómo compilar FrankenPHP. Agrega el módulo usando la bandera `--with`, apuntando a la ruta de tu módulo: @@ -876,7 +876,7 @@ xcaddy build \ ¡Eso es todo! Tu extensión ahora está integrada en FrankenPHP y puede ser usada en tu código PHP. -### Probando tu Extensión +### Probando tu extensión Después de integrar tu extensión en FrankenPHP, puedes crear un archivo `index.php` con ejemplos para las funciones que has implementado: diff --git a/docs/es/github-actions.md b/docs/es/github-actions.md index ec6fcf6734..a1d0319cc1 100644 --- a/docs/es/github-actions.md +++ b/docs/es/github-actions.md @@ -12,13 +12,13 @@ En la configuración del repositorio, bajo secrets, agrega los siguientes secret - `REGISTRY_PASSWORD`: La contraseña para iniciar sesión en el registro (ej. una clave de acceso). - `IMAGE_NAME`: El nombre de la imagen (ej. `dunglas/frankenphp`). -## Construyendo y Subiendo la Imagen +## Construyendo y subiendo la imagen 1. Crea un Pull Request o haz push a tu fork. 2. GitHub Actions construirá la imagen y ejecutará cualquier prueba. 3. Si la construcción es exitosa, la imagen será subida al registro usando la etiqueta `pr-x`, donde `x` es el número del PR. -## Desplegando la Imagen +## Desplegando la imagen 1. Una vez que el Pull Request sea fusionado, GitHub Actions ejecutará nuevamente las pruebas y construirá una nueva imagen. 2. Si la construcción es exitosa, la etiqueta `main` será actualizada en el registro Docker. diff --git a/docs/es/hot-reload.md b/docs/es/hot-reload.md index 67a7472a3f..843f1aaef4 100644 --- a/docs/es/hot-reload.md +++ b/docs/es/hot-reload.md @@ -8,7 +8,7 @@ Esta función proporciona un flujo de trabajo similar a **Hot Module Replacement En lugar de actualizar manualmente el navegador después de cada cambio de archivo (código PHP, plantillas, archivos JavaScript y CSS...), FrankenPHP actualiza el contenido en tiempo real. -La Hot Reload funciona de forma nativa con WordPress, Laravel, Symfony y cualquier otra aplicación o framework PHP. +El hot reload funciona de forma nativa con WordPress, Laravel, Symfony y cualquier otra aplicación o framework PHP. Cuando está activada, FrankenPHP vigila el directorio de trabajo actual en busca de cambios en el sistema de archivos. Cuando se modifica un archivo, envía una actualización [Mercure](mercure.md) al navegador. @@ -20,7 +20,7 @@ Dependiendo de la configuración, el navegador: ## Configuración -Para habilitar la Hot Reload, active Mercure y luego agregue la subdirectiva `hot_reload` a la directiva `php_server` en su `Caddyfile`. +Para habilitar el hot reload, active Mercure y luego agregue la subdirectiva `hot_reload` a la directiva `php_server` en su `Caddyfile`. > [!WARNING] > Esta función está destinada **únicamente a entornos de desarrollo**. @@ -77,12 +77,12 @@ php_server { } ``` -## Integración Lado-Cliente +## Integración del lado del cliente Mientras el servidor detecta los cambios, el navegador necesita suscribirse a estos eventos para actualizar la página. FrankenPHP expone la URL del Mercure Hub a utilizar para suscribirse a los cambios de archivos a través de la variable de entorno `$_SERVER['FRANKENPHP_HOT_RELOAD']`. -Una biblioteca JavaScript de conveniencia, [frankenphp-hot-reload](https://www.npmjs.com/package/frankenphp-hot-reload), también está disponible para manejar la lógica lado-cliente. +Una biblioteca JavaScript de conveniencia, [frankenphp-hot-reload](https://www.npmjs.com/package/frankenphp-hot-reload), también está disponible para manejar la lógica del lado del cliente. Para usarla, agregue lo siguiente a su diseño principal: ```php @@ -98,11 +98,11 @@ Para usarla, agregue lo siguiente a su diseño principal: La biblioteca se suscribirá automáticamente al hub de Mercure, obtendrá la URL actual en segundo plano cuando se detecte un cambio en un archivo y transformará el DOM. Está disponible como un paquete [npm](https://www.npmjs.com/package/frankenphp-hot-reload) y en [GitHub](https://github.com/dunglas/frankenphp-hot-reload). -Alternativamente, puede implementar su propia lógica lado-cliente suscribiéndose directamente al hub de Mercure usando la clase nativa de JavaScript `EventSource`. +Alternativamente, puede implementar su propia lógica del lado del cliente suscribiéndose directamente al hub de Mercure usando la clase nativa de JavaScript `EventSource`. -### Modo Worker +### Modo worker -Si está ejecutando su aplicación en [Modo Worker](https://frankenphp.dev/docs/worker/), el script de su aplicación permanece en memoria. +Si está ejecutando su aplicación en [modo worker](https://frankenphp.dev/docs/worker/), el script de su aplicación permanece en memoria. Esto significa que los cambios en su código PHP no se reflejarán inmediatamente, incluso si el navegador se recarga. Para la mejor experiencia de desarrollador, debe combinar `hot_reload` con [la subdirectiva `watch` en la directiva `worker`](config.md#watching-for-file-changes). @@ -130,7 +130,7 @@ php_server { ### Funcionamiento 1. **Vigilancia**: FrankenPHP monitorea el sistema de archivos en busca de modificaciones usando [la biblioteca `e-dant/watcher`](https://github.com/e-dant/watcher) internamente (contribuimos con el binding de Go). -2. **Reinicio (Modo Worker)**: si `watch` está habilitado en la configuración del worker, el worker de PHP se reinicia para cargar el nuevo código. +2. **Reinicio (modo worker)**: si `watch` está habilitado en la configuración del worker, el worker de PHP se reinicia para cargar el nuevo código. 3. **Envío**: se envía una carga útil JSON que contiene la lista de archivos modificados al [hub de Mercure](https://mercure.rocks) integrado. 4. **Recepción**: El navegador, escuchando a través de la biblioteca JavaScript, recibe el evento de Mercure. 5. **Actualización**: diff --git a/docs/es/known-issues.md b/docs/es/known-issues.md index 280f190f57..cf1eb8766b 100644 --- a/docs/es/known-issues.md +++ b/docs/es/known-issues.md @@ -1,6 +1,6 @@ -# Problemas Conocidos +# Problemas conocidos -## Extensiones PHP no Soportadas +## Extensiones PHP no soportadas Las siguientes extensiones se sabe que no son compatibles con FrankenPHP: @@ -9,7 +9,7 @@ Las siguientes extensiones se sabe que no son compatibles con FrankenPHP: | [imap](https://www.php.net/manual/imap.installation.php) | No es thread-safe | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | | [newrelic](https://docs.newrelic.com/docs/apm/agents/php-agent/getting-started/introduction-new-relic-php/) | No es thread-safe | - | -## Extensiones PHP con Errores +## Extensiones PHP con errores Las siguientes extensiones tienen errores conocidos y comportamientos inesperados cuando se usan con FrankenPHP: @@ -21,7 +21,7 @@ Las siguientes extensiones tienen errores conocidos y comportamientos inesperado La función [get_browser()](https://www.php.net/manual/function.get-browser.php) parece funcionar mal después de un tiempo. Una solución es almacenar en caché (por ejemplo, con [APCu](https://www.php.net/manual/book.apcu.php)) los resultados por User Agent, ya que son estáticos. -## Binario Autónomo e Imágenes Docker Basadas en Alpine +## Binario autónomo e imágenes Docker basadas en Alpine Los binarios completamente estáticos y las imágenes Docker basadas en Alpine (`dunglas/frankenphp:*-alpine`) usan [musl libc](https://musl.libc.org/) en lugar de [glibc](https://www.etalabs.net/compare_libcs.html), para mantener un tamaño de binario más pequeño. Esto puede llevar a algunos problemas de compatibilidad. @@ -80,7 +80,7 @@ docker run \ dunglas/frankenphp ``` -## Scripts de Composer que Referencian `@php` +## Scripts de Composer que referencian `@php` Los [scripts de Composer](https://getcomposer.org/doc/articles/scripts.md) pueden querer ejecutar un binario PHP para algunas tareas, por ejemplo, en [un proyecto Laravel](laravel.md) para ejecutar `@php artisan package:discover --ansi`. Esto [actualmente falla](https://github.com/php/frankenphp/issues/483#issuecomment-1899890915) por dos razones: @@ -112,7 +112,7 @@ export PHP_BINARY=/usr/local/bin/php composer install ``` -## Solución de Problemas de TLS/SSL con Binarios Estáticos +## Solución de problemas de TLS/SSL con binarios estáticos Al usar los binarios estáticos, puedes encontrar los siguientes errores relacionados con TLS, por ejemplo, al enviar correos electrónicos usando STARTTLS: diff --git a/docs/es/laravel.md b/docs/es/laravel.md index 3dc4e1fa8f..d011d0065d 100644 --- a/docs/es/laravel.md +++ b/docs/es/laravel.md @@ -12,7 +12,7 @@ docker run -p 80:80 -p 443:443 -p 443:443/udp -v $PWD:/app dunglas/frankenphp ¡Y listo! -## Instalación Local +## Instalación local Alternativamente, puedes ejecutar tus proyectos Laravel con FrankenPHP desde tu máquina local: @@ -80,7 +80,7 @@ Consulta también [cómo usar Mercure con Octane](#soporte-para-mercure). Aprende más sobre [Laravel Octane en su documentación oficial](https://laravel.com/docs/octane). -## Aplicaciones Laravel como Binarios Autónomos +## Aplicaciones Laravel como binarios autónomos Usando [la característica de incrustación de aplicaciones de FrankenPHP](embed.md), es posible distribuir aplicaciones Laravel como binarios autónomos. @@ -161,7 +161,7 @@ Sigue estos pasos para empaquetar tu aplicación Laravel como un binario autóno Aprende más sobre las opciones disponibles y cómo compilar binarios para otros sistemas operativos en la documentación de [incrustación de aplicaciones](embed.md). -### Cambiar la Ruta de Almacenamiento +### Cambiar la ruta de almacenamiento Por defecto, Laravel almacena los archivos subidos, cachés, registros, etc. en el directorio `storage/` de la aplicación. Esto no es adecuado para aplicaciones incrustadas, ya que cada nueva versión se extraerá en un directorio temporal diferente. @@ -196,7 +196,7 @@ Puedes usar [todas las directivas soportadas por Mercure](https://mercure.rocks/ Para publicar y suscribirte a actualizaciones, recomendamos usar la biblioteca [Laravel Mercure Broadcaster](https://github.com/mvanduijker/laravel-mercure-broadcaster). Alternativamente, consulta [la documentación de Mercure](mercure.md) para hacerlo en PHP y JavaScript puros. -### Ejecutar Octane con Binarios Autónomos +### Ejecutar Octane con binarios autónomos ¡Incluso es posible empaquetar aplicaciones Laravel Octane como binarios autónomos! diff --git a/docs/es/logging.md b/docs/es/logging.md index c4302dbbd9..f56b5e0717 100644 --- a/docs/es/logging.md +++ b/docs/es/logging.md @@ -18,9 +18,9 @@ function frankenphp_log(string $message, int $level = FRANKENPHP_LOG_LEVEL_INFO, ### Parámetros -- **`message`**: El string del mensaje de registro. -- **`level`**: El nivel de gravedad del registro. Puede ser cualquier entero arbitrario. Se proporcionan constantes de conveniencia para niveles comunes: `FRANKENPHP_LOG_LEVEL_DEBUG` (`-4`), `FRANKENPHP_LOG_LEVEL_INFO` (`0`), `FRANKENPHP_LOG_LEVEL_WARN` (`4`) y `FRANKENPHP_LOG_LEVEL_ERROR` (`8`)). Por omisión es `FRANKENPHP_LOG_LEVEL_INFO`. -- **`context`**: Un array asociativo de datos adicionales para incluir en la entrada del registro. +- **`message`**: el string del mensaje de registro. +- **`level`**: el nivel de gravedad del registro. Puede ser cualquier entero arbitrario. Se proporcionan constantes de conveniencia para niveles comunes: `FRANKENPHP_LOG_LEVEL_DEBUG` (`-4`), `FRANKENPHP_LOG_LEVEL_INFO` (`0`), `FRANKENPHP_LOG_LEVEL_WARN` (`4`) y `FRANKENPHP_LOG_LEVEL_ERROR` (`8`). Por omisión es `FRANKENPHP_LOG_LEVEL_INFO`. +- **`context`**: un array asociativo de datos adicionales para incluir en la entrada del registro. ### Ejemplo diff --git a/docs/es/mercure.md b/docs/es/mercure.md index dafac40790..11b8c66805 100644 --- a/docs/es/mercure.md +++ b/docs/es/mercure.md @@ -1,4 +1,4 @@ -# Tiempo Real +# Tiempo real ¡FrankenPHP incluye un hub [Mercure](https://mercure.rocks) integrado! Mercure te permite enviar eventos en tiempo real a todos los dispositivos conectados: recibirán un evento JavaScript al instante. @@ -37,7 +37,7 @@ php_server > > Descomenta la sección Mercure en `/etc/frankenphp/Caddyfile` para habilitarla. -## Suscribiéndose a Actualizaciones +## Suscribiéndose a actualizaciones Por defecto, el hub Mercure está disponible en la ruta `/.well-known/mercure` de tu servidor FrankenPHP. Para suscribirte a actualizaciones, usa la clase nativa [`EventSource`](https://developer.mozilla.org/es/docs/Web/API/EventSource) de JavaScript: @@ -45,7 +45,7 @@ Para suscribirte a actualizaciones, usa la clase nativa [`EventSource`](https:// ```html -Ejemplo Mercure +Ejemplo de Mercure ``` -## Publicando Actualizaciones +## Publicando actualizaciones ### Usando `mercure_publish()` @@ -112,7 +112,7 @@ pero para aplicaciones en producción, se recomienda usar tokens de corta duraci ### Usando Symfony Mercure -Alternativamente, puedes usar el [Componente Symfony Mercure](https://symfony.com/components/Mercure), una biblioteca PHP independiente. +Alternativamente, puedes usar el [componente Symfony Mercure](https://symfony.com/components/Mercure), una biblioteca PHP independiente. Esta biblioteca maneja la generación de JWT, la publicación de actualizaciones así como la autorización basada en cookies para los suscriptores. diff --git a/docs/es/performance.md b/docs/es/performance.md index 8431ab24e3..a9e81c3f49 100644 --- a/docs/es/performance.md +++ b/docs/es/performance.md @@ -3,7 +3,7 @@ Por defecto, FrankenPHP intenta ofrecer un buen compromiso entre rendimiento y facilidad de uso. Sin embargo, es posible mejorar sustancialmente el rendimiento usando una configuración adecuada. -## Número de Hilos y Workers +## Número de hilos y workers Por defecto, FrankenPHP inicia 2 veces más hilos y workers (en modo worker) que el número de CPUs disponibles. @@ -19,19 +19,19 @@ Para cambiar el número de workers, usa la opción `num` de la sección `worker` ### `max_threads` Aunque siempre es mejor saber exactamente cómo será tu tráfico, las aplicaciones reales tienden a ser más impredecibles. -La configuración `max_threads` [configuración](config.md#caddyfile-config) permite a FrankenPHP generar automáticamente hilos adicionales en tiempo de ejecución hasta el límite especificado. +La [configuración `max_threads`](config.md#caddyfile-config) permite a FrankenPHP generar automáticamente hilos adicionales en tiempo de ejecución hasta el límite especificado. `max_threads` puede ayudarte a determinar cuántos hilos necesitas para manejar tu tráfico y puede hacer que el servidor sea más resiliente a picos de latencia. Si se establece en `auto`, el límite se estimará en función del `memory_limit` en tu `php.ini`. Si no puede hacerlo, `auto` se establecerá por defecto en 2x `num_threads`. Ten en cuenta que `auto` puede subestimar fuertemente el número de hilos necesarios. `max_threads` es similar a [pm.max_children](https://www.php.net/manual/install.fpm.configuration.php#pm.max-children) de PHP FPM. La principal diferencia es que FrankenPHP usa hilos en lugar de procesos y los delega automáticamente entre diferentes scripts de worker y el 'modo clásico' según sea necesario. -## Modo Worker +## Modo worker Habilitar [el modo worker](worker.md) mejora drásticamente el rendimiento, pero tu aplicación debe adaptarse para ser compatible con este modo: debes crear un script de worker y asegurarte de que la aplicación no tenga fugas de memoria. -## No Usar musl +## No usar musl La variante Alpine Linux de las imágenes Docker oficiales y los binarios predeterminados que proporcionamos usan [la libc musl](https://musl.libc.org). @@ -44,7 +44,7 @@ En entornos de producción, recomendamos usar FrankenPHP vinculado a glibc, comp Esto se puede lograr usando las imágenes Docker de Debian, usando los paquetes de nuestros mantenedores [.deb](https://debs.henderkes.com) o [.rpm](https://rpms.henderkes.com), o [compilando FrankenPHP desde las fuentes](compile.md). -## Configuración del Runtime de Go +## Configuración del runtime de Go FrankenPHP está escrito en Go. @@ -110,7 +110,7 @@ route { } ``` -## Marcadores de Posición (Placeholders) +## Marcadores de posición (placeholders) Puedes usar [marcadores de posición](https://caddyserver.com/docs/conventions#placeholders) en las directivas `root` y `env`. Sin embargo, esto evita el almacenamiento en caché de estos valores y conlleva un costo significativo de rendimiento. @@ -131,7 +131,7 @@ php_server { Esto mejorará el rendimiento si la directiva `root` contiene [marcadores de posición](https://caddyserver.com/docs/conventions#placeholders). La ganancia será negligible en otros casos. -## Registros (Logs) +## Registros (logs) El registro es obviamente muy útil, pero, por definición, requiere operaciones de E/S y asignaciones de memoria, lo que reduce considerablemente el rendimiento. @@ -153,7 +153,7 @@ En particular: Para más detalles, lee [la entrada de documentación dedicada de Symfony](https://symfony.com/doc/current/performance.html) (la mayoría de los consejos son útiles incluso si no usas Symfony). -## Dividiendo el Pool de Hilos +## Dividiendo el pool de hilos Es común que las aplicaciones interactúen con servicios externos lentos, como una API que tiende a ser poco confiable bajo alta carga o que consistentemente tarda 10+ segundos en responder. diff --git a/docs/es/production.md b/docs/es/production.md index 4644031997..7e465c3d12 100644 --- a/docs/es/production.md +++ b/docs/es/production.md @@ -1,4 +1,4 @@ -# Despliegue en Producción +# Despliegue en producción En este tutorial, aprenderemos cómo desplegar una aplicación PHP en un único servidor usando Docker Compose. @@ -6,7 +6,7 @@ Si estás usando Symfony, consulta la documentación "[Despliegue en producción Si estás usando API Platform (que también usa FrankenPHP), consulta [la documentación de despliegue del framework](https://api-platform.com/docs/deployment/). -## Preparando tu Aplicación +## Preparando tu aplicación Primero, crea un archivo `Dockerfile` en el directorio raíz de tu proyecto PHP: @@ -30,7 +30,7 @@ COPY . /app/public #COPY . /app ``` -Consulta "[Construyendo una Imagen Docker Personalizada](docker.md)" para más detalles y opciones, +Consulta "[Construyendo una imagen Docker personalizada](docker.md)" para más detalles y opciones, y para aprender cómo personalizar la configuración, instalar extensiones PHP y módulos de Caddy. Si tu proyecto usa Composer, @@ -68,7 +68,7 @@ volumes: Finalmente, si usas Git, haz commit de estos archivos y haz push. -## Preparando un Servidor +## Preparando un servidor Para desplegar tu aplicación en producción, necesitas un servidor. En este tutorial, usaremos una máquina virtual proporcionada por DigitalOcean, pero cualquier servidor Linux puede funcionar. @@ -93,7 +93,7 @@ Cuando tu Droplet esté listo, usa SSH para conectarte: ssh root@ ``` -## Configurando un Nombre de Dominio +## Configurando un nombre de dominio En la mayoría de los casos, querrás asociar un nombre de dominio a tu sitio. Si aún no tienes un nombre de dominio, deberás comprar uno a través de un registrador. @@ -137,7 +137,7 @@ Ve a `https://tu-dominio.ejemplo.com` y ¡disfruta! > > Docker puede tener una capa de caché, asegúrate de tener la compilación correcta para cada despliegue o vuelve a compilar tu proyecto con la opción `--no-cache` para evitar problemas de caché. -## Despliegue en Múltiples Nodos +## Despliegue en múltiples nodos Si deseas desplegar tu aplicación en un clúster de máquinas, puedes usar [Docker Swarm](https://docs.docker.com/engine/swarm/stack-deploy/), que es compatible con los archivos Compose proporcionados. diff --git a/docs/es/static.md b/docs/es/static.md index d23e9d7ad7..7297acb663 100644 --- a/docs/es/static.md +++ b/docs/es/static.md @@ -1,4 +1,4 @@ -# Crear una Compilación Estática +# Crear una compilación estática En lugar de usar una instalación local de la biblioteca PHP, es posible crear una compilación estática o mayormente estática de FrankenPHP gracias al excelente [proyecto static-php-cli](https://github.com/crazywhalecc/static-php-cli) (a pesar de su nombre, este proyecto soporta todas las SAPI, no solo CLI). @@ -18,7 +18,7 @@ FrankenPHP también soporta [incrustar la aplicación PHP en el binario estátic Proporcionamos imágenes Docker para compilar binarios Linux estáticos: -### Compilación Completamente Estática Basada en musl +### Compilación completamente estática basada en musl Para un binario completamente estático que se ejecuta en cualquier distribución Linux sin dependencias pero que no soporta carga dinámica de extensiones: @@ -33,7 +33,7 @@ Para un mejor rendimiento en escenarios altamente concurrentes, considera usar e docker buildx bake --load --set static-builder-musl.args.MIMALLOC=1 static-builder-musl ``` -### Compilación Mayormente Estática Basada en glibc (Con Soporte para Extensiones Dinámicas) +### Compilación mayormente estática basada en glibc (con soporte para extensiones dinámicas) Para un binario que soporta la carga dinámica de extensiones PHP mientras tiene las extensiones seleccionadas compiladas estáticamente: @@ -48,7 +48,7 @@ El binario resultante (mayormente estático excepto por `glibc`) se llama `frank Si deseas compilar el binario estático sin Docker, consulta las instrucciones para macOS, que también funcionan para Linux. -### Extensiones Personalizadas +### Extensiones personalizadas Por omisión, se compilan las extensiones PHP más populares. @@ -71,7 +71,7 @@ docker buildx bake \ static-builder-musl ``` -### Módulos Adicionales de Caddy +### Módulos adicionales de Caddy Para agregar módulos adicionales de Caddy o pasar otros argumentos a [xcaddy](https://github.com/caddyserver/xcaddy), usa el ARG de Docker `XCADDY_ARGS`: @@ -93,7 +93,7 @@ Consulta también cómo [personalizar la compilación](#personalizando-la-compil ### Token de GitHub -Si alcanzas el límite de tasa de la API de GitHub, establece un Token de Acceso Personal de GitHub en una variable de entorno llamada `GITHUB_TOKEN`: +Si alcanzas el límite de tasa de la API de GitHub, establece un token de acceso personal de GitHub en una variable de entorno llamada `GITHUB_TOKEN`: ```console GITHUB_TOKEN="xxx" docker --load buildx bake static-builder-musl @@ -112,7 +112,7 @@ cd frankenphp Nota: este script también funciona en Linux (y probablemente en otros Unix) y es usado internamente por las imágenes Docker que proporcionamos. -## Personalizando la Compilación +## Personalizando la compilación Las siguientes variables de entorno pueden pasarse a `docker build` y al script `build-static.sh` para personalizar la compilación estática: diff --git a/docs/es/wordpress.md b/docs/es/wordpress.md index 27e678ae69..2a87a68b83 100644 --- a/docs/es/wordpress.md +++ b/docs/es/wordpress.md @@ -2,7 +2,7 @@ Ejecute [WordPress](https://wordpress.org/) con FrankenPHP para disfrutar de una pila moderna y de alto rendimiento con HTTPS automático, HTTP/3 y compresión Zstandard. -## Instalación Mínima +## Instalación mínima 1. [Descargue WordPress](https://wordpress.org/download/) 2. Extraiga el archivo ZIP y abra una terminal en el directorio extraído @@ -25,9 +25,9 @@ encode zstd br gzip log ``` -## Hot Reload +## Hot reload -Para usar la función de [Hot reload](hot-reload.md) con WordPress, active [Mercure](mercure.md) y agregue la subdirectiva `hot_reload` a la directiva `php_server` en su `Caddyfile`: +Para usar la función de [hot reload](hot-reload.md) con WordPress, active [Mercure](mercure.md) y agregue la subdirectiva `hot_reload` a la directiva `php_server` en su `Caddyfile`: ```caddyfile localhost diff --git a/docs/es/worker.md b/docs/es/worker.md index 411a1c1627..e199f91b74 100644 --- a/docs/es/worker.md +++ b/docs/es/worker.md @@ -1,9 +1,9 @@ -# Usando los Workers de FrankenPHP +# Usando los workers de FrankenPHP Inicia tu aplicación una vez y manténla en memoria. FrankenPHP gestionará las peticiones entrantes en unos pocos milisegundos. -## Iniciando Scripts de Worker +## Iniciando scripts de worker ### Docker @@ -17,7 +17,7 @@ docker run \ dunglas/frankenphp ``` -### Binario Autónomo +### Binario autónomo Usa la opción `--worker` del comando `php-server` para servir el contenido del directorio actual usando un worker: @@ -42,14 +42,14 @@ Esta función se utiliza frecuentemente en combinación con [hot reloading](hot- > [!TIP] > La siguiente sección es necesaria solo para versiones anteriores a Symfony 7.4, donde se introdujo soporte nativo para el modo worker de FrankenPHP. -El modo worker de FrankenPHP es soportado por el [Componente Runtime de Symfony](https://symfony.com/doc/current/components/runtime.html). +El modo worker de FrankenPHP es soportado por el [componente Runtime de Symfony](https://symfony.com/doc/current/components/runtime.html). Para iniciar cualquier aplicación Symfony en un worker, instala el paquete FrankenPHP de [PHP Runtime](https://github.com/php-runtime/runtime): ```console composer require runtime/frankenphp-symfony ``` -Inicia tu servidor de aplicación definiendo la variable de entorno `APP_RUNTIME` para usar el Runtime de FrankenPHP Symfony: +Inicia tu servidor de aplicación definiendo la variable de entorno `APP_RUNTIME` para usar el runtime de FrankenPHP Symfony: ```console docker run \ @@ -64,7 +64,7 @@ docker run \ Consulta [la documentación dedicada](laravel.md#laravel-octane). -## Aplicaciones Personalizadas +## Aplicaciones personalizadas El siguiente ejemplo muestra cómo crear tu propio script de worker sin depender de una biblioteca de terceros: @@ -132,14 +132,14 @@ docker run \ dunglas/frankenphp ``` -### Reiniciar el Worker Después de un Número Determinado de Peticiones +### Reiniciar el worker después de un número determinado de peticiones Como PHP no fue diseñado originalmente para procesos de larga duración, aún hay muchas bibliotecas y códigos heredados que generan fugas de memoria. Una solución para usar este tipo de código en modo worker es reiniciar el script de worker después de procesar un cierto número de peticiones: El fragmento de worker anterior permite configurar un número máximo de peticiones a manejar estableciendo una variable de entorno llamada `MAX_REQUESTS`. -### Reiniciar Workers Manualmente +### Reiniciar workers manualmente Aunque es posible reiniciar workers [al detectar cambios en archivos](config.md#watching-for-file-changes), también es posible reiniciar todos los workers de manera controlada a través de la [API de administración de Caddy](https://caddyserver.com/docs/api). Si el admin está habilitado en tu @@ -149,7 +149,7 @@ de manera controlada a través de la [API de administración de Caddy](https://c curl -X POST http://localhost:2019/frankenphp/workers/restart ``` -### Fallos en Workers +### Fallos en workers Si un script de worker falla con un código de salida distinto de cero, FrankenPHP lo reiniciará con una estrategia de retroceso exponencial. Si el script de worker permanece activo más tiempo que el último retroceso × 2, @@ -168,7 +168,7 @@ frankenphp { } ``` -## Comportamiento de las Superglobales +## Comportamiento de las superglobales Las [superglobales de PHP](https://www.php.net/manual/language.variables.superglobals.php) (`$_SERVER`, `$_ENV`, `$_GET`...) se comportan de la siguiente manera: diff --git a/docs/extensions.md b/docs/extensions.md index c26f44aa6e..74244a2a18 100644 --- a/docs/extensions.md +++ b/docs/extensions.md @@ -86,7 +86,7 @@ There are two important things to note here: - A directive comment `//export_php:function` defines the function signature in PHP. This is how the generator knows how to generate the PHP function with the right parameters and return type. - The function must return an `unsafe.Pointer`. FrankenPHP provides an API to help you with type juggling between C and Go. -While the first point speaks for itself, the second may be harder to apprehend. Let's take a deeper dive into type juggling later in this guide. +While the first point speaks for itself, the second may be harder to grasp. We take a deeper dive into type juggling later in this guide. ### Generating the extension @@ -148,7 +148,7 @@ Once you've integrated your extension into FrankenPHP as demonstrated in the pre ### Type juggling -While some variable types have the same memory representation between C/PHP and Go, some types require more logic to be directly used. This is maybe the hardest part when it comes to writing extensions because it requires understanding the internals of the Zend Engine and how variables are stored internally in PHP. +While some variable types have the same memory representation between C/PHP and Go, some types require more logic to be directly used. This is probably the hardest part when it comes to writing extensions because it requires understanding the internals of the Zend Engine and how variables are stored internally in PHP. This table summarizes what you need to know: | PHP type | Go type | Direct conversion | C to Go helper | Go to C helper | Class Methods Support | @@ -179,7 +179,7 @@ If you refer to the code snippet of the previous section, you can see that helpe FrankenPHP provides native support for PHP arrays through `frankenphp.AssociativeArray` or direct conversion to a map or slice. -`AssociativeArray` represents a [hash map](https://en.wikipedia.org/wiki/Hash_table) composed of a `Map: map[string]any`field and an optional `Order: []string` field (unlike PHP "associative arrays", Go maps aren't ordered). +`AssociativeArray` represents a [hash map](https://en.wikipedia.org/wiki/Hash_table) composed of a `Map: map[string]any` field and an optional `Order: []string` field (unlike PHP "associative arrays", Go maps aren't ordered). If order or association are not needed, it's also possible to directly convert to a slice `[]any` or unordered map `map[string]any`. @@ -283,7 +283,7 @@ func process_data_packed(arr *C.zend_array) unsafe.Pointer { FrankenPHP provides a way to work with PHP callables using the `frankenphp.CallPHPCallable` helper. This allows you to call PHP functions or methods from Go code. -To showcase this, let's create our own `array_map()` function that takes a callable and an array, applies the callable to each element of the array, and returns a new array with the results: +To showcase this, we'll create our own `array_map()` function that takes a callable and an array, applies the callable to each element of the array, and returns a new array with the results: ```go // Calling a PHP callable from a Go-defined extension function @@ -532,7 +532,7 @@ echo Order::STATE_PENDING; // 0 The directive supports various value types, including strings, integers, booleans, floats, and iota constants. When using `iota`, the generator automatically assigns sequential values (0, 1, 2, etc.). Global constants become available in your PHP code as global constants, while class constants are scoped to their respective classes using the public visibility. When using integers, different possible notations (binary, hex, octal) are supported and dumped as is in the PHP stub file. -You can use constants just like you are used to in the Go code. For example, let's take the `repeat_this()` function we declared earlier and change the last argument to an integer: +You can use constants just like you are used to in the Go code. For example, we'll take the `repeat_this()` function we declared earlier and change the last argument to an integer: ```go // Combining functions, classes, methods, and constants in one extension @@ -741,7 +741,7 @@ Next, create a file named `extension.c` that will perform the following steps: - Declare our new native PHP function `go_print()`; - Declare the extension metadata. -Let's start by including the required headers: +We start by including the required headers: ```c // extension.c @@ -785,7 +785,7 @@ The extension registration is automatically handled by FrankenPHP's `RegisterExt ### Advanced usage -Now that we know how to create a basic PHP extension in Go, let's complexify our example. We will now create a PHP function that takes a string as a parameter and returns its uppercase version. +Now that we know how to create a basic PHP extension in Go, we will make our example more complex. We will now create a PHP function that takes a string as a parameter and returns its uppercase version. #### Define the PHP function stub diff --git a/docs/fr/CONTRIBUTING.md b/docs/fr/CONTRIBUTING.md index eeacb7bb15..301edfe35a 100644 --- a/docs/fr/CONTRIBUTING.md +++ b/docs/fr/CONTRIBUTING.md @@ -13,9 +13,9 @@ docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -p 8080:8080 - L'image contient les outils de développement habituels (Go, GDB, Valgrind, Neovim...) et utilise les emplacements de configuration PHP suivants -- php.ini: `/etc/frankenphp/php.ini` Un fichier php.ini avec des préréglages de développement est fourni par défaut. -- fichiers de configuration supplémentaires: `/etc/frankenphp/php.d/*.ini` -- extensions php: `/usr/lib/frankenphp/modules/` +- php.ini : `/etc/frankenphp/php.ini` Un fichier php.ini avec des préréglages de développement est fourni par défaut. +- fichiers de configuration supplémentaires : `/etc/frankenphp/php.d/*.ini` +- extensions php : `/usr/lib/frankenphp/modules/` Si votre version de Docker est inférieure à 23.0, la construction échouera à cause d'un [problème de pattern](https://github.com/moby/moby/pull/42676) dans `.dockerignore`. Ajoutez les répertoires à `.dockerignore`. @@ -53,7 +53,7 @@ cd testdata/ ../caddy/frankenphp/frankenphp run ``` -Le serveur est configuré pour écouter à l'adresse `127.0.0.1:80`: +Le serveur est configuré pour écouter à l'adresse `127.0.0.1:80` : > [!NOTE] > @@ -73,14 +73,14 @@ go build cd ../../ ``` -Lancer le test serveur : +Lancer le serveur de test : ```console cd testdata/ ../internal/testserver/testserver ``` -Le serveur est configuré pour écouter à l'adresse `127.0.0.1:8080`: +Le serveur est configuré pour écouter à l'adresse `127.0.0.1:8080` : ```console curl -v http://127.0.0.1:8080/phpinfo.php @@ -182,7 +182,7 @@ docker buildx bake -f docker-bake.hcl --pull --no-cache --push 9. Quand le bug est corrigé, annulez tous les changements. -## Ressources Diverses pour le Développement +## Ressources diverses pour le développement - [Intégration de PHP dans uWSGI](https://github.com/unbit/uwsgi/blob/master/plugins/php/php_plugin.c) - [Intégration de PHP dans NGINX Unit](https://github.com/nginx/unit/blob/master/src/nxt_php_sapi.c) @@ -194,7 +194,7 @@ docker buildx bake -f docker-bake.hcl --pull --no-cache --push - [Intégration de PHP sur Mac](https://gist.github.com/jonnywang/61427ffc0e8dde74fff40f479d147db4) - [Bindings SDL](https://pkg.go.dev/github.com/veandco/go-sdl2@v0.4.21/sdl#Main) -## Ressources Liées à Docker +## Ressources liées à Docker - [Définition du fichier Bake](https://docs.docker.com/build/customize/bake/file-definition/) - [`docker buildx build`](https://docs.docker.com/engine/reference/commandline/buildx_build/) diff --git a/docs/fr/README.md b/docs/fr/README.md index 761c9dac9b..de801b1731 100644 --- a/docs/fr/README.md +++ b/docs/fr/README.md @@ -10,11 +10,11 @@ FrankenPHP fonctionne avec n'importe quelle application PHP et rend vos projets FrankenPHP peut également être utilisé comme une bibliothèque Go autonome qui permet d'intégrer PHP dans n'importe quelle application en utilisant `net/http`. -Découvrez plus de détails sur ce serveur d’application dans le replay de cette conférence donnée au Forum PHP 2022 : +Découvrez plus de détails sur ce serveur d'application dans le replay de cette conférence donnée au Forum PHP 2022 : Diapositives -## Pour Commencer +## Pour commencer Sur Windows, utilisez [WSL](https://learn.microsoft.com/windows/wsl/) pour exécuter FrankenPHP. diff --git a/docs/fr/config.md b/docs/fr/config.md index 8d37f0b527..241f2632f9 100644 --- a/docs/fr/config.md +++ b/docs/fr/config.md @@ -241,7 +241,7 @@ où le processus FrankenPHP a été lancé. Vous pouvez également spécifier un La surveillance des fichiers est basée sur [e-dant/watcher](https://github.com/e-dant/watcher). -## Faire correspondre le Worker à un chemin +## Faire correspondre le worker à un chemin Dans les applications PHP traditionnelles, les scripts sont toujours placés dans le répertoire public. C'est également vrai pour les scripts worker, qui sont traités comme n'importe quel autre script PHP. Si vous souhaitez plutôt placer le script worker en dehors du répertoire public, vous pouvez le faire via la directive `match`. @@ -287,7 +287,7 @@ Vous pouvez également modifier la configuration de PHP en utilisant la directiv frankenphp { php_ini memory_limit 256M - # or + # ou php_ini { memory_limit 256M @@ -333,7 +333,7 @@ CADDY_GLOBAL_OPTIONS="servers { Vous trouverez plus d'informations sur ce paramètre dans la [documentation Caddy](https://caddyserver.com/docs/caddyfile/options#enable-full-duplex). -## Activer le mode Debug +## Activer le mode debug Lors de l'utilisation de l'image Docker, définissez la variable d'environnement `CADDY_GLOBAL_OPTIONS` sur `debug` pour activer le mode debug : diff --git a/docs/fr/docker.md b/docs/fr/docker.md index e054e52e0d..2a4eb2299a 100644 --- a/docs/fr/docker.md +++ b/docs/fr/docker.md @@ -90,7 +90,7 @@ L'image `builder` fournie par FrankenPHP contient une version compilée de `libp > Si vous utilisez Alpine Linux et Symfony, > vous devrez peut-être [augmenter la taille de pile par défaut](compile.md#utiliser-xcaddy). -## Activer le mode Worker par défaut +## Activer le mode worker par défaut Définissez la variable d'environnement `FRANKENPHP_CONFIG` pour démarrer FrankenPHP avec un script worker : diff --git a/docs/fr/embed.md b/docs/fr/embed.md index 1523a392be..5386fe0bfb 100644 --- a/docs/fr/embed.md +++ b/docs/fr/embed.md @@ -72,7 +72,7 @@ La manière la plus simple de créer un binaire Linux est d'utiliser le builder > Certains fichiers `.dockerignore` (par exemple celui fourni par défaut par [Symfony Docker](https://github.com/dunglas/symfony-docker/blob/main/.dockerignore)) > empêchent la copie du dossier `vendor/` et des fichiers `.env`. Assurez-vous d'ajuster ou de supprimer le fichier `.dockerignore` avant le build. -2. Construisez: +2. Construisez : ```console docker build -t static-app -f static-build.Dockerfile . diff --git a/docs/fr/extension-workers.md b/docs/fr/extension-workers.md index bfa463a75b..660b25d6fd 100644 --- a/docs/fr/extension-workers.md +++ b/docs/fr/extension-workers.md @@ -2,7 +2,7 @@ Les Workers d'extension permettent à votre [extension FrankenPHP](https://frankenphp.dev/docs/extensions/) de gérer un pool dédié de threads PHP pour exécuter des tâches en arrière-plan, gérer des événements asynchrones ou implémenter des protocoles personnalisés. Cela se révèle utile pour les systèmes de files d'attente, les event listeners, les planificateurs, etc. -## Enregistrement du Worker +## Enregistrement du worker ### Enregistrement statique @@ -41,7 +41,7 @@ Si vous prévoyez de partager votre extension (comme une file d'attente généri Si vous [intégrez FrankenPHP dans une application Go standard sans Caddy](https://pkg.go.dev/github.com/dunglas/frankenphp#example-ServeHTTP), vous pouvez enregistrer des workers d'extension en utilisant `frankenphp.WithExtensionWorkers` lors de l'initialisation des options. -## Interaction avec les Workers +## Interaction avec les workers Une fois le pool de workers actif, vous pouvez lui envoyer des tâches. Cela peut être fait à l'intérieur de [fonctions natives exportées vers PHP](https://frankenphp.dev/docs/extensions/#writing-the-extension), ou à partir de toute logique Go telle qu'un planificateur cron, un écouteur d'événements (MQTT, Kafka), ou toute autre goroutine. @@ -49,7 +49,7 @@ Une fois le pool de workers actif, vous pouvez lui envoyer des tâches. Cela peu Utilisez `SendMessage` pour passer des données brutes directement à votre script worker. C'est idéal pour les files d'attente ou les commandes simples. -#### Exemple : Une extension de file d'attente asynchrone +#### Exemple : une extension de file d'attente asynchrone ```go // #include @@ -109,7 +109,7 @@ func my_worker_http_request(path *C.zend_string) unsafe.Pointer { } ``` -## Script Worker +## Script worker Le script worker PHP s'exécute dans une boucle et peut gérer à la fois les messages bruts et les requêtes HTTP. @@ -131,7 +131,7 @@ while (frankenphp_handle_request($handler)) { } ``` -## Hooks de Cycle de Vie +## Hooks de cycle de vie FrankenPHP fournit des hooks pour exécuter du code Go à des points spécifiques du cycle de vie. diff --git a/docs/fr/extensions.md b/docs/fr/extensions.md index 488a28c5de..6aba81fd0d 100644 --- a/docs/fr/extensions.md +++ b/docs/fr/extensions.md @@ -6,16 +6,16 @@ L'écriture d'extensions PHP se fait généralement en C, mais il est également Grâce aux modules Caddy, vous pouvez écrire des extensions PHP en Go et les intégrer très rapidement dans FrankenPHP. -## Deux Approches +## Deux approches FrankenPHP offre deux façons de créer des extensions PHP en Go : -1. **Utilisation du Générateur d'Extensions** - L'approche recommandée qui génère tout le code standard nécessaire pour la plupart des cas d'usage, vous permettant de vous concentrer sur l'écriture de votre code Go -2. **Implémentation Manuelle** - Contrôle total sur la structure de l'extension pour les cas d'usage avancés +1. **Utilisation du générateur d'extensions** - L'approche recommandée qui génère tout le code standard nécessaire pour la plupart des cas d'usage, vous permettant de vous concentrer sur l'écriture de votre code Go +2. **Implémentation manuelle** - Contrôle total sur la structure de l'extension pour les cas d'usage avancés Nous commencerons par l'approche du générateur, car c'est le moyen le plus facile de commencer, puis nous montrerons l'implémentation manuelle pour ceux qui ont besoin d'un contrôle complet. -## Utilisation du Générateur d'Extensions +## Utilisation du générateur d'extensions FrankenPHP est livré avec un outil qui vous permet de **créer une extension PHP** en utilisant uniquement Go. **Pas besoin d'écrire du code C** ou d'utiliser CGO directement : FrankenPHP inclut également une **API de types publique** pour vous aider à écrire vos extensions en Go sans avoir à vous soucier du **jonglage de types entre PHP/C et Go**. @@ -28,7 +28,7 @@ Gardez à l'esprit que cet outil n'est **pas un générateur d'extensions comple Comme aussi couvert dans la section d'implémentation manuelle ci-dessous, vous devez [obtenir les sources PHP](https://www.php.net/downloads.php) et créer un nouveau module Go. -#### Créer un Nouveau Module et Obtenir les Sources PHP +#### Créer un nouveau module et obtenir les sources PHP La première étape pour écrire une extension PHP en Go est de créer un nouveau module Go. Vous pouvez utiliser la commande suivante pour cela : @@ -42,7 +42,7 @@ La seconde étape est [l'obtention des sources PHP](https://www.php.net/download tar xf php-* ``` -### Écrire l'Extension +### Écrire l'extension Tout est maintenant configuré pour écrire votre fonction native en Go. Créez un nouveau fichier nommé `stringext.go`. Notre première fonction prendra une chaîne comme argument, le nombre de fois à la répéter, un booléen pour indiquer s'il faut inverser la chaîne, et retournera la chaîne résultante. Cela devrait ressembler à ceci : @@ -82,11 +82,11 @@ Il y a deux choses importantes à noter ici : Alors que le premier point parle de lui-même, le second peut être plus difficile à appréhender. Plongeons plus profondément dans le jonglage de types dans la section suivante. -### Jonglage de Types +### Jonglage de types Bien que certains types de variables aient la même représentation mémoire entre C/PHP et Go, certains types nécessitent plus de logique pour être directement utilisés. C'est peut-être la partie la plus difficile quand il s'agit d'écrire des extensions car cela nécessite de comprendre les fonctionnements internes du moteur Zend et comment les variables sont stockées dans le moteur de PHP. Ce tableau résume ce que vous devez savoir : -| Type PHP | Type Go | Conversion directe | Assistant C vers Go | Assistant Go vers C | Support des Méthodes de Classe | +| Type PHP | Type Go | Conversion directe | Assistant C vers Go | Assistant Go vers C | Support des méthodes de classe | | ------------------ | ----------------------------- | ------------------ | --------------------------------- | ---------------------------------- | ------------------------------ | | `int` | `int64` | ✅ | - | - | ✅ | | `?int` | `*int64` | ✅ | - | - | ✅ | @@ -108,7 +108,7 @@ Bien que certains types de variables aient la même représentation mémoire ent Si vous vous référez à l'extrait de code de la section précédente, vous pouvez voir que des assistants sont utilisés pour convertir le premier paramètre et la valeur de retour. Les deuxième et troisième paramètres de notre fonction `repeat_this()` n'ont pas besoin d'être convertis car la représentation mémoire des types sous-jacents est la même pour C et Go. -#### Travailler avec les Tableaux +#### Travailler avec les tableaux FrankenPHP fournit un support natif pour les tableaux PHP à travers `frankenphp.AssociativeArray` ou une conversion directe vers une map ou un slice. @@ -201,7 +201,7 @@ func process_data_packed(arr *C.zval) unsafe.Pointer { - **Tableaux imbriqués** - Les tableaux peuvent être imbriqués et convertiront automatiquement tous les types supportés (`int64`, `float64`, `string`, `bool`, `nil`, `AssociativeArray`, `map[string]any`, `[]any`) - **Les objets ne sont pas supportés** - Actuellement, seuls les types scalaires et les tableaux peuvent être utilisés comme valeurs. Fournir un objet résultera en une valeur `null` dans le tableau PHP. -##### Méthodes disponibles : Packed et Associatif +##### Méthodes disponibles : packed et associatif - `frankenphp.PHPAssociativeArray(arr frankenphp.AssociativeArray) unsafe.Pointer` - Convertir vers un tableau PHP ordonné avec des paires clé-valeur - `frankenphp.PHPMap(arr map[string]any) unsafe.Pointer` - Convertir une map vers un tableau PHP non ordonné avec des paires clé-valeur @@ -211,7 +211,7 @@ func process_data_packed(arr *C.zval) unsafe.Pointer { - `frankenphp.GoPackedArray(arr unsafe.Pointer) []any` - Convertir un tableau PHP vers un slice Go - `frankenphp.IsPacked(zval *C.zend_array) bool` - Vérifie si le tableau PHP est une liste ou un tableau associatif -### Travailler avec des Callables +### Travailler avec des callables FrankenPHP propose un moyen de travailler avec les _callables_ PHP grâce au helper `frankenphp.CallPHPCallable()`. Cela permet d'appeler des fonctions ou des méthodes PHP depuis du code Go. @@ -247,7 +247,7 @@ $result = my_array_map(['hello', 'world'], 'strtoupper'); // $result vaudra ['HELLO', 'WORLD'] ``` -### Déclarer une Classe PHP Native +### Déclarer une classe PHP native Le générateur prend en charge la déclaration de **classes opaques** comme structures Go, qui peuvent être utilisées pour créer des objets PHP. Vous pouvez utiliser la directive `//export_php:class` pour définir une classe PHP. Par exemple : @@ -261,7 +261,7 @@ type UserStruct struct { } ``` -#### Que sont les Classes Opaques ? +#### Que sont les classes opaques ? Les **classes opaques** sont des classes avec lesquelles la structure interne (comprendre : les propriétés) est cachée du code PHP. Cela signifie : @@ -273,7 +273,7 @@ Les **classes opaques** sont des classes avec lesquelles la structure interne (c Cette approche fournit une meilleure encapsulation et empêche le code PHP de corrompre accidentellement l'état interne de vos objets Go. Toutes les interactions avec l'objet doivent passer par les méthodes que vous définissez explicitement. -#### Ajouter des Méthodes aux Classes +#### Ajouter des méthodes aux classes Puisque les propriétés ne sont pas directement accessibles, vous **devez définir des méthodes** pour interagir avec vos classes opaques. Utilisez la directive `//export_php:method` pour définir cela : @@ -315,7 +315,7 @@ func (us *UserStruct) SetNamePrefix(prefix *C.zend_string) { } ``` -#### Paramètres Nullables +#### Paramètres nullables Le générateur prend en charge les paramètres nullables en utilisant le préfixe `?` dans les signatures PHP. Quand un paramètre est nullable, il devient un pointeur dans votre fonction Go, vous permettant de vérifier si la valeur était `null` en PHP : @@ -384,11 +384,11 @@ $user->updateInfo(null, 25, null); // Le nom et actif sont null Cette conception garantit que votre code Go a un contrôle complet sur la façon dont l'état de l'objet est accédé et modifié, fournissant une meilleure encapsulation et sécurité de type. -### Déclarer des Constantes +### Déclarer des constantes Le générateur prend en charge l'exportation de constantes Go vers PHP en utilisant deux directives : `//export_php:const` pour les constantes globales et `//export_php:classconst` pour les constantes de classe. Cela vous permet de partager des valeurs de configuration, des codes de statut et d'autres constantes entre le code Go et PHP. -#### Constantes Globales +#### Constantes globales Utilisez la directive `//export_php:const` pour créer des constantes PHP globales : @@ -411,7 +411,7 @@ const ( > [!NOTE] > Les constantes PHP prennent le nom de la constante Go, d'où l'utilisation de majuscules pour les noms des constants en Go. -#### Constantes de Classe +#### Constantes de classe Utilisez la directive `//export_php:classconst ClassName` pour créer des constantes qui appartiennent à une classe PHP spécifique : @@ -517,11 +517,11 @@ func (sp *StringProcessorStruct) Process(input *C.zend_string, mode int64) unsaf } ``` -### Utilisation des Espaces de Noms +### Utilisation des espaces de noms Le générateur prend en charge l'organisation des fonctions, classes et constantes de votre extension PHP sous un espace de noms (namespace) en utilisant la directive `//export_php:namespace`. Cela aide à éviter les conflits de noms et fournit une meilleure organisation pour l'API de votre extension. -#### Déclarer un Espace de Noms +#### Déclarer un espace de noms Utilisez la directive `//export_php:namespace` en haut de votre fichier Go pour placer tous les symboles exportés sous un espace de noms spécifique : @@ -554,7 +554,7 @@ func (u *UserStruct) GetName() unsafe.Pointer { const STATUS_ACTIVE = 1 ``` -#### Utilisation de l'Extension avec Espace de Noms en PHP +#### Utilisation de l'extension avec espace de noms en PHP Quand un espace de noms est déclaré, toutes les fonctions, classes et constantes sont placées sous cet espace de noms en PHP : @@ -569,14 +569,14 @@ echo $user->getName(); // "Jean Dupont" echo My\Extension\STATUS_ACTIVE; // 1 ``` -#### Notes Importantes +#### Notes importantes - Seule **une** directive d'espace de noms est autorisée par fichier. Si plusieurs directives d'espace de noms sont trouvées, le générateur retournera une erreur. - L'espace de noms s'applique à **tous** les symboles exportés dans le fichier : fonctions, classes, méthodes et constantes. - Les noms d'espaces de noms suivent les conventions des espaces de noms PHP en utilisant les barres obliques inverses (`\`) comme séparateurs. - Si aucun espace de noms n'est déclaré, les symboles sont exportés vers l'espace de noms global comme d'habitude. -### Générer l'Extension +### Générer l'extension C'est là que la magie opère, et votre extension peut maintenant être générée. Vous pouvez exécuter le générateur avec la commande suivante : @@ -589,7 +589,7 @@ GEN_STUB_SCRIPT=php-src/build/gen_stub.php frankenphp extension-init my_extensio Si tout s'est bien passé, un nouveau répertoire nommé `build` devrait avoir été créé. Ce répertoire contient les fichiers générés pour votre extension, incluant le fichier `my_extension.go` avec les stubs de fonction PHP générés. -### Intégrer l'Extension Générée dans FrankenPHP +### Intégrer l'extension générée dans FrankenPHP Notre extension est maintenant prête à être compilée et intégrée dans FrankenPHP. Pour ce faire, référez-vous à la [documentation de compilation](compile.md) de FrankenPHP pour apprendre comment compiler FrankenPHP. Ajoutez le module en utilisant le flag `--with`, pointant vers le chemin de votre module : @@ -605,7 +605,7 @@ xcaddy build \ Notez que vous pointez vers le sous-répertoire `/build` qui a été créé pendant l'étape de génération. Cependant, ce n'est pas obligatoire : vous pouvez aussi copier les fichiers générés dans le répertoire de votre module et pointer directement vers lui. -### Tester Votre Extension Générée +### Tester votre extension générée Vous pouvez créer un fichier PHP pour tester les fonctions et classes que vous avez créées. Par exemple, créez un fichier `index.php` avec le contenu suivant : @@ -623,15 +623,15 @@ echo $processor->process('Hello World', StringProcessor::MODE_UPPERCASE); // "H Une fois que vous avez intégré votre extension dans FrankenPHP comme indiqué dans la section précédente, vous pouvez exécuter ce fichier de test en utilisant `./frankenphp php-server`, et vous devriez voir votre extension fonctionner. -## Implémentation Manuelle +## Implémentation manuelle Si vous voulez comprendre comment les extensions fonctionnent ou avez besoin d'un contrôle total sur votre extension, vous pouvez les écrire manuellement. Cette approche vous donne un contrôle complet mais nécessite plus de code intermédiaire. -### Fonction de Base +### Fonction de base Nous allons voir comment écrire une extension PHP simple en Go qui définit une nouvelle fonction native. Cette fonction sera appelée depuis PHP et déclenchera une goroutine qui enregistrera un message dans les logs de Caddy. Cette fonction ne prend aucun paramètre et ne retourne rien. -#### Définir la Fonction Go +#### Définir la fonction Go Dans votre module, vous devez définir une nouvelle fonction native qui sera appelée depuis PHP. Pour ce faire, créez un fichier avec le nom que vous voulez, par exemple, `extension.go`, et ajoutez le code suivant : @@ -663,7 +663,7 @@ La fonction `frankenphp.RegisterExtension()` simplifie le processus d'enregistre Dans cet exemple, notre nouvelle fonction déclenchera une goroutine qui enregistrera un message dans les logs de Caddy. -#### Définir la Fonction PHP +#### Définir la fonction PHP Pour permettre à PHP d'appeler notre fonction, nous devons définir une fonction PHP correspondante. Pour cela, nous créerons un fichier stub, par exemple, `extension.stub.php`, qui contiendra le code suivant : @@ -685,7 +685,7 @@ php ../php-src/build/gen_stub.php extension.stub.php Ce script générera un fichier nommé `extension_arginfo.h` qui contient les informations nécessaires pour que PHP sache comment définir et appeler notre fonction. -#### Écrire le Pont entre Go et C +#### Écrire le pont entre Go et C Maintenant, nous devons écrire le pont entre Go et C. Créez un fichier nommé `extension.h` dans le répertoire de votre module avec le contenu suivant : @@ -747,11 +747,11 @@ Enfin, nous définissons les métadonnées de l'extension dans une structure `ze L'enregistrement de l'extension est automatiquement géré par la fonction `RegisterExtension()` de FrankenPHP que nous appelons dans notre code Go. -### Usage Avancé +### Usage avancé Maintenant que nous savons comment créer une extension PHP de base en Go, complexifions notre exemple. Nous allons maintenant créer une fonction PHP qui prend une chaîne comme paramètre et retourne sa version en majuscules. -#### Définir le Stub de Fonction PHP +#### Définir le stub de fonction PHP Pour définir la nouvelle fonction PHP, nous modifierons notre fichier `extension.stub.php` pour inclure la nouvelle signature de fonction : @@ -789,7 +789,7 @@ static const zend_function_entry ext_functions[] = { Nous pouvons voir que la fonction `go_upper` est définie avec un paramètre de type `string` et un type de retour `string`. -#### Jonglerie de Types entre Go et PHP/C +#### Jonglerie de types entre Go et PHP/C Votre fonction Go ne peut pas accepter directement une chaîne PHP comme paramètre. Vous devez la convertir en chaîne Go. Heureusement, FrankenPHP fournit des fonctions d'aide pour gérer la conversion entre les chaînes PHP et les chaînes Go, similaire à ce que nous avons vu dans l'approche du générateur. @@ -826,7 +826,7 @@ Vous pouvez en apprendre plus sur `ZEND_PARSE_PARAMETERS_START` et l'analyse des Il ne reste qu'une chose à faire : implémenter la fonction `go_upper` en Go. -#### Implémenter la Fonction Go +#### Implémenter la fonction Go Notre fonction Go prendra un `*C.zend_string` comme paramètre, le convertira en chaîne Go en utilisant la fonction d'aide de FrankenPHP, le traitera, et retournera le résultat comme un nouveau `*C.zend_string`. Les fonctions d'aide gèrent toute la complexité de gestion de mémoire et de conversion pour nous. @@ -857,7 +857,7 @@ Cette approche est beaucoup plus propre et sûre que la gestion manuelle de la m > [!TIP] > Dans cet exemple, nous n'effectuons aucune gestion d'erreur, mais vous devriez toujours vérifier que les pointeurs ne sont pas `nil` et que les données sont valides avant de les utiliser dans vos fonctions Go. -### Intégrer l'Extension dans FrankenPHP +### Intégrer l'extension dans FrankenPHP Notre extension est maintenant prête à être compilée et intégrée dans FrankenPHP. Pour ce faire, référez-vous à la [documentation de compilation](compile.md) de FrankenPHP pour apprendre comment compiler FrankenPHP. Ajoutez le module en utilisant le flag `--with`, pointant vers le chemin de votre module : @@ -873,7 +873,7 @@ xcaddy build \ C'est tout ! Votre extension est maintenant intégrée dans FrankenPHP et peut être utilisée dans votre code PHP. -### Tester Votre Extension +### Tester votre extension Après avoir intégré votre extension dans FrankenPHP, vous pouvez créer un fichier `index.php` avec des exemples pour les fonctions que vous avez implémentées : diff --git a/docs/fr/hot-reload.md b/docs/fr/hot-reload.md index 2f10567608..5ace2e6e83 100644 --- a/docs/fr/hot-reload.md +++ b/docs/fr/hot-reload.md @@ -113,9 +113,9 @@ Pour ce faire, ajoutez l'attribut `data-frankenphp-hot-reload-preserve` à l'él ``` -## Mode Worker +## Mode worker -Si vous exécutez votre application en [mode Worker](worker.md), le script de votre application reste en mémoire. +Si vous exécutez votre application en [mode worker](worker.md), le script de votre application reste en mémoire. Cela signifie que les modifications de votre code PHP ne seront pas reflétées immédiatement, même si le navigateur recharge la page. Pour une meilleure expérience de développement, combinez `hot_reload` avec [la sous-directive `watch` dans la directive `worker`](config.md#surveillance-des-modifications-de-fichier). @@ -143,7 +143,7 @@ php_server { ## Comment ça fonctionne 1. **Surveillance** : FrankenPHP surveille le système de fichiers pour les modifications en utilisant [la bibliothèque `e-dant/watcher`](https://github.com/e-dant/watcher) en interne (nous avons contribué à son binding Go). -2. **Redémarrage (mode Worker)** : si `watch` est activé dans la configuration du worker, le worker PHP est redémarré pour charger le nouveau code. +2. **Redémarrage (mode worker)** : si `watch` est activé dans la configuration du worker, le worker PHP est redémarré pour charger le nouveau code. 3. **Envoi** : un payload JSON contenant la liste des fichiers modifiés est envoyé au [hub Mercure](https://mercure.rocks) intégré. 4. **Réception** : le navigateur, à l'écoute via la bibliothèque JavaScript, reçoit l'événement Mercure. 5. **Mise à jour** : diff --git a/docs/fr/known-issues.md b/docs/fr/known-issues.md index 5d5d711c44..c0c44d6089 100644 --- a/docs/fr/known-issues.md +++ b/docs/fr/known-issues.md @@ -1,4 +1,4 @@ -# Problèmes Connus +# Problèmes connus ## Extensions PHP non prises en charge @@ -47,7 +47,7 @@ docker run \ Le pilote de réseau "hôte" n'est pas pris en charge sur Mac et Windows. Sur ces plateformes, vous devrez deviner l'adresse IP du conteneur et l'inclure dans les noms de serveur. -Exécutez la commande `docker network inspect bridge` et inpectez la clef `Containers` pour identifier la dernière adresse IP attribuée sous la clef `IPv4Address`, puis incrémentez-la d'un. Si aucun conteneur n'est en cours d'exécution, la première adresse IP attribuée est généralement `172.17.0.2`. +Exécutez la commande `docker network inspect bridge` et inspectez la clef `Containers` pour identifier la dernière adresse IP attribuée sous la clef `IPv4Address`, puis incrémentez-la d'un. Si aucun conteneur n'est en cours d'exécution, la première adresse IP attribuée est généralement `172.17.0.2`. Ensuite, incluez ceci dans la variable d'environnement `SERVER_NAME` : @@ -76,9 +76,9 @@ docker run \ dunglas/frankenphp ``` -## Scripts Composer Faisant Références à `@php` +## Scripts Composer faisant référence à `@php` -Les [scripts Composer](https://getcomposer.org/doc/articles/scripts.md) peuvent vouloir exécuter un binaire PHP pour certaines tâches, par exemple dans [un projet Laravel](laravel.md) pour exécuter `@php artisan package:discover --ansi`. Cela [echoue actuellement](https://github.com/php/frankenphp/issues/483#issuecomment-1899890915) pour deux raisons : +Les [scripts Composer](https://getcomposer.org/doc/articles/scripts.md) peuvent vouloir exécuter un binaire PHP pour certaines tâches, par exemple dans [un projet Laravel](laravel.md) pour exécuter `@php artisan package:discover --ansi`. Cela [échoue actuellement](https://github.com/php/frankenphp/issues/483#issuecomment-1899890915) pour deux raisons : - Composer ne sait pas comment appeler le binaire FrankenPHP ; - Composer peut ajouter des paramètres PHP en utilisant le paramètre `-d` dans la commande, ce que FrankenPHP ne supporte pas encore. diff --git a/docs/fr/laravel.md b/docs/fr/laravel.md index 82677aef02..6405814863 100644 --- a/docs/fr/laravel.md +++ b/docs/fr/laravel.md @@ -12,7 +12,7 @@ docker run -p 80:80 -p 443:443 -p 443:443/udp -v $PWD:/app dunglas/frankenphp Et profitez ! -## Installation Locale +## Installation locale Vous pouvez également exécuter vos projets Laravel avec FrankenPHP depuis votre machine locale : @@ -74,11 +74,11 @@ La commande `octane:frankenphp` peut prendre les options suivantes : - `--log-level` : Enregistrer les messages au niveau de journalisation spécifié ou au-dessus, en utilisant le logger natif de Caddy > [!TIP] -> Pour obtenir des logs structurés en JSON logs (utile quand vous utilisez des solutions d'analyse de logs), passez explicitement l'option `--log-level`. +> Pour obtenir des logs structurés en JSON (utile quand vous utilisez des solutions d'analyse de logs), passez explicitement l'option `--log-level`. En savoir plus sur Laravel Octane [dans sa documentation officielle](https://laravel.com/docs/octane). -## Les Applications Laravel En Tant Que Binaires Autonomes +## Les applications Laravel en tant que binaires autonomes En utilisant la [fonctionnalité d'intégration d'applications de FrankenPHP](embed.md), il est possible de distribuer les applications Laravel sous forme de binaires autonomes. @@ -119,7 +119,7 @@ Suivez ces étapes pour empaqueter votre application Laravel en tant que binaire > Certains fichiers `.dockerignore` ignoreront le répertoire `vendor/` > et les fichiers `.env`. Assurez-vous d'ajuster ou de supprimer le fichier `.dockerignore` avant la construction. -2. Build: +2. Construisez : ```console docker build -t static-laravel-app -f static-build.Dockerfile . @@ -149,7 +149,7 @@ Suivez ces étapes pour empaqueter votre application Laravel en tant que binaire frankenphp php-cli artisan key:generate ``` -7. Démarrez le serveur: +7. Démarrez le serveur : ```console frankenphp php-server diff --git a/docs/fr/mercure.md b/docs/fr/mercure.md index 4a2af8a506..279d152366 100644 --- a/docs/fr/mercure.md +++ b/docs/fr/mercure.md @@ -1,4 +1,4 @@ -# Temps Réel +# Temps réel FrankenPHP est livré avec un hub [Mercure](https://mercure.rocks) intégré. Mercure permet de pousser des événements en temps réel vers tous les appareils connectés : ils recevront un événement JavaScript instantanément. @@ -9,4 +9,4 @@ Aucune bibliothèque JS ou SDK requis ! Pour activer le hub Mercure, mettez à jour le `Caddyfile` comme décrit [sur le site de Mercure](https://mercure.rocks/docs/hub/config). -Pour pousser des mises à jour Mercure depuis votre code, nous recommandons le [Composant Mercure de Symfony](https://symfony.com/components/Mercure) (vous n'avez pas besoin du framework full stack Symfony pour l'utiliser). +Pour pousser des mises à jour Mercure depuis votre code, nous recommandons le [composant Mercure de Symfony](https://symfony.com/components/Mercure) (vous n'avez pas besoin du framework full stack Symfony pour l'utiliser). diff --git a/docs/fr/metrics.md b/docs/fr/metrics.md index 697d2eebf1..e19dc7a591 100644 --- a/docs/fr/metrics.md +++ b/docs/fr/metrics.md @@ -5,13 +5,13 @@ Lorsque les [métriques Caddy](https://caddyserver.com/docs/metrics) sont activ - `frankenphp_total_threads` : Le nombre total de threads PHP. - `frankenphp_busy_threads` : Le nombre de threads PHP en cours de traitement d'une requête (les workers en cours d'exécution consomment toujours un thread). - `frankenphp_queue_depth` : Le nombre de requêtes régulières en file d'attente -- `frankenphp_total_workers{worker=« [nom_du_worker] »}` : Le nombre total de workers. -- `frankenphp_busy_workers{worker=« [nom_du_worker] »}` : Le nombre de workers qui traitent actuellement une requête. -- `frankenphp_worker_request_time{worker=« [nom_du_worker] »}` : Le temps passé à traiter les requêtes par tous les workers. -- `frankenphp_worker_request_count{worker=« [nom_du_worker] »}` : Le nombre de requêtes traitées par tous les workers. -- `frankenphp_ready_workers{worker=« [nom_du_worker] »}` : Le nombre de workers qui ont appelé `frankenphp_handle_request` au moins une fois. -- `frankenphp_worker_crashes{worker=« [nom_du_worker] »}` : Le nombre de fois où un worker s'est arrêté de manière inattendue. -- `frankenphp_worker_restarts{worker=« [nom_du_worker] »}` : Le nombre de fois où un worker a été délibérément redémarré. -- `frankenphp_worker_queue_depth{worker=« [nom_du_worker] »}` : Le nombre de requêtes en file d'attente. +- `frankenphp_total_workers{worker="[nom_du_worker]"}` : Le nombre total de workers. +- `frankenphp_busy_workers{worker="[nom_du_worker]"}` : Le nombre de workers qui traitent actuellement une requête. +- `frankenphp_worker_request_time{worker="[nom_du_worker]"}` : Le temps passé à traiter les requêtes par tous les workers. +- `frankenphp_worker_request_count{worker="[nom_du_worker]"}` : Le nombre de requêtes traitées par tous les workers. +- `frankenphp_ready_workers{worker="[nom_du_worker]"}` : Le nombre de workers qui ont appelé `frankenphp_handle_request` au moins une fois. +- `frankenphp_worker_crashes{worker="[nom_du_worker]"}` : Le nombre de fois où un worker s'est arrêté de manière inattendue. +- `frankenphp_worker_restarts{worker="[nom_du_worker]"}` : Le nombre de fois où un worker a été délibérément redémarré. +- `frankenphp_worker_queue_depth{worker="[nom_du_worker]"}` : Le nombre de requêtes en file d'attente. Pour les métriques de worker, le placeholder `[nom_du_worker]` est remplacé par le nom du worker dans le Caddyfile, sinon le chemin absolu du fichier du worker sera utilisé. diff --git a/docs/fr/production.md b/docs/fr/production.md index c108e49925..13216a5e78 100644 --- a/docs/fr/production.md +++ b/docs/fr/production.md @@ -1,4 +1,4 @@ -# Déploiement en Production +# Déploiement en production Dans ce tutoriel, nous apprendrons comment déployer une application PHP sur un serveur unique en utilisant Docker Compose. @@ -73,7 +73,7 @@ Pour déployer votre application en production, vous avez besoin d'un serveur. Dans ce tutoriel, nous utiliserons une machine virtuelle fournie par DigitalOcean, mais n'importe quel serveur Linux peut fonctionner. Si vous avez déjà un serveur Linux avec Docker installé, vous pouvez passer directement à [la section suivante](#configurer-un-nom-de-domaine). -Sinon, utilisez [ce lien affilié](https://m.do.co/c/5d8aabe3ab80) pour obtenir 200$ de crédit gratuit, créez un compte, puis cliquez sur "Créer un Droplet". +Sinon, utilisez [ce lien affilié](https://m.do.co/c/5d8aabe3ab80) pour obtenir 200 $ de crédit gratuit, créez un compte, puis cliquez sur "Créer un Droplet". Ensuite, cliquez sur l'onglet "Marketplace" sous la section "Choisir une image" et recherchez l'application nommée "Docker". Cela provisionnera un serveur Ubuntu avec les dernières versions de Docker et Docker Compose déjà installées ! @@ -159,7 +159,7 @@ ou le [middleware `trustedproxies`](https://laravel.com/docs/trustedproxy) pour Sans ces deux configurations, les en-têtes tels que `X-Forwarded-For` et `X-Forwarded-Proto` seront ignorés, ce qui peut entraîner des problèmes tels qu'une détection HTTPS incorrecte ou des adresses IP client erronées. -## Déploiement sur Plusieurs Nœuds +## Déploiement sur plusieurs nœuds Si vous souhaitez déployer votre application sur un cluster de machines, vous pouvez utiliser [Docker Swarm](https://docs.docker.com/engine/swarm/stack-deploy/), qui est compatible avec les fichiers Compose fournis. Pour un déploiement sur Kubernetes, jetez un œil au [Helm chart fourni avec API Platform](https://api-platform.com/docs/deployment/kubernetes/), qui utilise FrankenPHP. diff --git a/docs/fr/static.md b/docs/fr/static.md index 1efebb18df..6e4e5502f7 100644 --- a/docs/fr/static.md +++ b/docs/fr/static.md @@ -124,8 +124,8 @@ Les variables d'environnement suivantes peuvent être transmises à `docker buil - `EMBED` : chemin de l'application PHP à intégrer dans le binaire - `CLEAN` : lorsque défini, `libphp` et toutes ses dépendances sont construites à partir de zéro (pas de cache) - `DEBUG_SYMBOLS` : lorsque défini, les symboles de débogage ne seront pas supprimés et seront ajoutés dans le binaire -- `NO_COMPRESS`: ne pas compresser le binaire avec UPX -- `MIMALLOC`: (expérimental, Linux seulement) remplace l'allocateur mallocng de musl par [mimalloc](https://github.com/microsoft/mimalloc) pour des performances améliorées +- `NO_COMPRESS` : ne pas compresser le binaire avec UPX +- `MIMALLOC` : (expérimental, Linux seulement) remplace l'allocateur mallocng de musl par [mimalloc](https://github.com/microsoft/mimalloc) pour des performances améliorées - `RELEASE` : (uniquement pour les mainteneurs) lorsque défini, le binaire résultant sera uploadé sur GitHub ## Extensions diff --git a/docs/fr/worker.md b/docs/fr/worker.md index ed86dd8f6c..f758d12c5f 100644 --- a/docs/fr/worker.md +++ b/docs/fr/worker.md @@ -42,7 +42,7 @@ Cette fonctionnalité se combine très bien avec le [rechargement à chaud](hot- > [!TIP] > La section suivante est nécessaire uniquement avant Symfony 7.4, où le support natif du mode worker de FrankenPHP a été introduit. -Le mode worker de FrankenPHP est pris en charge par le [Composant Runtime de Symfony](https://symfony.com/doc/current/components/runtime.html). +Le mode worker de FrankenPHP est pris en charge par le [composant Runtime de Symfony](https://symfony.com/doc/current/components/runtime.html). Pour démarrer une application Symfony dans un worker, installez le package FrankenPHP de [PHP Runtime](https://github.com/php-runtime/runtime) : ```console @@ -64,7 +64,7 @@ docker run \ Voir [la documentation dédiée](laravel.md#laravel-octane). -## Applications Personnalisées +## Applications personnalisées L'exemple suivant montre comment créer votre propre script worker sans dépendre d'une bibliothèque tierce : diff --git a/docs/fr/x-sendfile.md b/docs/fr/x-sendfile.md index 1269436a89..5223ba0c69 100644 --- a/docs/fr/x-sendfile.md +++ b/docs/fr/x-sendfile.md @@ -53,7 +53,7 @@ Tout d'abord, ajoutez la configuration suivante à votre `Caddyfile` pour active Définissez le chemin relatif du fichier (à partir de `private-files/`) comme valeur de l'en-tête `X-Accel-Redirect` : ```php -header('X-Accel-Redirect: file.txt') ; +header('X-Accel-Redirect: file.txt'); ``` ## Projets utilisant le composant Symfony HttpFoundation (Symfony, Laravel, Drupal...) diff --git a/docs/github-actions.md b/docs/github-actions.md index e7663a440f..002c59d177 100644 --- a/docs/github-actions.md +++ b/docs/github-actions.md @@ -6,7 +6,7 @@ description: Use GitHub Actions to automatically build and publish FrankenPHP Do # Using GitHub Actions This repository builds and deploys the Docker image to [Docker Hub](https://hub.docker.com/r/dunglas/frankenphp) on -every approved pull request or on your own fork once setup. +every approved pull request or on your own fork once set up. ## Setting up GitHub Actions diff --git a/docs/known-issues.md b/docs/known-issues.md index f26bd2bb29..644fe1ff38 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -24,13 +24,13 @@ The following extensions have known bugs and unexpected behaviors when used with ## get_browser -The [get_browser()](https://www.php.net/manual/function.get-browser.php) function seems to perform badly after a while. A workaround is to cache (e.g. with [APCu](https://www.php.net/manual/book.apcu.php)) the results per User Agent, as they are static. +The [get_browser()](https://www.php.net/manual/function.get-browser.php) function seems to perform badly after a while. A workaround is to cache (e.g. with [APCu](https://www.php.net/manual/book.apcu.php)) the results per user agent, as they are static. ## Standalone binary and Alpine-based Docker images The fully static binary and Alpine-based Docker images (`dunglas/frankenphp:*-alpine`) use [musl libc](https://musl.libc.org/) instead of [glibc and friends](https://www.etalabs.net/compare_libcs.html), to keep a smaller binary size. This may lead to some compatibility issues. -In particular, the glob flag `GLOB_BRACE` is [not available](https://www.php.net/manual/function.glob.php) +In particular, the glob flag `GLOB_BRACE` is [not available](https://www.php.net/manual/function.glob.php). Prefer using the GNU variant of the static binary and Debian-based Docker images if you encounter issues. diff --git a/docs/laravel.md b/docs/laravel.md index de9165ca09..b9de245f82 100644 --- a/docs/laravel.md +++ b/docs/laravel.md @@ -72,7 +72,7 @@ The `octane:frankenphp` command can take the following options: - `--admin-port`: The port the admin server should be available on (default: `2019`) - `--workers`: The number of workers that should be available to handle requests (default: `auto`) - `--max-requests`: The number of requests to process before reloading the server (default: `500`) -- `--caddyfile`: The path to the FrankenPHP `Caddyfile` file (default: [stubbed `Caddyfile` in Laravel Octane](https://github.com/laravel/octane/blob/2.x/src/Commands/stubs/Caddyfile)) +- `--caddyfile`: The path to the FrankenPHP `Caddyfile` (default: [stubbed `Caddyfile` in Laravel Octane](https://github.com/laravel/octane/blob/2.x/src/Commands/stubs/Caddyfile)) - `--https`: Enable HTTPS, HTTP/2, and HTTP/3, and automatically generate and renew certificates - `--http-redirect`: Enable HTTP to HTTPS redirection (only enabled if --https is passed) - `--watch`: Automatically reload the server when the application is modified diff --git a/docs/metrics.md b/docs/metrics.md index a783a5c90e..036b714a37 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -12,7 +12,7 @@ When [Caddy metrics](https://caddyserver.com/docs/metrics) are enabled, FrankenP - `frankenphp_total_threads`: The total number of PHP threads. - `frankenphp_busy_threads`: The number of PHP threads currently processing a request (running workers always consume a thread). -- `frankenphp_queue_depth`: The number of regular queued requests +- `frankenphp_queue_depth`: The number of regular queued requests. - `frankenphp_total_workers{worker="[worker_name]"}`: The total number of workers. - `frankenphp_busy_workers{worker="[worker_name]"}`: The number of workers currently processing a request. - `frankenphp_worker_request_time{worker="[worker_name]"}`: The time spent processing requests by all workers. diff --git a/docs/performance.md b/docs/performance.md index 0197e2dc23..50ac6f8a5b 100644 --- a/docs/performance.md +++ b/docs/performance.md @@ -28,7 +28,7 @@ unpredictable. The `max_threads` [configuration](config.md#caddyfile-config) all `max_threads` can help you figure out how many threads you need to handle your traffic and can make the server more resilient to latency spikes. If set to `auto`, the limit will be estimated based on the `memory_limit` in your `php.ini`. If not able to do so, `auto` will instead default to 2x `num_threads`. Keep in mind that `auto` might strongly underestimate the number of threads needed. -`max_threads` is similar to PHP FPM's [pm.max_children](https://www.php.net/manual/install.fpm.configuration.php#pm.max-children). The main difference is that FrankenPHP uses threads instead of +`max_threads` is similar to PHP-FPM's [pm.max_children](https://www.php.net/manual/install.fpm.configuration.php#pm.max-children). The main difference is that FrankenPHP uses threads instead of processes and automatically delegates them across different worker scripts and 'classic mode' as needed. ## Worker mode for higher throughput @@ -48,7 +48,7 @@ Also, [some bugs only happen when using musl](https://github.com/php/php-src/iss In production environments, we recommend using FrankenPHP linked against glibc, compiled with an appropriate optimization level. -This can be achieved by using the Debian Docker images, using [our maintainers .deb, .rpm, or .apk packages](https://pkgs.henderkes.com), or by [compiling FrankenPHP from sources](compile.md). +This can be achieved by using the Debian Docker images, using [our maintainer's .deb, .rpm, or .apk packages](https://pkgs.henderkes.com), or by [compiling FrankenPHP from sources](compile.md). For leaner or more secure containers, you may want to consider [a hardened Debian image](docker.md#hardening-images) rather than Alpine. @@ -202,4 +202,4 @@ example.com { } ``` -Generally it's also advisable to handle very slow endpoints asynchronously, by using relevant mechanisms such as message queues. +Generally, it's also advisable to handle very slow endpoints asynchronously, by using relevant mechanisms such as message queues. diff --git a/docs/production.md b/docs/production.md index b47fdbe9f5..fbc11fda27 100644 --- a/docs/production.md +++ b/docs/production.md @@ -68,7 +68,7 @@ volumes: > The previous examples are intended for production usage. > In development, you may want to use a volume, a different PHP configuration and a different value for the `SERVER_NAME` environment variable. > -> Take a look to the [Symfony Docker](https://github.com/dunglas/symfony-docker) project +> Take a look at the [Symfony Docker](https://github.com/dunglas/symfony-docker) project > (which uses FrankenPHP) for a more advanced example using multi-stage images, > Composer, extra PHP extensions, etc. @@ -116,7 +116,7 @@ Example with the DigitalOcean Domains service ("Networking" > "Domains"): > [!NOTE] > -> Let's Encrypt, the service used by default by FrankenPHP to automatically generate a TLS certificate doesn't support using bare IP addresses. Using a domain name is mandatory to use Let's Encrypt. +> Let's Encrypt, the service used by default by FrankenPHP to automatically generate a TLS certificate, doesn't support using bare IP addresses. Using a domain name is mandatory to use Let's Encrypt. ## Deploying FrankenPHP with Docker Compose @@ -141,7 +141,7 @@ Go to `https://your-domain-name.example.com` and enjoy! > [!CAUTION] > -> Docker can have a cache layer, make sure you have the right build for each deployment or rebuild your project with `--no-cache` option to avoid cache issue. +> Docker can have a cache layer, make sure you have the right build for each deployment or rebuild your project with the `--no-cache` option to avoid cache issues. ## Running behind a reverse proxy diff --git a/docs/pt-br/CONTRIBUTING.md b/docs/pt-br/CONTRIBUTING.md index a24a9718a9..b664174523 100644 --- a/docs/pt-br/CONTRIBUTING.md +++ b/docs/pt-br/CONTRIBUTING.md @@ -36,7 +36,7 @@ Adicione diretórios ao `.dockerignore`. [Siga as instruções para compilar a partir do código-fonte](compile.md) e passe a flag de configuração `--debug`. -## Executando a suite de testes +## Executando a suíte de testes ```console go test -race -v ./... diff --git a/docs/pt-br/compile.md b/docs/pt-br/compile.md index a2df4221ea..708ef10662 100644 --- a/docs/pt-br/compile.md +++ b/docs/pt-br/compile.md @@ -33,7 +33,7 @@ Alternativamente, você pode compilar o PHP a partir do código-fonte com as opções necessárias para o FrankenPHP seguindo estes passos. Primeiro, [obtenha o código-fonte do PHP](https://www.php.net/downloads.php) e -extraia-os: +extraia-o: ```console tar xf php-* diff --git a/docs/pt-br/config.md b/docs/pt-br/config.md index 23a239d699..a05b00f648 100644 --- a/docs/pt-br/config.md +++ b/docs/pt-br/config.md @@ -315,7 +315,7 @@ Se você quiser usar HTTPS com o endereço IP `127.0.0.1` em vez do nome de host Ao usar HTTP/1.x, pode ser desejável habilitar o modo full-duplex para permitir a gravação de uma resposta antes que o corpo inteiro tenha sido lido. (por exemplo: [Mercure](mercure.md), WebSocket, Server-Sent Events, etc.) -Esta é uma configuração de adesão que precisa ser adicionada às opções globais no `Caddyfile`: +Esta é uma configuração opcional que precisa ser adicionada às opções globais no `Caddyfile`: ```caddyfile { diff --git a/docs/pt-br/extension-workers.md b/docs/pt-br/extension-workers.md index bb6623de95..e2577311ac 100644 --- a/docs/pt-br/extension-workers.md +++ b/docs/pt-br/extension-workers.md @@ -37,9 +37,9 @@ func init() { Se você planeja compartilhar sua extensão (como uma fila genérica ou um listener de eventos), você deve encapsulá-la em um módulo Caddy. Isso permite que os usuários configurem o caminho do script e a contagem de threads através do seu `Caddyfile`. Isso exige a implementação da interface `caddy.Provisioner` e a análise do Caddyfile ([veja um exemplo](https://github.com/dunglas/frankenphp-queue/blob/989120d394d66dd6c8e2101cac73dd622fade334/caddy.go)). -### Em uma Aplicação Go Pura (Embedagem) +### Em uma Aplicação Go Pura (Incorporação) -Se você está [embedando o FrankenPHP em uma aplicação Go padrão sem caddy](https://pkg.go.dev/github.com/dunglas/frankenphp#example-ServeHTTP), você pode registrar workers de extensão usando `frankenphp.WithExtensionWorkers` ao inicializar as opções. +Se você está [incorporando o FrankenPHP em uma aplicação Go padrão sem caddy](https://pkg.go.dev/github.com/dunglas/frankenphp#example-ServeHTTP), você pode registrar workers de extensão usando `frankenphp.WithExtensionWorkers` ao inicializar as opções. ## Interagindo com Workers diff --git a/docs/pt-br/extensions.md b/docs/pt-br/extensions.md index d7c2c76669..880c7833cb 100644 --- a/docs/pt-br/extensions.md +++ b/docs/pt-br/extensions.md @@ -68,7 +68,7 @@ go mod init github.com// O segundo passo é [obter o código-fonte do PHP](https://www.php.net/downloads.php) para os próximos passos. -Depois de obtê-los, descompacte-os no diretório de sua escolha, não dentro do +Depois de obtê-lo, descompacte-o no diretório de sua escolha, não dentro do seu módulo Go: ```console diff --git a/docs/pt-br/known-issues.md b/docs/pt-br/known-issues.md index cdc209c793..cc2e93587a 100644 --- a/docs/pt-br/known-issues.md +++ b/docs/pt-br/known-issues.md @@ -7,7 +7,7 @@ FrankenPHP: | Nome | Motivo | Alternativas | | ----------------------------------------------------------------------------------------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------- | -| [imap](https://www.php.net/manual/pt_BR/imap.installation.php) | Não é thread-safe | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | +| [imap](https://www.php.net/manual/imap.installation.php) | Não é thread-safe | [javanile/php-imap2](https://github.com/javanile/php-imap2), [webklex/php-imap](https://github.com/Webklex/php-imap) | | [newrelic](https://docs.newrelic.com/docs/apm/agents/php-agent/getting-started/introduction-new-relic-php/) | Não é thread-safe | - | ## Extensões PHP com falhas @@ -17,15 +17,15 @@ quando usadas com o FrankenPHP: | Nome | Problema | | ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [ext-openssl](https://www.php.net/manual/pt_BR/book.openssl.php) | Ao usar uma versão estática do FrankenPHP (compilada com a `libc` `musl`), a extensão OpenSSL pode quebrar sob cargas pesadas. Uma solução alternativa é usar uma versão vinculada dinamicamente (como a usada em imagens Docker). Esta falha está [sendo monitorada pelo PHP](https://github.com/php/php-src/issues/13648) | +| [ext-openssl](https://www.php.net/manual/book.openssl.php) | Ao usar uma versão estática do FrankenPHP (compilada com a `libc` `musl`), a extensão OpenSSL pode quebrar sob cargas pesadas. Uma solução alternativa é usar uma versão vinculada dinamicamente (como a usada em imagens Docker). Esta falha está [sendo monitorada pelo PHP](https://github.com/php/php-src/issues/13648) | ## `get_browser` A função -[`get_browser()`](https://www.php.net/manual/pt_BR/function.get-browser.php) +[`get_browser()`](https://www.php.net/manual/function.get-browser.php) parece apresentar mau desempenho após algum tempo. Uma solução alternativa é armazenar em cache (por exemplo, com -[APCu](https://www.php.net/manual/pt_BR/book.apcu.php)) os resultados por Agente +[APCu](https://www.php.net/manual/book.apcu.php)) os resultados por Agente de Usuário, pois são estáticos. ## Imagens Docker binárias independentes e baseadas em Alpine @@ -36,7 +36,7 @@ em vez de [`glibc` e similares](https://www.etalabs.net/compare_libcs.html) para manter um tamanho binário menor. Isso pode levar a alguns problemas de compatibilidade. Em particular, o sinalizador glob `GLOB_BRACE` -[não está disponível](https://www.php.net/manual/pt_BR/function.glob.php) +[não está disponível](https://www.php.net/manual/function.glob.php). ## Usando `https://127.0.0.1` com o Docker @@ -160,7 +160,7 @@ Como o binário estático não empacota certificados TLS, você precisa apontar OpenSSL para a instalação local de certificados de CA. Inspecione a saída de -[`openssl_get_cert_locations()`](https://www.php.net/manual/pt_BR/function.openssl-get-cert-locations.php), +[`openssl_get_cert_locations()`](https://www.php.net/manual/function.openssl-get-cert-locations.php), para descobrir onde os certificados de CA devem ser instalados e armazene-os neste local. diff --git a/docs/pt-br/laravel.md b/docs/pt-br/laravel.md index 05205c53a4..47db51d3e6 100644 --- a/docs/pt-br/laravel.md +++ b/docs/pt-br/laravel.md @@ -81,7 +81,7 @@ O comando `octane:frankenphp` pode receber as seguintes opções: - `--https`: Habilita HTTPS, HTTP/2 e HTTP/3 e gera e renova certificados automaticamente; - `--http-redirect`: Habilita o redirecionamento de HTTP para HTTPS (somente -- habilitado se `--https` for passada); + habilitado se `--https` for passada); - `--watch`: Recarrega o servidor automaticamente quando a aplicação é modificada; - `--poll`: Usa o polling do sistema de arquivos durante a verificação para diff --git a/docs/pt-br/performance.md b/docs/pt-br/performance.md index feb1515616..a272d38987 100644 --- a/docs/pt-br/performance.md +++ b/docs/pt-br/performance.md @@ -41,7 +41,7 @@ seu `php.ini`. Se não for possível fazer isso, Lembre-se de que `auto` pode subestimar bastante o número de threads necessárias. `max_threads` é semelhante ao -[pm.max_children](https://www.php.net/manual/pt_BR/install.fpm.configuration.php#pm.max-children) +[pm.max_children](https://www.php.net/manual/install.fpm.configuration.php#pm.max-children) do PHP FPM. A principal diferença é que o FrankenPHP usa threads em vez de processos e as delega automaticamente entre diferentes worker scripts e o 'classic mode', @@ -208,14 +208,14 @@ FrankenPHP. Em particular: -- Verifique se o [OPcache](https://www.php.net/manual/pt_BR/book.opcache.php) +- Verifique se o [OPcache](https://www.php.net/manual/book.opcache.php) está instalado, habilitado e configurado corretamente; - Habilite as [otimizações do carregador automático do Composer](https://getcomposer.org/doc/articles/autoloader-optimization.md); - Certifique-se de que o cache do `realpath` seja grande o suficiente para as necessidades da sua aplicação; - Use - [pré-carregamento](https://www.php.net/manual/pt_BR/opcache.preloading.php). + [pré-carregamento](https://www.php.net/manual/opcache.preloading.php). Para mais detalhes, leia [a entrada dedicada na documentação do Symfony](https://symfony.com/doc/current/performance.html) diff --git a/docs/pt-br/worker.md b/docs/pt-br/worker.md index 1f9377f2e5..079667343f 100644 --- a/docs/pt-br/worker.md +++ b/docs/pt-br/worker.md @@ -163,7 +163,7 @@ frankenphp { ## Comportamento das Superglobais -As [superglobais do PHP](https://www.php.net/manual/pt_BR/language.variables.superglobals.php) (`$_SERVER`, `$_ENV`, `$_GET`...) se comportam da seguinte maneira: +As [superglobais do PHP](https://www.php.net/manual/language.variables.superglobals.php) (`$_SERVER`, `$_ENV`, `$_GET`...) se comportam da seguinte maneira: - antes da primeira chamada para `frankenphp_handle_request()`, as superglobais contêm valores vinculados ao próprio worker script. - durante e após a chamada para `frankenphp_handle_request()`, as superglobais contêm valores gerados a partir da requisição HTTP processada. Cada chamada para `frankenphp_handle_request()` altera os valores das superglobais. diff --git a/docs/static.md b/docs/static.md index 635a6d8b0b..bb23cb8234 100644 --- a/docs/static.md +++ b/docs/static.md @@ -47,7 +47,7 @@ docker buildx bake --load static-builder-gnu docker cp $(docker create --name static-builder-gnu dunglas/frankenphp:static-builder-gnu):/go/src/app/dist/frankenphp-linux-$(uname -m) frankenphp ; docker rm static-builder-gnu ``` -This binary supports all glibc versions 2.17 and superior but does not run on musl-based systems (like Alpine Linux). +This binary supports all glibc versions 2.17 and higher but does not run on musl-based systems (like Alpine Linux). The resulting mostly static (except `glibc`) binary is named `frankenphp` and is available in the current directory. diff --git a/docs/worker.md b/docs/worker.md index b299ed3782..64f278519c 100644 --- a/docs/worker.md +++ b/docs/worker.md @@ -117,7 +117,7 @@ docker run \ ### Restart the worker after a certain number of requests -As PHP was not originally designed for long-running processes, there are still many libraries and legacy codes that leak memory. +As PHP was not originally designed for long-running processes, many libraries and legacy code still leak memory. A workaround to using this type of code in worker mode is to restart the worker script after processing a certain number of requests: The previous worker snippet allows configuring a maximum number of requests to handle by setting an environment variable named `MAX_REQUESTS`.