2010-11-29 3 views

Répondre

2

Quelle est la commande que vous essayez d'exécuter? Des commentaires que vous avez laissés il semble que vous essayez d'exécuter PHP lui-même? (Vous avez passé C:\xampp\php\php.exe à proc_open())

Tout ce que vous voudriez faire dans php.exe, vous pouvez le faire sans avoir à exécuter l'exécutable. L'exécutable est appelé par Apache lorsque vous demandez un fichier .php à partir du serveur Web. Ainsi, si vous aviez vraiment besoin d'exécuter du code PHP, vous le coderiez simplement. Vous ne diriez pas à PHP de charger l'interpréteur PHP. Ce serait idiot =) Comme avoir un interprète anglais pour un anglophone.

Si vous nous avez indiqué spécifiquement la commande que vous essayez d'exécuter, nous serons peut-être en mesure de fournir une meilleure explication de la façon de l'accomplir. Je connais un exemple de ma propre expérience où j'ai dû utiliser proc_open() afin de crypter des fichiers avec GPG.

$descriptors = array(
    0 => array("pipe", "r"), // STDIN. Used to feed input 
    1 => array("pipe", "r"), // STDOUT. We are writing to it, though 
    2 => array("pipe", "w"), // STDERR. Used to read errors 
); 
// Build the command line and start the process 
$cmd = '"C:/program files/gnu/gnupg/gpg.exe" --batch --no-verbose --passphrase-fd 1 --output decrypted.zip --decrypt encrypted.zip.gpg'; 
$gpg = proc_open($cmd, $descriptors, $pipes); 
if(is_resource($gpg)) { 
    // Push passphrase to custom pipe 
    fwrite($pipes[1], $passphrase); 
    fclose($pipes[1]); 
    proc_close($gpg); 
} 

Notez que pour STDOUT il dit: « Nous écrivons, bien que ». Ce code était en fait ma solution à un problème sous Windows (Vista et XP, je ne sais pas si 7 l'a corrigé). Windows autorise seulement 3 pipes pour communiquer avec un programme de ligne de commande, par opposition à UNIX qui permet la création de BEAUCOUP plus (je pense 256 ou quelque chose). GPG nécessite généralement quatre tuyaux pour fonctionner. Un pour les données d'entrée (données à chiffrer/déchiffrer), un pour les données de sortie, un pour les erreurs et un pour le mot de passe.

Étant donné que je déchiffrais un fichier, je n'avais pas besoin de voir la sortie du programme, j'avais juste besoin de voir s'il y avait des erreurs. Aucune erreur ne signifiait que la sortie pouvait être trouvée dans le fichier. J'ai donc ignoré le tube de sortie et l'ai utilisé pour l'envoi du mot de passe. Selon votre utilisation, vous n'aurez peut-être pas besoin d'une solution aussi délicate.

1

exec() n'est pas conçu pour les programmes interactifs. Pour pouvoir parler à votre sous-processus, vous devez utiliser proc_open(), ce qui permet des communications bidirectionnelles.

+0

Cela ressemble certainement à la façon de le faire, mais j'ai toujours du mal à faire fonctionner l'exemple et je reviendrai à vous. Le fichier d'erreur contient "php" n'est pas reconnu comme une commande interne ou externe, programme exécutable ou fichier batch. " mais php.exe * IS * dans mon système Windows PATH. – Mawg

+0

si je prends l'exemple et change pour mettre le chemin absolu à l'interpréteur PHP "$ processus = proc_open ('c: /xampp/php/php.exe', $ descriptorspec, $ tuyaux, $ cwd, $ env);" alors je reçois "Attention: proc_open() [fonction.proc-open]: CreateProcess échoué, le code d'erreur - 0" et le fichier d'erreur est vide – Mawg

+0

donc, je suppose que je ne peux pas compter comme une réponse, alors. Pardon. Mais j'apprécie votre tentative d'aider – Mawg

Questions connexes