Juampe Ruiz

Volver

Cómo manejar las sesiones en CodeIgniter 4 y mantener optimizado el servidor

En CodeIgniter con cada petición HTTP se genera una nueva cookie de sesión en la carpeta writable/session y como el Garbage Collector casi nunca funciona o el servidor no está configurado de manera óptima acaban acumulándose miles de estos archivos obsoletos y que hacen más pesado el proyecto. Te propongo una solución que me funciona perfectamente en varios servidores diferentes.

CodeIgniter

🛠️ Archivo .env de configuración

En CodeIgniter, se puede editar directamente el archivo App/Config/Session.php pero es recomendable hacerlo en el archivo .env de configuración del proyecto. Tanto si lo hacemos en uno o en otro sitio la información referente a la sesión se podrá configurar de la siguiente forma:

session.driver = 'CodeIgniter\Session\Handlers\FileHandler'
session.cookieName = 'NombreSesion_'
session.expiration = 7200
session.timeToUpdate = 0
session.regenerateDestroy = false
session.matchIP = false

En session.cookieName pondríamos el nombre de la cookie que nos interesa. Me gusta finalizar con un guión bajo, porque a continuación se añade una cadena alfanumérica que identifica la cookie.

🔀 Routes

En el App/Config/Routes.php añadiremos la ejecución de una tarea cron que configuraremos en el servidor para ser ejecutada una vez al día, o con la frecuencia que queremos que el script elimine los archivos obsoletos de la carpeta de sesiones. En mi caso, he creado una tarea cron que he llamado Midnight porque la ejecutaré a las 00:00 del servidor.

$routes->cli('cron/midnight', 'Cron\Midnight');

🛠️ Controlador

Crearemos el siguiente controlador App/Controllers/Cron/Midnight.php que revisará la carpeta donde se almacenan las sesiones y eliminará todos los archivos exceptuando index.html que mantiene el acceso prohibido desde el exterior a dicha carpeta. Me gusta mantener ordenados los controladores, por ese motivo, lo incluiré la subcarpeta App/Controllers/Cron, ideal si el proyecto necesita más controladores de tipo cron, nos permitirá mantenerlos organizados.

A continuación, te muestro el contenido que desarollé para que se elimine el contenido de la carpeta, excepto el archivo index.html:

<?php

namespace App\Controllers\Cron;
use App\Controllers\BaseController;

class Midnight extends BaseController {

    public function index() {
        $this->clearSessionFiles();
    }

    /**
     * Script para el borrado de archivos de sesión obsoletos
     * @author Juampe Ruiz
     * @version 1.0
     */
    protected function clearSessionFiles() {

        $path = ROOTPATH . '/writable/session/';

        // Elimina todos los archivos excepto index.html usando array_filter + array_walk
        $archivos = array_filter(glob($path . '*', GLOB_NOSORT), function($archivo) {
            return is_file($archivo) && basename($archivo) !== 'index.html';
        });

        array_map('unlink', $archivos);

    }
}

Una vez creado el controlador, podemos ejecutarlo desde la terminal para probar el funcionamiento con el siguiente comando:

php public/index.php cron/midnight

También será el comando que podemos establecer en el gestor de tareas automatizadas del servidor.

📟 Extra: eliminación desde el Terminal

Si ya existen muchos archivos, y el PHP es incapaz de hacer el primer borrado debido a la falta de recursos o memoria asignada a los scripts, desde el terminal, suponiendo que es un servidor Linux, se puede ejecutar el siguiente comando dentro de la carpeta writable/session para eliminar todos los archivos excepto index.html:

find . -type f ! -name "index.html" -delete



#codeigniter #php #session

📊 14