IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[Symfony x Puppeteer] Timeout sur l'appel d'un script NodeJS via la fonction exec() dans mon controlleur.


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre averti Avatar de eddst
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 23
    Par défaut [Symfony x Puppeteer] Timeout sur l'appel d'un script NodeJS via la fonction exec() dans mon controlleur.
    Bonjour à tous,

    J'essaye en vain de transformer une page HTML complexe (graphique chart.js avec des données provenant d'un call API) en PDF en utilisant Puppeteer.
    J'ai exactement le même problème que le thread ci-joint (Stackoverflow).

    Puppeteer est basé sur Chrome, le script JS navigue jusqu'à la page désiré et la transforme en PDF.
    Lorsque j'exécute la commande suivante dans mon terminal, le PDF est généré parfaitement, les graphiques apparaissent, bref tout est ok.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    node public/js/htmlToPdf.js cookieName cookieValue
    Mon script JS:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    // Je met en place le cookie avec les données venant du server
    const cookie = {
        name: process.argv[2],
        value: process.argv[3],
        domain: 'localhost',
        url: 'http://localhost:8888/',
        path: '/',
        expires: -1,
        httpOnly: true,
        secure: false,
        session: true
    };
     
    const puppeteer = require('puppeteer');
     
    (async () => {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.setCookie(cookie);
        await page.setRequestInterception(true);
        page.on("request", request => {
            console.log(request.url());
            request.continue();
        });
        await page.goto('http://localhost:8888/log/project/1', {waitUntil: 'networkidle0'});
        await page.pdf({
            path: '/Users/Web_dev/PERSONAL_PROJECT/tfe-devlop-eat/public/pdf/test.pdf',
            format: 'A4'
        });
     
        await browser.close();
    })();
    Lorsque j'exécute mon script via la fonction exec() de PHP via la route de mon controlleur, j'ai un message d'erreur avec le timeout.

    Mon controlleur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        /**
         * @Route("/log/pupet", name="project_pupet")
         */
        public function pupetPdf(Request $request)
        {
            $name = session_name();
            $value = $request->cookies->get($name);
     
            // Appel de la commande avec en paramètre les valeurs du cookie
            exec('/usr/local/bin/node ' . __DIR__ . '/../../public/js/htmlToPdf.js ' . $name . ' ' . $value, $output, $return_var);
        }
    L'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (node:11982) UnhandledPromiseRejectionWarning: TimeoutError: Navigation Timeout Exceeded: 30000ms exceeded

    Ma config :



    Je suis très intéressé d'avoir un retour d'expérience si vous avez déjà utilisé Puppeteer dans un projet PHP.

    D'avance merci

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Salut Voisin,

    Tu as essayé d'augmenter le temps d'exécution de ton PHP, car il est de 30 secondes et exec() ralentit un peu le truc.

  3. #3
    Membre averti Avatar de eddst
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 23
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Salut Voisin,

    Tu as essayé d'augmenter le temps d'exécution de ton PHP, car il est de 30 secondes et exec() ralentit un peu le truc.
    Salut, oui j'ai essayé en augmentant le timeout de PHP mais ça n'a pas fonctionné.
    J'ai également essayé avec le composant Process de Symfony mais c'était la même histoire.

    Il existe un mode headless: false avec Puppeteer qui permet d'ouvrir chromium et du coup on peut voir ce qu'il se passe dans le navigateur.
    Apparemment ça bloque vers cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    await page.goto('http://localhost:8888/log/project/1', {waitUntil: 'networkidle0'});
    Merci pour ta réponse

  4. #4
    Membre averti Avatar de eddst
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 23
    Par défaut
    En parallèle, j'ai essayé de générer le Pdf en utilisant Wkhtmltopdf (basé sur webkit).

    Le problème c'est qu’apparemment Chart.js (v 2.x) utilise des animations avec des SVG et ce n'est pas reconnu par webkit.

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Si ca marche en ligne de commande , est ce que ca pourrait pas être un problème de droit manquant pour l'utilisateur qui execute PHP (et qui du coup execute la commande node) ?
    Essai d’exécuter ta commande qui marche avec l'utilisateur qui execute php histoire de valider ou non cette théorie.

    Reste aussi la solution de générer le PDF et les graph en PHP si tu as accès à l'API qui permet de générer la page en question c'est plus élégant amha.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Je plussoie le coup des droits de www-data.
    De même, question con, quand tu as changé le php.ini pour le temps de PHP, tu as bien relancé MAMP?

  7. #7
    Membre averti Avatar de eddst
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 23
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Je plussoie le coup des droits de www-data.
    De même, question con, quand tu as changé le php.ini pour le temps de PHP, tu as bien relancé MAMP?
    On a effectivement modifié les droits mais le problème persiste.

    Après avoir exclu les hypothèses au fur et à mesure, le problème viendrait du serveur Apache, qui ne gère pas le multi threading.
    Du coup lorsque le script PHP (dans le controlleur) appelle le script NodeJS, celui ci n'arrive pas à générer le Pdf car il bloque immédiatement sur l'accès au localhost, ce qui entraine un timeout.
    Je vous avoue que ça sort un peu de mes compétences, c'est mon maitre de stage qui pense que le problème viendrait de la.

    Qu'est ce que vous en pensez?

    Je compte réinstaller un serveur Apache qui gère le multi threading demain pour faire un test.

    https://stackoverflow.com/questions/...68120#13968120

  8. #8
    Membre averti Avatar de eddst
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 23
    Par défaut
    Petit Up de la situation :

    - J'ai mis tout mon projet dans une machine virtuelle Ubuntu 18.

    Je pense que je suis sur la bonne voie car la nature des problèmes a changé.
    J'obtiens la même erreur en exécutant le script NodeJS via mon controlleur ou via le terminal.

    C'est une erreur lié aux droits je pense, mais je n'ai pas trouvé de réponse, est ce que vous avez des idées?

    L'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    (node:16442) UnhandledPromiseRejectionWarning: Error: spawn EACCES
        at _errnoException (util.js:1022:11)
        at ChildProcess.spawn (internal/child_process.js:323:11)
        at Object.exports.spawn (child_process.js:502:9)
        at Launcher.launch (/var/www/tfe-devlop-eat/node_modules/puppeteer/lib/Launcher.js:126:40)
        at <anonymous>

  9. #9
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    tu sais faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -la /var/www/tfe-devlop-eat

  10. #10
    Membre averti Avatar de eddst
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 23
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    tu sais faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -la /var/www/tfe-devlop-eat

    Voila le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    drwxrwxr-x 14 dev  dev     4096 mai  2 14:24 .
    drwxrwxrwx  4 root root    4096 mai  2 11:24 ..
    drwxrwxr-x  2 dev  dev     4096 mai  2 11:24 bin
    -rw-rw-r--  1 dev  dev     2463 mai  2 13:54 composer.json
    -rw-rw-r--  1 dev  dev   237704 mai  2 11:24 composer.lock
    -rw-rw-r--  1 dev  dev  1914314 mai  2 11:24 composer.phar
    drwxrwxr-x  4 dev  dev     4096 mai  2 11:24 config
    drwxrwxr-x  4 dev  dev     4096 mai  2 11:24 doc
    -rw-rw-r--  1 dev  dev     1468 mai  2 11:38 .env
    -rw-rw-r--  1 dev  dev      138 mai  2 11:24 .env.test
    drwxrwxr-x  8 dev  dev     4096 mai  2 11:24 .git
    -rw-rw-r--  1 dev  dev      365 mai  2 11:24 .gitignore
    drwxrwxr-x 43 dev  dev     4096 mai  2 14:24 node_modules
    -rw-rw-r--  1 dev  dev      657 mai  2 11:24 package.json
    -rw-rw-r--  1 dev  dev    11769 mai  2 11:24 package-lock.json
    -rw-rw-r--  1 dev  dev      894 mai  2 11:24 phpunit.xml.dist
    drwxrwxr-x  7 dev  dev     4096 mai  2 14:13 public
    -rw-rw-r--  1 dev  dev      978 mai  2 11:24 Readme.md
    drwxrwxr-x  9 dev  dev     4096 mai  2 11:24 src
    -rw-rw-r--  1 dev  dev    11404 mai  2 11:24 symfony.lock
    drwxrwxr-x 12 dev  dev     4096 mai  2 11:24 templates
    drwxrwxr-x  2 dev  dev     4096 mai  2 11:24 tests
    drwxrwxr-x  2 dev  dev     4096 mai  2 11:24 translations
    drwxrwxrwx  4 dev  dev     4096 mai  2 11:26 var
    drwxrwxr-x 24 dev  dev     4096 mai  2 13:54 vendor

  11. #11
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Quand tu travailles en web, les droits devrais être allouée à www-data, car c'est lui qui travaille au travers de Apache.
    Comme tu es en test, on peux le faire à l'arrache et tenter un full droit ( c'est bien entendu déconseillé, c'est juste pour vérifier, que c'est bien un problème de droits)

    essaye donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo chmod -R 0777 /var/www/tfe-devlop-eat

  12. #12
    Membre averti Avatar de eddst
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 23
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Quand tu travailles en web, les droits devrais être allouée à www-data, car c'est lui qui travaille au travers de Apache.
    Comme tu es en test, on peux le faire à l'arrache et tenter un full droit ( c'est bien entendu déconseillé, c'est juste pour vérifier, que c'est bien un problème de droits)

    essaye donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo chmod -R 0777 /var/www/tfe-devlop-eat
    Toujours la même erreur, je ne vois pas trop d'où ça pourrait venir.

    Peut être du répertoire où NodeJS est installé?


  13. #13
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Non, sinon le reste fonctionne ?

  14. #14
    Membre averti Avatar de eddst
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 23
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Non, sinon le reste fonctionne ?

    Oui, j'ai fais quelques tests et tout m'a l'air ok.

  15. #15
    Membre averti Avatar de eddst
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 23
    Par défaut
    Problème résolu :

    En faite il s'avère que ça n'a rien avoir avec le serveur Apache.

    Le problème est lié à PHP et les sessions.

    Lorsque j'appelle le script NodeJS via PHP, une session est déjà ouverte et le fichier de session est "locked".
    Du coup, lors de l'exécution du script NodeJS, ça bloquait sur la ligne relative au cookie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    await page.setCookie(cookie);
    Ce qui entrainait un Timeout à tous les coups.

    Pour résoudre ce problème, j'ai simplement du ajouter cette ligne dans mon controlleur :

    Mon controlleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
        /**
         * @Route("/log/pupet", name="project_pupet")
         */
        public function pupetPdf(Request $request)
        {
            $name = session_name();
            $value = $request->cookies->get($name);
     
     
            session_write_close();
     
            $process = new Process(['/usr/bin/node',  '/var/www/html/tfe-devlop-eat/public/js/htmlToPdf.js', $name, $value]);
            $process->run(function ($type, $buffer){
                echo $buffer;
            });
            if (!$process->isSuccessful()) {
                throw new ProcessFailedException($process);
            }
     
            echo $process->getOutput();
        }
    Merci à tous pour le coup de main

  16. #16
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Cool, tu peux nous expliquer ton process de recherche de cette problématique ?

  17. #17
    Membre averti Avatar de eddst
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 23
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Cool, tu peux nous expliquer ton process de recherche de cette problématique ?
    Avec plaisir:

    Tout d'abord, lorsqu'on exécute Puppeteer, il est possible de lui passer toute une série d'arguments.
    Ce qui est très utile lorsqu'un veut débuger: headless: false.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const browser = await puppeteer.launch({headless: false});
    Cette option ouvre la fenêtre de Chromium et on peut voir ce qu'il se passe.
    C'est grâce à ça que nous avons vus que lorsque que la commande NodeJS était appelé depuis le controlleur le serveur ne répondait pas du tout.

    Et de ce fait, nous avons pensé qu'il y avait un problème au niveau du serveur.

    Par défaut Apache2 fonctionne avec le module prefork (qui ne permet pas le multithreading), j'ai donc monté une machine virtuel Ubuntu pour tester les autres versions de Apache2 (Worker & Event).

    Après de longue galère de configuration (qui m'ont appris pas mal de chose en passant), le problème était le même avec l'une ou l'autre version de Apache2.
    J'ai également installé une version de PHP multi threading (PHP-FPM) et mon maitre de stage a fait quelques recherches sur Stackoverflow et il est tombé la dessus:
    Simultaneous Requests to PHP Script

    On a été voir le fichier log de PHP et il y avait effectivement un problème relatif au session durant l'exécution de la page.
    Cet élément a fait sens avec le fait que le script NodeJS bloquait à la ligne sur le cookie.

    Et ce post Stackoverflow nous donnait la solution sur un plateau!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb Timeout sur appel Web Service
    Par VILPELLET dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 06/12/2012, 12h46
  2. TimeOut sur un appel Websphere WS
    Par sam.fet dans le forum Websphere
    Réponses: 1
    Dernier message: 24/05/2011, 15h01
  3. Réponses: 4
    Dernier message: 30/05/2007, 18h05
  4. [Sockets] Timeout sur accept() ?
    Par MikB dans le forum Développement
    Réponses: 2
    Dernier message: 30/12/2003, 17h22
  5. Alimenter le context sur un appel Javascript ?...
    Par Sylvain James dans le forum XMLRAD
    Réponses: 2
    Dernier message: 20/10/2003, 15h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo