Aumento de memoria en ciertas rutas en Drupal

RAM
Solucionex
12
Abr 24

El módulo memory_limit_policy permite aumentar la memoria de php de manera configurable (por ejemplo, por ruta, por path, por rol...). Puede verse cómo se usa aquí. Está muy bien, pero exige instalar varios módulos.

Para un caso de uso más sencillo (proyecto propio en el que solamente se necesita aumentar la memoria en ciertas rutas conocidas que pueden necesitarlo), puede usarse solamente un pequeño trozo de código derviado del módulo original (ejemplo para 10.2+):

Nota: se sobreentiende que ya se tiene creado un módulo custom "mymodule" (cambiar por el nombre que corresponda).

# mymodule.services.yml
services:
  _defaults:
    autowire: true
    autoconfigure: true
   
  memory_increase.subscriber:
    class: Drupal\mymodule\EventSubscriber\MemoryIncreaseSubscriber

 

<?php

// mymodule/src/EventSubscriber/MemoryIncreaseSubscriber.php

declare(strict_types=1);

namespace Drupal\mymodule\EventSubscriber;

use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Site\Settings;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

/**
 * Class to increase memory limit in specific routes.
 */
class MemoryIncreaseSubscriber implements EventSubscriberInterface {

  public function __construct(
    protected RouteMatchInterface $currentRoute,
    protected Settings $settings,
  ) {
  }
 
  /**
   * {@inheritdoc}
   */
  public function onRequest(RequestEvent $event) {
    $routes = $this->settings->get('increase_memory_routes', []);
    if (!in_array($this->currentRoute->getRouteName(), $routes)) {
      return;
    }
    ini_set('memory_limit', '512M');
  }
 
  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    // High priority for this subscriber to execute it soon enough.
    $events[KernelEvents::REQUEST][] = ['onRequest', -1];
    return $events;
  }
 
}

Solamente faltaría añadir en el archivo settings.php las rutas en las que se quiere incrementar la memoria:

// settings.php
$settings['increase_memory_routes'] = [
  // Imágenes derivadas
  'image.style_private',
  'image.style_public',
  // Página de permisos general (aunque aquí el problema puede darse al guardar si hay muchos permisos y roles por el límite de inputs)
  'user.admin_permissions',
  // Página de sincornización de configuración
  'config.sync',
];

Imagen de Paxson Woelber de Unsplash

Desarrollo