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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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?

+ 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