2010-09-10 26 views
8

Sto provando ad eseguire un file Jar nel backend del mio codice php. Ma non sto ottenendo l'output desiderato. C'è un file jar che viene eseguito in background e restituisce il Page Rank di qualsiasi parola chiave e Dominio assegnato ad esso. Allego il codice, per favore suggeriscimi qualsiasi soluzione, perché quando lo eseguo sul terminale, sta dando un output corretto.Come eseguire un comando shell tramite il codice PHP?

Ecco il codice:

<?php 
set_time_limit(0); 
function returnJarPath() 
{ 
    $jarPath = $_SERVER['DOCUMENT_ROOT'] . "myFolder/tools_new/includes/Rank.jar"; 
    return $jarPath; 
} 
$jar = returnJarPath(); 
$command = "java -jar $jar aspdotnet/microsoft.com";//Passing the Argument to the Jar file. 


$shellOutput = shell_exec($command); 
    print "The Shell Output is : " ; var_dump($shellOutput);print "<br />"; 
exec($command,$executeCommmand); 
    print "The Exec returns the value : " ; var_dump($executeCommmand);print "<br />"; 
passthru($command,$passthruCommand); 
    print "The Passthru returns the value : " . $passthruCommand. "<br />"; 
?> 

Ho appena controllato log degli errori di apache e l'ultimo errore che ho trovato è stato:

sh: java: command not found

Ma come ho già detto, sto usando lo stesso comando tramite SSH per eseguire il comando Java. Quindi non c'è alcuna possibilità di non avere JAVA installato sul server. Please help me out di questo pasticcio ...

+0

Stai ottenendo alcun output? Qualche errore? – Buggabill

+0

@Buggabill: No. Non tramite Php ma sto ottenendo l'output corretto tramite Terminale (Console). –

risposta

3

Se il file jar scrive sullo standard output, è possibile utilizzare exec.

Ecco un esempio di come lo uso:

may be first: exec("cd jar dir"); // if jar fine needs to be executed from the same dir 
$output = exec("/usr/bin/java -jar $jar aspdotnet/microsoft.com"); 

Ma come dici tu:

sh: java: command not found 

Significa la non v'è alcun percorso alias per Java da PHP. Basta usare il percorso java completo per l'eseguibile/usr/bin/java.

+0

Come dovrei usare il tuo modo di risolvere il mio problema? –

+0

innanzitutto trovare il percorso java sul comando linux promtp con questo comando: quale java. Restituirà/usr/bin/java. Usalo come percorso completo nel comando "/ usr/bin/java -jar $ jar aspdotnet/microsoft.com". Potrebbe anche essere necessario effettuare il cd nella directory jar se lo si desidera dal jar. – darpet

+0

Già fatto ... e ha funzionato. Grazie a un gruppo Darco! –

0

Dato che stai chiamando java. La mia scommessa è che l'output viene visualizzato nella console Java e non nella shell, dove PHP potrebbe estrarre le informazioni di testo.

Come risolvere questo dilemma?

Bene, è possibile scrivere i risultati su un file, se si dispone del codice sorgente Java da modificare, quindi leggere il file tramite php per ottenere i risultati. La possibilità di una collisione qui sarebbe abbastanza buona. L'altra opzione è di avere Java connesso al tuo database MySQL (se ne hai uno) e quindi eseguire java, quindi interrogare il database per la risposta. Certo, avresti bisogno di passare a Java un modo per inserire i dati per inserire un record che potresti identificare (un hash di qualche tipo), non l'ho mai fatto in Java, solo una teoria su come potresti per farlo.

Aggiornamento

Si consiglia di provare il standard output come suggerito da darko petreski come un'altra opzione.

0

Se il codice PHP deve essere eseguito su un server (e non tramite la riga di comando) l'utente che esegue l'eseguibile java è www-data, non tu.In tal caso assicurati che www-data abbia le autorizzazioni per leggere il file jar e per eseguire l'eseguibile java

+0

Il messaggio di errore dice "java: comando non trovato", non sui privilegi. – darpet

0

La prima cosa che vorrei controllare/cambiare è la linea nella funzione in cui stai costruendo la variabile $jarPath da questo:

$jarPath = $_SERVER['DOCUMENT_ROOT'] . "myFolder/tools_new/includes/Rank.jar"; 

a questo:

$jarPath = $_SERVER['DOCUMENT_ROOT'] . "/myFolder/tools_new/includes/Rank.jar"; 

La barra finale non può essere presente in $_SERVER['DOCUMENT_ROOT'] che potrebbe causare problemi.

Io parto dal presupposto che quando si dice che va dalla console, si esegue il comando java in questo modo:

$ java -jar /rest/of/path/myFolder/tools_new/includes/Rank.jar aspdotnet/microsoft.com 

vorrei assicurare che si include il percorso del binario java nel $command variabili come così ...

$command = "/path/to/java -jar $jar aspdotnet/microsoft.com"; 

l'utente che possiede il processo del server web non può avere una variabile $ PATH che include il percorso del binario Java.

Problemi correlati