[RESOLU] Bdd en methode static devient asynchrone

Petit nouveau ! | 2 Messages

18 févr. 2021, 08:35

Bonjour,
J'ai récemment modifier mon accès à ma base de données.
Avant je faisait de include vers un .php qui contenait une variable $bdd, permettant de se connecter.
J'ai changé cela vers une classe abstraite et des méthodes static permettant de se connecter.
Ça marche bien, lorsque j'ai besoin de me connecter après un ajax (par exemple), je fais un :

Code : Tout sélectionner

$dbb = Database::getPDO()
Mais mon problème est étrange (je suis débutant en php et POO).
J'ai dans mon application des créations de fichier excel, coté serveur, qui peuvent prendre du temps à être crée (lié à des requêtes assez longue).
Avant lorsque je lançais via ajax mon fichier .php (réalisant le fichier excel), je voyais le status 'waiting', mais je pouvais naviguer sur mon application, en attendant que la réponse soit 200 (et m'envoyait le .xlsx).
Maintenant, le serveur attendant la réponse 200 avant de répondre à d'autre demande, ce qui bloque la page.
Comme une forme d'asynchrone.

J'ai fait un singleton mais pareil.
En créant une nouvelle class

Code : Tout sélectionner

Database222::getPDO()
[/code], il accepte la navigation.
J'ai essayé en faisant des instances (plus de static ni abstract class), mais pas de changement.

Voici ma class :

Code : Tout sélectionner

abstract class Database { private static $instance = null; private static $PDOPass = 'XXXXXXX'; public static function getPDO() { session_status() == PHP_SESSION_NONE ? session_start() : null; if (self::$instance == null) { try { self::$instance = new PDO('pgsql:host=localhost;dbname=XXXXXXX', $_SESSION["role"], self::$PDOPass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } }; return self::$instance; } }
Merci beaucoup à toute la communauté :) et en espérant avoir été clair.

Petit nouveau ! | 2 Messages

19 févr. 2021, 13:18

J'ai trouvé la solution.

Ce n'est pas lié à la classe ou à la méthode mais au start_session().
Il a un comportement qui rend les fonctions synchrones.
La solution est d'ouvrir la session et de la refermer directement après.
solution :

Code : Tout sélectionner

session_start([ 'read_and_close' => true,]);
Pour les intéressés:
https://ma.ttias.be/php-session-locking ... -requests/