FrankenPHP 1.13.0 se publicó el 4 de octubre a las 14:01. Después de v1.12.7, esta versión incorpora Caddy 2.11.7 y Mercure 1.0. También añade compatibilidad con PHP 8.6 y actualiza a Go 1.27.
Se corrigen cinco problemas de seguridad. En Windows, la resolución de `SCRIPT_FILENAME` ya no puede salir de la raíz de documentos. El fallo está identificado como GHSA-868c-7h7m-mmj9. Caddy 2.11.7 descarta por defecto los nombres de cabecera con puntos. Esto cierra una vía de suplantación por la que PHP convierte `Foo.Bar` en `HTTP_FOO_BAR`, igual que `Foo-Bar`. La corrección corresponde a GHSA-qcrp-8483-f2f2. La división de rutas CGI exige ahora un límite entre segmentos. `/uploads/a.php.txt/b.php` ya no puede ejecutar `uploads/a.php`, según GHSA-xxjp-cjxr-2x6m. `putenv()` dejó de modificar el entorno del sistema compartido por el proceso, por lo que los valores no pasan entre peticiones y threads. Este cambio está asociado a GHSA-996f-w38m-f574. Un array manipulado entregado a `frankenphp_log()` ya no puede tumbar todo el proceso del servidor. El identificador es GHSA-4prg-hv4r-g6mv.
Caddy 2.11.7 reúne los cambios de Caddy 2.11.6 y 2.11.7. La protección contra Slowloris reinicia los tiempos de espera de lectura y escritura cuando una operación termina correctamente. La directiva `timeouts` permite ajustarlos por ruta. El matcher `url_pattern` sigue el estándar web URLPattern. Admite grupos con nombre, comodines y expresiones regulares, y expone los grupos capturados como placeholders.
La cabecera `Incremental: ?1` de RFC 10036 ordena a `reverse_proxy` y `encode` transmitir las respuestas de inmediato. Los Server-Sent Events detrás de `encode` ya no se almacenan en búfer, algo que beneficia a Mercure. El apagado ordenado espera a los servidores de configuraciones anteriores. Las respuestas de larga duración pueden continuar durante una recarga.
La opción global `tls_automate_names` gestiona certificados para nombres que no tienen un bloque de sitio. La búsqueda de certificados durante el handshake TLS es aproximadamente dos veces más rápida y usa 10 asignaciones, frente a 15. El proxy inverso vacía correctamente las respuestas parciales y propaga el half-close de TCP en streams actualizados. Las comprobaciones de salud activas quedan aisladas por configuración. `expected_underscore_headers` y `expected_dot_headers` permiten conservar cabeceras concretas que Caddy descartaría.
Mercure 1.0 modifica `mercure_publish()`. La función lanza un `ValueError` si la actualización usa un topic del espacio de nombres reservado `/.well-known/mercure`, un identificador que empieza por `#`, caracteres de control, UTF-8 no válido, un valor de retry negativo o ningún topic. Si falla el envío, se produce una `RuntimeException` con el mensaje del hub. El nuevo bloque `issuer` vincula las claves de publicadores y suscriptores a un emisor de confianza. El Caddyfile de ejemplo y `php-server --mercure` usan esta configuración.
La actualización cambia varias reglas. `num_threads` cuenta ahora los threads disponibles para peticiones que ningún worker atiende. Los threads de los workers se suman aparte. Una configuración con workers puede iniciar por ello más threads que antes. El arranque falla si `max_threads` es menor que `num_threads` más los threads de workers, y el error muestra los tres valores. Los valores predeterminados no cambian.
Configurar `publisher_jwt` o `subscriber_jwt` sin `protocol_version_compatibility` es ahora un error. Las configuraciones de Mercure deben usar el bloque `issuer`. Durante el hot reload, `$_SERVER['FRANKENPHP_HOT_RELOAD']` anuncia ahora `/.well-known/mercure?match=<topic>`. Las URL fijas con `?topic=` deben actualizarse.
Caddy limita por defecto las cabeceras de petición a 16 KiB. `max_header_size` permite elevar el límite. Las lecturas y escrituras bloqueadas se cancelan después de un minuto. Las cabeceras con puntos se descartan igual que las que contienen guiones bajos. El `client_auth` de un sitio wildcard ya no se aplica a sitios más específicos. También se rechazan otras configuraciones inválidas. Una compilación de PHP sin `--disable-zend-signals` (ZTS) hace que FrankenPHP termine con un error explícito. Antes podía quedarse bloqueado mientras crecía el consumo de memoria.
La versión expone una API de threads para extensiones PHP escritas en Go. Incluye `Thread(index)`, `PHPThread.Pin()`, `PHPThread.IsRequestDone()` y la función C `frankenphp_thread_index()`. Las configuraciones se validan antes de sustituir la configuración activa. Se rechazan archivos de worker inexistentes, nombres de worker duplicados y presupuestos de threads incoherentes, mientras la configuración actual sigue atendiendo peticiones. Los usuarios de la biblioteca pueden llamar a `frankenphp.Validate()`.
Los registros de arranque muestran ahora `total_threads` y `worker_threads`. Los reinicios de la memoria compartida de Opcache se registran y se contabilizan mediante la métrica experimental `frankenphp_opcache_restarts{reason}` en PHP 8.4 y posteriores. Esos reinicios no son seguros con ZTS, por lo que el contador debe permanecer en cero. Los bloques `php_server` se reflejan en el lado de FrankenPHP. `phpinfo()` incorpora una sección de FrankenPHP con la versión de Caddy. El código Go puede añadir filas mediante `frankenphp.AddPHPInfoEntry()`.
Desde PHP 8.5, `php-cli` utiliza la SAPI CLI integrada de PHP. La compatibilidad con PHP 8.6 también forma parte de esta versión.
Las peticiones que llegan antes de que estén listos los threads normales ya no se quedan bloqueadas. Esto evita respuestas 499 y 504 aleatorias después de iniciar un contenedor. Los fallos de los workers se registran con nivel warning y estado de salida. Los reinicios limpios siguen usando el nivel debug. `Shutdown()` ya no espera indefinidamente a un worker que abandonó el arranque después de alcanzar `max_consecutive_failures`.
Las compilaciones estáticas ya no convierten fallos de Go recuperables de la extensión parallel incluida en cierres del proceso. Se corrige un posible use-after-free del array de extensiones retenido por `register_extensions`. `extgen` ya admite parámetros agrupados y nullable, callables, valores de retorno mixed, wrappers de métodos, constantes y literales enteros en las extensiones generadas.
La documentación enumera ahora los ajustes del motor de ejecución que persisten entre peticiones en modo worker, como `ini_set()`, `stream_context_set_default()`, `date_default_timezone_set()` y `chdir()`. También documenta las diferencias del filtrado de peticiones HTTP, amplía la guía de métricas, añade una página para Yii 3, corrige la URL CDN de Idiomorph en el ejemplo de hot reload e incorpora traducciones turcas que faltaban. johanjanssens, luminalpark, KalimeroMK y quyt0 contribuyeron por primera vez en esta versión.




Comentarios
Aún no hay comentarios — escribe el primero.
Inicia la conversación
Sin cuenta ni contraseña — introduce tu correo y te enviamos un enlace de acceso de un solo uso. ¿Primera vez? Todo se configura automáticamente.
Tu valoración se aplicará automáticamente al iniciar sesión.
Revisa tu bandeja de entrada
Hemos enviado un enlace de acceso a …. Ábrelo en este dispositivo — esta pestaña te conectará automáticamente.
¿No llega nada? Mira en la carpeta de spam — y marca el correo como «No es spam» para que la próxima vez llegue directo.