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 :

passthru(): Unable to fork


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut passthru(): Unable to fork
    Bonjour,

    J'utilise un processus créé par la fonction proc_open() dans un programme "sockets serveur" démarré depuis un fichier "bat" en mode administrateur, dans le but de lancer une commande de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    php "prog.php" "param1" "param2"
    prog.php contient une fonction permettant d'exécuter un autre programme de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    passthru($commande,$statut);
    En capturant la sortie de passthru() j'obtiens ce message d'erreur :

    Warning: passthru(): Unable to fork [chcp 65001 & php "c:/.../.../autre_prog.php" "param1" "param2" ] in C:\serveur\..\...\prog.php on line 174
    Quelle est l'origine de cette erreur quelles solutions ?

    PHP 7.4.12

    Merci d'avance.

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 766
    Points : 43 927
    Points
    43 927
    Par défaut
    Probablement une limitation système.
    Il faudrait voir le contenu de la fonction passtrhu et surtout récupérer le code erreur de retour de fork.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    J'aimerais bien donner tous les détails mais c'est trop long à expliquer.
    En deux mots la commande dos qui ne s'exécute pas comprends un programme php CLI, à l'intérieur duquel je lance plusieurs fois des commandes dos et ou des programmes à l'aide de passthru(). J'essaie de suivre l'exécution en écrivant dans des fichiers et visiblement le programme en question débute bien mais s'arrête en plein milieu sans erreurs, comme si une limite était atteinte (nb process ? ou autre).
    Comment récupérer le code retour fork ?

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Je pense à d'autres alternatives en utilisant le serveur web mais la fonction passthru() bloque dans ces cas là et j'obtiens le message suivant :
    "Accès refusé"
    Est il possible de contourner les problème d'accès avec passthru() ?

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 766
    Points : 43 927
    Points
    43 927
    Par défaut
    une limite était atteinte (nb process ? ou autre).
    C'est l'hypothèse, il te faut placer des points d’arrêts dans le code et surtout analyser le retour des fonctions pour savoir quelle est réellement l'erreur.

    Appeler un programme par un programme qui appelle un programme est une source de problèmes.
    Sans plus de détail on pourra pas t'aider plus.

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Merci pour ce retour.
    Bon difficile de trouver une bonne solution mais je me suis aperçu après moult tests qu'il y a quelque chose de bizzard que je n'avais pas dans la version antérieure de php (5.5x). Déjà avec proc_open() et php nous avons un problème pour lire les flux stdin/out sous windows puisque ceux-ci sont bloquants, donc ce que je faisais pour contourner ceci c'est de ne pas lire les flux et attendre un signal de fin généré en parallèle. Comme mon programme bloque je ne sais où, j'ai tenté différentes variantes pour les commandes, notamment start /B utilisation de passthru(), exec()... mais toujours le même problème. Par contre je suis parvenu à avoir partiellement la sortie d'écran du process créé par proc_open lorsque celui-ci lance un programme exe comme ffmpeg par exemple et je m'aperçois que le programme s'est donc bien lancé mais avec ce premier message d'erreur et reste "figé" :

    GnuTLS initialization: Failed to acquire random data
    J'en déduis que c'est ça qui génère des blocages (je n'avais pas du tout ce problème sous php 5.).

    Un autre essai m'a permis de constater que si je lance un processus et que je lis le flux stdout dans la foulée la commande s'exécute jusqu'à la fin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc_open() + stream_get_contents()
    Et si je ne fais pas cela le programme se bloque comme décris au dessus.

    Ce qui me dérange c'est qu'en php 5 j'avais trouvé un moyen de faire des multiprocessus en parallèle sans être obligé de lire les dans les flux et là visiblement cela ne marche plus les commandes d'exécutables se figent, en tous les cas pour ceux que j'ai testés. Maintenant j'ai ce nouveau problème de fork() que je ne comprends pas non plus.

    Ca devient très compliqué (impossible) de faire des processus simultanés avec php entre les blocages, les droits d'accès, le mode cli ou module apache et le fonctions qui parfois sont boguées... C'est dommage.

    J'étudie une solution alternative utilisant des utilitaires car là je sèche vraiment.

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Je travaille sur la solution qui semble la plus efficace avec php à l'aide du planificateur de tâches. Je programme pour cela un tâche planifiée permettant d'exécuter un programme php qui lance les commandes stockées par exemple dans une base de données. Cela fonctionne bien et finalement ajoute un tas de fonctionnalités incluses dans windows...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    schtasks /Run  /TN \"PHP PROG\"
    Par contre je ne sais pas comment récupérer les valeurs retournées (code retour, stdout...), si quelqu'un peut m'aider la dessus cela m'aiderait un peu plus, surtout dans le but d'arriver à savoir si la tâche est terminée ou pas. Merci.

    C'est une bonne façon de faire évitant de nombreux problèmes liés multiprocessus avec php, même si cela ne répond pas au problème initial...

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

Discussions similaires

  1. [Système] Problème de droits en PHP (unable to fork)
    Par jeremie74 dans le forum Langage
    Réponses: 5
    Dernier message: 27/10/2006, 11h22
  2. Executer un exe en php (Unable to fork)
    Par Alain15 dans le forum IIS
    Réponses: 13
    Dernier message: 03/08/2006, 13h15
  3. [langage] [Fork] Détecter un fichier
    Par GLDavid dans le forum Langage
    Réponses: 11
    Dernier message: 08/07/2004, 01h05
  4. unable to create INITIAL extent for segment in tablespace
    Par Ludolitaliano dans le forum Administration
    Réponses: 4
    Dernier message: 11/09/2003, 16h43
  5. Pas de fork sous Windows?
    Par chezjm dans le forum POSIX
    Réponses: 8
    Dernier message: 11/06/2002, 12h15

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