tutorial restful query illuminate framework app php mysql orm eloquent slim

php - restful - demasiadas conexiones utilizando orm y mysql elocuentes



slim framework tutorial (1)

Estoy usando SLIM Framework con el Eloquent ORM de Laravel para API REST. Recientemente me enfrenté a un problema de too many connections .

Durante un URI de solicitud, necesito hacer varias llamadas a Get y Set a mySql DB. Esto abre conexiones en cada transacción DB que realizo. Quiero evitar eso. En este momento, el grupo de conexiones mysql tiene 200 hilos.

Se espera que mi API tenga más de 1000 llamadas simultáneas y con el entorno actual, el 40% de las llamadas fallará (probado con jMeter).

Mi idea es que para una llamada API, mi aplicación debe usar solo un hilo de conexión y aumentar el grupo de conexiones MySql a alrededor de 1000 a 1500. ¿Es este un mal enfoque?

Con Eloquent ORM, tengo mi conexión DB administrada por Capsule. ¿Debo hacer la primera conexión usando el método de Singleton y para cualquier llamada posterior en la solicitud de API, se debe usar el mismo subproceso?

Aquí está mi administrador de conexión de base de datos:

use Illuminate/Database/Capsule/Manager as Capsule; /** * Configure the database and boot Eloquent */ $capsule = new Capsule; $capsule->addConnection($databaseConfig[''mysql'']); // Set the event dispatcher used by Eloquent models... (optional) use Illuminate/Events/Dispatcher; use Illuminate/Container/Container; $dispatcher = new Dispatcher(new Container); $capsule->setEventDispatcher($dispatcher); $capsule->setAsGlobal(); $capsule->bootEloquent();

¿Cuál es el mejor enfoque para salir de este problema?

ACTUALIZAR

Estoy intentando otro enfoque para hacer una conexión persistente. Pero aún así, la conexión persistente no se cierra después de que se realiza la llamada con el trabajo. Incluso llamar a DB::Disconnect no está ayudando.

<?php use Illuminate/Database/Capsule/Manager as Capsule; use Illuminate/Events/Dispatcher; use Illuminate/Container/Container; /** * Configure the database and boot Eloquent */ $app->hook(''slim.before'', function() use ($app) { try { // pr('''', $app->settings[''databaseConfig''][''mysql''], 1); /* * Register Eloquent as singleton to slim container * since we will use the same instance across the request cycle */ $app->container->singleton(''db'', function() { return new Capsule; }); $app->db->addConnection($app->settings[''databaseConfig''][''mysql'']); $dispatcher = new Dispatcher(new Container); $app->db->setEventDispatcher($dispatcher); if (isset($app->settings[''databaseConfig''][''profiler'']) && $app->settings[''databaseConfig''][''profiler'']) { $dispatcher->listen(''illuminate.query'', function($sql, $params, $time, $conn) { dd(array($sql, $params, $time, $conn)); }); } $app->db->setAsGlobal(); $app->db->bootEloquent(); } catch (PDOException $e) { /** Do some stuff to handle exception */ echoResponse(501, array(''No DB Connections'')); } });


Debe usar la misma conexión de base de datos para todas las consultas. La forma más fácil de hacerlo es conectarse a la base de datos en el Contenedor DI ya que puede volver a sacarlo cada vez que lo necesite.

Usando Slim 3, se ve algo como esto:

$container = $app->getContainer(); $container[''db''] = function ($container) { $capsule = new /Illuminate/Database/Capsule/Manager; $capsule->addConnection($container[''settings''][''db'']); $capsule->setAsGlobal(); $capsule->bootEloquent(); return $capsule; };

Ahora puede usar en una ruta invocable:

$app->get(''/list'', function ($request, $response) { $table = $this->get(''db'')->table(''table_name''); $data = $table->get(); // do something with data $response->write(print_r($data, true)); return $response; });

Los detalles completos en la documentación aquí: http://www.slimframework.com/docs/cookbook/database-eloquent.html