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

Langage PHP Discussion :

Commande exec() qui ne passe pas


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Par défaut Commande exec() qui ne passe pas
    Bonjour,

    Je souhaite créer un programme en php qui, à la soumission d'un formulaire qui permet de choisir une liste d'images, va créer une vidéo type diaporama de ces images (vidéo ensuite téléchargeable par l'utilisateur).

    Pour ce qui est de la partie encodage vidéo, j'utilise le soft FFMPEG (je n'ai rien trouvé d'autre à vrai dire).
    Pour simplifier ma question, je vais mettre de côté la partie traitement du formulaire ; supposons donc que ma (longue) commande qui permet d'encoder la vidéo se trouve dans un fichier batch sur C:\inetpub\wwwroot\monsite\macommande.bat.
    Dans mon fichier php, je fais donc un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
    $cmd = exec("C:\\inetpub\\wwwroot\\monsite\\macommande.bat");
    echo $cmd;
    ?>
    Cela crée bien la vidéo mais le premier problème que j'ai rencontré est que dans mon navigateur, je me retrouve avec un chargement super long qui termine par une erreur 500 PHP ("La ressource que vous recherchez présente un problème, elle ne peut être affichée").
    Pour palier à ça, j'ai trouvé la solution, qui consiste à utiliser le programme PsExec pour lancer mon batch dans un nouveau processus et donc avoir un retour de commande rapide dans mon navigateur (en gros, faire tourner le batch en arrière-plan).
    Je fais donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
    $cmd = exec("C:\\inetpub\\wwwroot\\monsite\\psexec.exe \\\\127.0.0.1 -d C:\\inetpub\\wwwroot\\monsite\\macommande.bat");
    echo $cmd;
    ?>
    Mais ça ne fontionne pas, alors que :
    - "C:\inetpub\wwwroot\monsite\psexec.exe \\127.0.0.1 -d C:\inetpub\wwwroot\monsite\macommande.bat" fonctionne si je la lance manuellement via cmd
    - Ce n'est pas un problème de caractères dans mon String car si je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
    $s = "C:\\inetpub\\wwwroot\\monsite\\psexec.exe \\\\127.0.0.1 -d C:\\inetpub\\wwwroot\\monsite\\macommande.bat";
    $cmd = exec($s);
    echo $s;
    ?>
    J'obtiens bien la bonne commande à executer en retour (celle que j'execute manuellement avec le bon nombre de back-slash).

    Quelqu'un aurait-il une idée ? Parceque là je patauge un peu :pt1cable:

  2. #2
    Membre chevronné Avatar de Freudd
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 165
    Par défaut
    Bonjour,

    FFMPEG est une très bonne bibliothèque pour la gestion des codecs vidéo.
    Mais j'avoue que ça ne m'étonne pas que le traitement soit long et que ton script PHP plante.
    Peut-être que la librairie PsExec fonctionne bien (je ne l'ai jamais utilisé).

    Mais même si ton script s'exécute dans une tâche parralèlle, il faudra quand même attendre que le traitement soit fini.
    De plus, selon la configuration de ton serveur la fonction exec peut-être bloqué pour des raisons de sécurités.
    Si tu veux augmente la quantité de temps de l'exécution de tes scripts en modifiant la variable max_execution_time dans le fichier php.ini sur ton serveur.
    http://php.net/manual/fr/info.config...execution-time.

    À moins que ton problème soit un TP pour un cours d'info je trouve que choisir cette solution peut fonctionner, mais reste un peu limite (pour ton utilisateur qui attendra 3 plombes que le script finisse et aussi pour des raisons de sécurités).
    À titre personnel, je partirais sur une exécution d'encodage des vidéos via une tâche cron :
    Une fois que ton utilisateur a fini d'uploader ses ressources,
    À la validation du formulaire tu laisses un message du genre : votre vidéo sera prête dans un instant,
    La tâche cron lance une vérification pour voir si de nouvelles vidéos sont à encoder,
    Si oui lance le script directement en shell.
    Une fois que la tâche cron se termine tu enregistres la vidéo sur ton serveur.
    La vidéo étant présente elle s'affiche à la place du message d'attente.

    Voilà après je sais pas si ce genre de conseil t'aidera, en espérant que tu y trouves une piste de réflexion.

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Par défaut
    Bonjour Freudd et merci de ta réponse,

    Au final tu m'as donné une piste avec l'augmentation du timeout : je l'ai augmenté côté PHP via le fichier php.ini et côté serveur IIS dans les paramètres FastCgi.
    En parallèle, j'ai creusé sur ma commande ffmpeg et j'ai réalisé que les 3/4 de la commande que j'avais pompé ne m'était pas utile ce qui a énormément diminué le temps d'exécution après nettoyage
    Du coup ça fonctionne. Encore merci !

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

Discussions similaires

  1. [XHTML] [DEBUTANT] Validation qui ne passe pas
    Par hugo123 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 25/01/2006, 20h15
  2. [Tableaux] variable qui ne passe pas
    Par oceane751 dans le forum Langage
    Réponses: 5
    Dernier message: 31/12/2005, 02h56
  3. [method post] argument qui ne passe pas
    Par crevettes59000 dans le forum Langage
    Réponses: 3
    Dernier message: 30/12/2005, 15h11
  4. un truc qui ne passe pas sous firefox ...
    Par SpaceFrog dans le forum Général JavaScript
    Réponses: 39
    Dernier message: 08/11/2005, 15h59
  5. Requête qui ne passe pas
    Par TheBart dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/08/2005, 10h12

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