diff --git a/ProcessMaker/Providers/ProcessMakerServiceProvider.php b/ProcessMaker/Providers/ProcessMakerServiceProvider.php index 571eab6629..fb5cbb85bb 100644 --- a/ProcessMaker/Providers/ProcessMakerServiceProvider.php +++ b/ProcessMaker/Providers/ProcessMakerServiceProvider.php @@ -70,6 +70,9 @@ class ProcessMakerServiceProvider extends ServiceProvider // Track the landlord values for multitenancy private static $landlordValues = null; + // Cache tenant app containers to save memory + private static $tenantAppContainers = []; + public function boot(): void { // Track the start time for service providers boot @@ -261,12 +264,16 @@ private static function bootstrapTenantApp(JobProcessing|JobRetryRequested $even // Create a new tenant app instance $_SERVER['TENANT'] = $tenantId; $_ENV['TENANT'] = $tenantId; - $tenantApp = require app()->bootstrapPath('app.php'); - $tenantApp->instance('landlordValues', self::$landlordValues); - $tenantApp->make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap(); + + if (!isset(self::$tenantAppContainers[$tenantId])) { + $tenantApp = require app()->bootstrapPath('app.php'); + $tenantApp->instance('landlordValues', self::$landlordValues); + $tenantApp->make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap(); + self::$tenantAppContainers[$tenantId] = $tenantApp; + } // Change the job's app service container to the tenant app - $event->job->getRedisQueue()->setContainer($tenantApp); + $event->job->getRedisQueue()->setContainer(self::$tenantAppContainers[$tenantId]); } } diff --git a/config/horizon.php b/config/horizon.php index 7b1a5f8d87..af57f786e1 100644 --- a/config/horizon.php +++ b/config/horizon.php @@ -127,7 +127,7 @@ | */ - 'memory_limit' => 256, + 'memory_limit' => env('PM4_HORIZON_WORKER_MEMORY_LIMIT', 512), /* |-------------------------------------------------------------------------- @@ -151,6 +151,7 @@ 'sleep' => intval(env('BPMN_QUEUE_INTERVAL', 3000)) * 0.001, 'minProcesses' => env('PM4_HORIZON_SUPERVISOR_BPMN_MIN_PROCESSES', 1), 'maxProcesses' => env('PM4_HORIZON_SUPERVISOR_BPMN_MAX_PROCESSES', 1), + 'memory' => env('PM4_HORIZON_WORKER_MEMORY_LIMIT', 512), ], 'supervisor-1' => [ 'connection' => 'redis', @@ -160,6 +161,7 @@ 'timeout' => env('PM4_HORIZON_SUPERVISOR_1_TIMEOUT', 600), 'minProcesses' => env('PM4_HORIZON_SUPERVISOR_1_MIN_PROCESSES', 1), 'maxProcesses' => env('PM4_HORIZON_SUPERVISOR_1_MAX_PROCESSES', 1), + 'memory' => env('PM4_HORIZON_WORKER_MEMORY_LIMIT', 512), ], ], @@ -173,6 +175,7 @@ 'sleep' => intval(env('BPMN_QUEUE_INTERVAL', 3000)) * 0.001, 'minProcesses' => env('PM4_HORIZON_SUPERVISOR_BPMN_MIN_PROCESSES', 1), 'maxProcesses' => env('PM4_HORIZON_SUPERVISOR_BPMN_MAX_PROCESSES', 1), + 'memory' => env('PM4_HORIZON_WORKER_MEMORY_LIMIT', 512), ], 'supervisor-1' => [ 'connection' => 'redis', @@ -182,6 +185,7 @@ 'timeout' => env('PM4_HORIZON_SUPERVISOR_1_TIMEOUT', 600), 'minProcesses' => env('PM4_HORIZON_SUPERVISOR_1_MIN_PROCESSES', 1), 'maxProcesses' => env('PM4_HORIZON_SUPERVISOR_1_MAX_PROCESSES', 1), + 'memory' => env('PM4_HORIZON_WORKER_MEMORY_LIMIT', 512), ], ], @@ -195,6 +199,7 @@ 'sleep' => intval(env('BPMN_QUEUE_INTERVAL', 3000)) * 0.001, 'minProcesses' => env('PM4_HORIZON_SUPERVISOR_BPMN_MIN_PROCESSES', 1), 'maxProcesses' => env('PM4_HORIZON_SUPERVISOR_BPMN_MAX_PROCESSES', 1), + 'memory' => env('PM4_HORIZON_WORKER_MEMORY_LIMIT', 512), ], 'supervisor-1' => [ 'connection' => 'redis', @@ -204,6 +209,7 @@ 'timeout' => env('PM4_HORIZON_SUPERVISOR_1_TIMEOUT', 600), 'minProcesses' => env('PM4_HORIZON_SUPERVISOR_1_MIN_PROCESSES', 1), 'maxProcesses' => env('PM4_HORIZON_SUPERVISOR_1_MAX_PROCESSES', 1), + 'memory' => env('PM4_HORIZON_WORKER_MEMORY_LIMIT', 512), ], ], ],