2010-07-16 6 views
0

J'ai un fichier jar de mon application qui a plus d'une classe. Le fichier jar est appelé par PHP via l'invite de commande. J'utilise l'extrait PHP suivant pour appeler le fichier jar.Exécution du fichier .jar à partir de PHP via l'invite cmd et la capture de sortie

<?php 
$result=popen('java -jar D:\\Development\\Filehandler\\dist\\Filehandler.jar getConfigLang', "r"); 
while(!feof($result)){ 
    print fread($result, 1024); 
    flush(); 
} 
fclose($result); 
?> 

Le problème ici est intéressant. Je suis capable d'obtenir les instructions 'System.out.println' qui sont dans la fonction principale. Mais impossible d'obtenir les instructions de sortie d'autres classes.

J'ai aussi essayé avec exec(). Le fichier .jar fonctionne correctement et lorsqu'il est appelé directement depuis l'invite de commande, il fonctionne correctement.

Existe-t-il un moyen de capturer toute la sortie?

+0

Avez-vous essayé en cours d'exécution sans PHP en premier? – mauris

+0

Ouais, ça marche bien quand on essaie directement dans l'invite de commande – Rajkumar

Répondre

1

Avez-vous essayé d'utiliser proc_open à la place:

http://au.php.net/manual/en/function.proc-open.php

il vous permet de configurer les tuyaux « est réglé sur un tableau indexé de pointeurs de fichiers qui correspondent à la fin de PHP de tous les tuyaux qui sont créés. "

Exemple de php.net

<?php 
$descriptorspec = array(
    0 => array("pipe", "r"), // stdin is a pipe that the child will read from 
    1 => array("pipe", "w"), // stdout is a pipe that the child will write to 
    2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to 
); 

$cwd = '/tmp'; 
$env = array('some_option' => 'aeiou'); 

$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env); 

if (is_resource($process)) { 
    // $pipes now looks like this: 
    // 0 => writeable handle connected to child stdin 
    // 1 => readable handle connected to child stdout 
    // Any error output will be appended to /tmp/error-output.txt 

    fwrite($pipes[0], '<?php print_r($_ENV); ?>'); 
    fclose($pipes[0]); 

    echo stream_get_contents($pipes[1]); 
    fclose($pipes[1]); 

    // It is important that you close any pipes before calling 
    // proc_close in order to avoid a deadlock 
    $return_value = proc_close($process); 

    echo "command returned $return_value\n"; 
} 
?> 
Questions connexes