2010-08-30 1 views
8

Ho uno script php che gestisce un input di modulo. Per motivi di design, entrambi un po 'fuori dal mio controllo, e che non desidero assolutamente cambiare, devo chiamare uno script perl con i parametri specificati nel modulo html.Chiama perl da php?

Ho disinfettato tutti gli input e li ho poi esportati in un file chiamato input, che viene letto dallo script perl chiamato, per brevità in questa domanda, script.pl. Script.pl dovrebbe fare qualcosa e poi scrivere tutti gli output in un file chiamato output.

ho chiamare lo script Perl da PHP in questo modo:

system('perl script.pl 2>errors'); 

Non va bene, non succede nulla. l'output non viene creato, gli errori non vengono creati e l'effetto collaterale non si verifica.

Il mio apache funziona come utente di www-data e id di gruppo. La mia directory è impostata con 775 impostazioni con proprietà come me: www-data. (Il mio nome utente è stato sostituito con "me" per motivi di privacy).

La mia domanda è doppia: 1) Sto facendo questo sbagliato? Se sì, come dovrei migliorare sul codice? 2) Esiste un modo più corretto per rilevare errori nell'esecuzione del sistema?

Dopo aver programmato perl per un po ', php si sente come un rompiballe.

OS: Ubuntu Server Edition

+2

A scopo di verifica: si ottiene alcun output con 'passthru ('script.pl perl 2> &1');' – VolkerK

+0

passthru() fa tutto come previsto Cosa sta succedendo ??? –

+0

Leggi:?. Http://php.net/manual/en/function.passthru.php –

risposta

1

popen può essere utilizzato per ottenere la risposta della shell. questa è la tua migliore scommessa. Quale può aiutarti a eseguire il debug perché il sistema è arrabbiato. inoltre, se il tuo pl sta dicendo "ciao" e "ciao", il popen può persino leggerlo.

Se non è stato possibile trovare il comando da eseguire, viene restituita una risorsa valida. Questo può sembrare strano, ma ha senso; ti permette di accedere a qualsiasi messaggio di errore restituito dalla shell

Idealmente, avrei preso i dati da stdin e scritto su stdout. i popen consentirebbero l'accesso pulito a entrambi.

popen('pwd;perl script.pl 2>errors;echo done');

allora si può vedere dove si (directory) erano quando il sistema stato chiamato e lo ha fatto "fatto".

+0

Sulla stessa falsariga, ho scoperto recentemente che 'proc_open' è incredibilmente potente quando si eseguono altri processi tramite php, e non è così difficile da usare come potrebbe sembrare all'inizio. – grossvogel

0

è perl nel percorso? Forse hai bisogno di specificarlo completamente (ad es./Usr/bin/perl). System() restituisce false, indicando un errore? Se provi qualcosa di più semplice, come system('/usr/bin/true', $retval), lo $retval è impostato su 1?

+0

percorso perl è impostato, eseguendo il comando manualmente sul terminale funziona. Tuttavia, ho appena messo un assegno e la chiamata di sistema sta tornando falsa. –

+0

Forse il comando perl è nel percorso per il tuo login/shell interattivo ma non per il processo del webserver? – VolkerK

+0

Ho specificato il percorso assoluto e restituisce ancora false, c'è un modo per controllare l'errore di system()? –

0

Dai uno sguardo allo PHP system() documentation. Quello che segue è la funzione di prototipo del sistema di():

string system (string $command [, int &$return_var ]) 

Passo in un secondo argomento e poi stampare la stringa di ritorno così come la seconda variabile. Guarda cosa dice l'errore.

1

In passato ho usato shell_exec() o backtick per realizzare questo.

La documentazione per il valore di ritorno shell_exec indica che è identica all'operatore backtick:

Valori restituiti

L'output del comando eseguito.

Spero che questo aiuti.

system() restituisce solo il codice di stato.

$var = shell_exec ("ls"); 
print $var; 
$var = `ls -l`; 
print $var;