Lenteur objets métiers en PHP

SOLVED

Bonjour,

Je me permets de poser ma question sur ce forum en espérant avoir un petit coup de main. 

Je développe des outils avec les objets métiers pour automatiser certaines tâches dans notre société, notamment l'import des commandes depuis notre site ecommerce.

Je travaille en langage PHP, sur un serveur vituel WampServer installé sur mon poste. J'ai créé des virtual host par exemple "h-t-t-p://outils.web" . Nous avons paramétré certains ordinateurs du réseau interne (via fichier hosts dans /system32) afin qu'ils ait accès à ces outils en tapant le virtual host dans leur navigateur internet. Cette solution nous permets d'actualiser les outils et développement seulement sur mon poste, et les rendre instantanément accessibles sur tous les postes paramétrés, sans avoir besoin d'installation ou mise à jour supplémentaire.  

Jusque là je développais avec le kit Odbc fourni par sage, et tout fonctionnait parfaitement, et rapidement. Sans avoir besoin de toucher aux services de WampServer.

Nous sommes passé aux objets métiers, car nous devons migrer notre version de sage (actuellement version 7.00) vers une version plus récente, et le kit odbc ne sera plus disponible. J'ai donc traduit tous les outils en langage objetMetier.

Lorsque j'exécute mon script (par exemple : "h-t-t-p://outils.web/monscript.php"), la connexion aux bases se fait bien, mes outils fonctionnent nikel (je les ai testé sur une base test), avec un temps d'exécution similaire au kit odbc.

Mais lorsque je souhaite les exécuter une seconde fois (soit le même script, soit un script différent mais utilisant toujours les objets métiers) alors le script mouline dans le vide. Si je redémarre les services de WampServer, alors le script refonctionne parfaitement.

Après plusieurs tests, il semble que ce soit la connexion aux bases qui mouline, comme si à la première exécution d'un script objetmétier, une connexion restait ouverte en cache et empêchait toute nouvelle connexion. Le redémarrage des services détruit très certainement ce cache ou cette connexion résiduelle, ce qui explique que les outils refonctionnent ensuite. 

Pourtant je clôture chaque script en détruisant les variables objets, en fermant les connexions aux bases compta et commerciale et en détruisant les variables objets de ces-dites connexions. 

Exemple d'un de mes codes de fermeture en fin de ce message. 

Pourriez vous m'aider à trouver d'où vient ce problème de fonctionnement ? Car j'aimerai que l'on puisse utiliser ces outils sans avoir besoin de redémarrer WampServer après chaque utilisation. Nous sommes 3 postes à devoir les utiliser et je ne peux pas redémarrer à chaque fois que l'un de nous utilise un des outils. J'ai vraiment cherché partout sur le net, sur ce forum. Mais malheureusement nous sommes très peu à utiliser PHP, et donc très peu d'aide. J'espère avoir donné toutes les infos pour vous permettre de comprendre le problème et peut-être de m'aider à trouver la solution.

D'avance je vous remercie pour votre temps.

Cordialement

Valerie

PS : au passage (et totalement hors sujet), y a t-il des dates prochainement pour une formation objets metiers ?

 Exemple de code de fermeture d'un des scripts outils : 

------->

/* KILL DES VARIABLES OBJETS UTILISEES DANS LE CODE
--------------------------------------------------------*/
/* Dans l'ordre d'imbrication des objets */

$objet_articleTarifQteCategorie = null;
unset($objet_articleTarifQteCategorie);

$objet_articleTarifCategorie = null;
unset($objet_articleTarifCategorie);

$objet_listeArticleTarifCategorie = null;
unset($objet_listeArticleTarifCategorie);

$objet_famille = null;
unset($objet_famille);

$objet_article = null;
unset($objet_article);

echo "<p class='ok'>Variables objets detruites</p>";


/* FERMETURE BASES OBJETS METIER
--------------------------------------------------------*/
try{
$baseCial->Close();
$baseCial = null;
unset($baseCial);
echo "<p class='ok'>Base commerciale fermee</p>";
$rapport .= "Base commerciale fermée";
} catch(Exception $e) {
echo "<p class='error'>Erreur lors de la fermeture de la base de donnees Commerciale (Ligne : ".$e->getLine().")<br />".$e->getMessage()."</p>";
}

try{
$baseCompta->Close();
$baseCompta = null;
unset($baseCompta);
echo "<p class='ok'>Base compta fermee</p>";
$rapport .= "Base compta fermée";
} catch (Exception $e) {
echo "<p class='error'>Erreur lors de la fermeture de la base de donnees Compta (Ligne : ".$e->getLine().")<br />".$e->getMessage()."</p>";
}

/* Check objet detruits
*/
if(!isset($baseCial) && !isset($baseCompta)){
echo "<p class='ok'>Les deux constantes BASES sont fermées.</p>";
}else{
echo "<p class='error'>Les constantes BASE sont encore actives.</p>";
}

  • 0
    SUGGESTED

    Bonjour,

    je ne développe malheureusement pas en PHP mais la connexion OM (en VB.NET) reste "active" tout le long de mes traitements sans problématique particulière.
    Une fois le traitement d'import terminé, je fais un .Close() sur ma connexion OM, ce qu'à priori, vous faites également.

    En revanche, si je peux me permettre une petite remarque au passage : WAMP n'est pas fait pour être dans un milieu de production, il s'agit d'une plateforme de développement. Je ne peux que vous conseiller, à terme, de mettre en place un serveur IIS pour faire tourner votre développement.

    Cordialement,

    Julien.

  • 0 in reply to Julien WOLFF

    Merci pour votre réponse rapide.

    Et oui malheureusement, je ne vois pas beaucoup de monde développer en php... Je fais effectivement mon .Close  sur les objets connexion en fin de script. Je ne comprends pas ce qui empêche la nouvelle exécution du script.

    Pour ce qui est de WampServer, j'avoue que nous avons une toute petite structure, donc jusque là, je ne voyais pas trop de contrindication. Mais on y viendra sans doute au serveur IIS.

    En revanche avant celà, il serait bon que je règle le problème. Si aucune solution il ne servira sans doute à rien de perdre du temps à installer un serveur IIS (sans certitude que ça solutionne l'affaire). Mais je me verrai plutot contrainte de revoir le langage des outils ( VB.net par exemple), mais ça représente un investissement (temps , formation, refonte et traduction des scripts) non négligeable.

    Cordialement

    Valerie

  • Bonjour ,

    Faites-nous savoir si la réponse de Julien a été utile en la marquant comme vérifiée .

    Pour cela, cliquez sur  la ligne ‘Vérifier la réponse’.

    Cela aura pour effet de marquer la réponse en vert et de permettre aux autres membres de la communauté, ou aux personnes qui auraient également le besoin de voir que cela a fonctionné.

    Merci d'avoir utilisé la communauté.

    Yannick

  • +1 in reply to BOUVET
    verified answer

    Bien entendu, je comprends pour IIS.

    Concernant votre connexion, avez-vous essayé de regarder dans SQL Server Management Studio de voir si vous voyez une trace de connexion résiduelle ?

    -> via le Moniteur d'activité - Processus

    -> Requête SQL sur MASTER..SYSPROCESSES

    -> Requête SQL sur la table cbUserSession de votre base Sage

    Autre point, pouvez-vous vérifier les valeurs du champ CB_Mono dans la table cbSysTable de votre base Sage ?
    Est-ce que la valeur est bien à 0 partout ?

    Les formations OM sont en générales décrites en C#.NET ou VB.NET.
    Pour les prochaines formations, rendez-vous sur le site Sage University :


    Cordialement,

    Julien.

  • Bonjour, la réponse bien qu'utile dans la réflexion (utiliser WampServer seulement en dev, et passer par un serveur IIS en prod), ne résout pas le problème (objet connexion aux base, en php, qui semble rester en mémoire). 

    Puis-je attendre d'autres pistes de réponses ? Ou dois-je tout de même passer la réponse en "validé" ?

    Cordialement

    Valerie

  • Bonjour,

    Le fait de passer la réponse en vérifiée permet aux autres membres de la communauté de voir que cela a fonctionné ou bien qu'un élément de réponse pouvant les aider a été apporté.

    Cela n'empêche en aucun cas d'autres réponses de la part de la communauté.

    A bientôt 

    Yannick

  • 0 in reply to Julien WOLFF

    Merci pour les infos en plus. 

    Après recherche : 

    -> via le Moniteur d'activité - Processus : compliqué à vérifier, sur ma machine (ou est installé WampServer), il y a des processus en cours d'exe, mais normal car wampserver est en marche. Idem sur le serveur où est installé sage, il y a des processus sql, mais logique car le serveur est en fonctionnement.

    -> Requête SQL sur la table cbUserSession de votre base Sage :table vide.

    ->Vérifier les valeurs du champ CB_Mono dans la table cbSysTable de votre base Sage : oui cette valeur est bien à 0 partout.

    -> Requête SQL sur MASTER..SYSPROCESSES : il y a une effectivement ligne avec mon login machine (nt_username) . Pour cette ligne, le champs hostname et le champs program_name sont null. Status : sleeping. 

    J'ai donc fait plusieurs tests :
    - redémarrage des services wampserver : la ligne a disparut.
    - je lance le script php d'objets metiers : 2 lignes avec mon nt_username apparaissent : l'une avec progame_name null, l'autre avec program_name "Objet Metier".
    - j'attends un peu : la ligne avec le champs program_name Objet Metier disparait, mais celle avec program_name vide reste. Elle ne disparaitra que si je redémarre les services WampServer.

    Est-ce que ça peut venir de là ?

    Cordialement

    Valérie

  • 0 in reply to BOUVET

    J'ai récemment eu un problème pour relancer un traitement en VB.NET après l'avoir exécuté 1 fois.
    Il s'avère que je fermais la connexion OM_Gescom en fin de traitement.
    Et ma fonction d'ouverture de connexion OM_Gescom était en amont (au moment du lancement du programme).De ce fait, en relançant le traitement sans quitter l'application, la connexion OM_Gescom était fermée et le traitement plantait.

    Au démarrage du traitement, contrôlez si votre objet OM_Gescom n'est pas ouvert, et s'il ne l'est pas, ouvrez à nouveau la connexion. idem pour la connexion OM_Compta.