From 1097b2df00bda5a70f6312e1641257515f06bc25 Mon Sep 17 00:00:00 2001 From: Soporte ZH Consultores Date: Fri, 17 Jul 2026 11:06:24 -0500 Subject: [PATCH] =?UTF-8?q?docs(readme):=20patr=C3=B3n=20de=20sesiones=20P?= =?UTF-8?q?HP=20con=20read=5Fand=5Fclose?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Documenta el fix de 1bfb3fb en la sección "Patrones de código" para que futuros contribuyentes no escriban a $_SESSION sin llamar startSession(true), lo cual perdería el write en silencio. --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index a34dbf2..b562092 100644 --- a/README.md +++ b/README.md @@ -308,6 +308,13 @@ Resto → creador, o abogado solicitante (match por users.name = t.abogado ### FK `user_id` en hours/obs Tanto `tramites_hours` como `tramites_obs` tienen `abogado VARCHAR(100)` (display) **y** `user_id INT NULL` (FK canónica `ON DELETE SET NULL`). Esto evita que renombrar un usuario en el Panel de Control desconecte sus entradas históricas de los filtros. Si lo borras, `user_id` queda NULL y el string `abogado` permanece como historia. +### Sesiones PHP: `Auth::startSession($forWrite = false)` +`session_start()` por defecto toma un `flock()` exclusivo sobre el archivo de sesión que dura **todo el request**. Con polling en `/escrituras/` cada 15 s + varias pestañas abiertas del mismo usuario, los requests se serializan esperando el lock y agotan el pool de php-fpm. + +Por eso `Auth::startSession()` usa `session_start(['read_and_close' => true])` por defecto: carga `$_SESSION` en memoria y libera el lock de inmediato. Todos los `Auth::requireAuth()` / `isAuthenticated()` / `user()` funcionan con esta snapshot. + +**Regla al agregar código nuevo:** si vas a escribir a `$_SESSION[...] = ...` o `unset($_SESSION[...])`, debes hacerlo dentro de un método que llame `self::startSession(true)` para tomar el lock exclusivo real. Si no, el write ocurre en memoria pero **no se persiste al archivo** al final del request. Los 5 flujos que ya lo hacen: `buildLoginUrl`, `completeLogin`, `logout`, `popReturnTo`, `checkState`. + --- ## Identidad visual