2009-02-19 21 views
15

Sto tentando di richiamare uno script che impiega diversi secondi (servizi Web con terze parti) utilizzando la chiamata exec di PHP. Dopo molte difficoltà, l'ho ridotto al classico esempio di ciao mondo. Lo script chiamando assomiglia:Impossibile eseguire script PHP utilizzando PHP exec

exec('/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &'); 

Quando ho eseguito questo, l'uscita execoutput.txt contiene una copia della pagina sceneggiatura invocazione, non hello world come mi aspettavo.

Perché non riesco a eseguire questo script PHP utilizzando exec? Notare che quando cambio il comando in qualcosa come ls -l, l'output è un elenco di directory come previsto. btw, nel caso abbia importanza, ho fatto chmod lo script chiamato a 755 ...

Aggiornamento - Ho spostato la chiamata exec alla fine dello script chiamante e almeno ora non vedo lo script chiamante eseguito nell'output. Grazie a poster e proverò alcune di queste idee.

Help!

Grazie Steve

risposta

16

Cosa exec sta facendo sta prendendo il comando più a destra e aggiungerlo alla vostra destinazione. Se si dispone della riga shebang nello script php, non è necessario includere la direttiva binaria dell'interprete php.

se si desidera solo l'uscita dello script, provare:

exec('/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &') 

se non si vuole gli errori siano nel file, è necessario reindirizzare lo STDERR prima di output al file. In questo modo:

exec('/home/quote2bi/tmp/helloworld.php 2> /dev/null > /tmp/execoutput.txt') 

quanto sopra deve solo inviare "Hello World" all'output.

Edit:

Interessante hai trovato questo comportamento. Hai dichiarato che il comando "ls" funzionava. Prova a fare un alias per questo e lo trasmette ad un file in questo modo:

alias pexec='php /home/quote2bi/tmp/helloworld.php'

poi

exec('pexec > /tmp/execoutput.txt 2>&1 &') 

sembra essere un problema con il modo in cui exec gestisce l'input in contrasto con il guscio stesso .

-John

+1

John - grazie per la tua risposta, ma sfortunatamente non ha funzionato per me. Quando ho provato: exec ('/ home/quote2bi/tmp/helloworld.php> /tmp/execoutput.txt 2> & 1 &') ... Ho ottenuto gli stessi risultati (pagina corrente nel file di output). Il secondo exec bloccato (manca il &) - quando ho aggiunto ho ottenuto gli stessi risultati. –

+0

C'è qualche opzione se la funzione exec() è disabilitata sul mio server –

7

Il problema è con PHP stesso, si tratta tutto come $ argv nello script. Non reindirizza l'output a un file ou a/dev/null.

Ho affrontato lo stesso problema qualche tempo fa. Quello che ho fatto è creare uno runscript.php in/opt/php-bin e quindi all'interno di questo script eseguire ciò che dovrebbe essere in esecuzione.Qualcosa di simile a questo:

$script = $argv[1] 
$params = implode(' ', array_slice($argv, 2)); 
$cmd = "{$script} {$params} > /dev/null &"; 

$output = array(); 
$return = 0; 
exec("php {$cmd}", $output, $return); 

exit((int)$return); 

E poi lo chiami utilizzando:

exec('/opt/php-bin/runscript.php /path/to/your/script.php arg1 arg2') 

E'l'unico modo sono riuscito ad ottenere questo lavoro.

0

Per evitare i problemi dichiarati di PHP in quest'area, perché non inserire questo in uno script di shell? PHP può quindi eseguire lo script della shell che ha tutti i reindirizzamenti gestiti internamente.

Se è necessario modificare dinamicamente le cose, allora perché non scrivere lo script della shell e quindi eseguirlo (e, naturalmente, ripulire in seguito)?

28

Ho avuto questo problema anche e si scopre che questo è un bug in php (# 11430). La soluzione è usare php-cli quando si chiama un altro script php all'interno di uno script php. Così si può ancora usare exec, ma piuttosto che l'uso uso php php-cli quando si chiama nel browser:

exec("php-cli somescript.php"); 

Questo ha funzionato per me.

+1

Questo ha funzionato anche per me. Vorrei aver visto questa risposta prima, avrebbe risolto un mal di testa di 5 ore. – Omar

+1

Lei ha appena salvato la mia giornata. Questa è la risposta corretta. – DataHerder

+1

Ho cercato questo per ORE e stavo per arrendermi. Nota che se stai usando PHPSuEXEC, questo non sembra essere necessario, ma non appena disabiliti suexec, devi usare php-cli come specificato. – rinogo

1

se si sta semplicemente eseguendo uno script php un modo possibile per eseguire l'intero codice è utilizzare l'include() che eseguirà il file php e produrrà risultati. Non è possibile indirizzare l'output in un file di testo, ma dovrebbe apparire se siete script php Ciao Mondo assomiglia

<?php echo "Hello World!"; ?> 

allora sarà sputare fuori che nel browser nella finestra del browser. Così il vostro secondo codice sarà simile

<?php include("helloWorld.php"); echo " PHP ROCKS";?> 

risultante in una pagina che sarebbe simile,

Ciao mondo! PHP ROCKS

0

Viene eseguito come se si eseguisse lo script dal browser.

Questo si è verificato durante il lavoro su un progetto su piattaforma Linux.

exec('wget http://<url to the php script>) 

Spero che questo aiuti !!