2009-02-19 13 views
15

Ich versuche, ein Skript, das mehrere Sekunden dauert (Webdienste mit Drittanbieter) mit dem PHP-Exec-Aufruf. Nach viel Mühe habe ich dies auf das klassische Hallo-Welt-Beispiel reduziert. Der anrufende Skript wie folgt aussieht:Kann PHP-Skript nicht mit PHP exec ausführen

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

Als ich dies ausführen, wird die Ausgabe execoutput.txt eine Kopie der rufenden Skript Seite enthält, nicht hello world als ich erwartet hatte.

Warum kann ich dieses PHP-Skript nicht mit exec ausführen? Beachten Sie, dass, wenn ich den Befehl in etwas wie ls -l ändern, die Ausgabe eine Verzeichnisliste wie erwartet ist. BTW, falls es darauf ankommt, habe ich chmod das aufgerufene Skript zu 755 ...

Update - Ich habe den exec Aufruf an das Ende des aufrufenden Skriptes und zumindest jetzt sehe ich nicht das aufrufende Skript in der Ausgabe ausgeführt. Danke an Poster und ich werde einige dieser Ideen ausprobieren.

Hilfe!

Dank Steve

Antwort

16

Was exec macht, ist die am weitesten rechts stehenden Befehl zu nehmen und es zu Ihrem Ziel angehängt wird. Wenn Sie die Shebang-Zeile in Ihrem PHP-Skript haben, sollten Sie die binäre Direktive des PHP-Interpreters nicht hinzufügen müssen.

, wenn Sie nur die Ausgabe des Skripts wollen, versuchen Sie:

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

jedoch, wenn Sie die Fehler in der Datei sein nicht wollen, sollten Sie die STDERR umgeleitet, bevor die Datei ausgibt. Wie so:

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

das oben genannte sollte nur die "Hallo Welt" zum execoutput ausgeben.

Edit:

Interessante Sie dieses Verhalten bekommen. Sie haben angegeben, dass der Befehl "ls" funktioniert hat. Versuchen Sie einen Aliasnamen für diese Herstellung und leitet es in eine Datei wie folgt:

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

dann

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

es Eingang ein Problem mit der Art und Weise exec behandelt zu sein scheint, in Bezug auf die Schale gegenüber sich selbst .

-Johannes

+1

- vielen Dank für Ihre Antwort, aber leider ist es nicht für mich arbeiten. Als ich versuchte: exec ('/ home/quote2bi/tmp/helloworld.php>/tmp/execoutput.txt 2> & 1 &') ... Ich habe die gleichen Ergebnisse (aktuelle Seite in der Ausgabedatei). Der zweite Exec blockiert (fehlt das &) - wenn hinzugefügt, habe ich die gleichen Ergebnisse. –

+0

Gibt es eine Option, wenn die Funktion exec() auf meinem Server deaktiviert ist –

7

Das Problem ist mit PHP selbst, es alles wie $ argv im Skript behandelt. Die Ausgabe wird nicht in eine Datei nach/dev/null umgeleitet.

Ich hatte vor einiger Zeit das gleiche Problem konfrontiert. Was ich getan habe, ist ein runscript.php in/opt/php-bin zu erstellen und dann in diesem Skript auszuführen, was es laufen soll.Etwas wie folgt aus:

$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); 

Und Sie es dann rufen Sie mit:

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

Es ist der einzige Weg, ich es geschafft, diese Funktion zu erhalten.

0

Um die angegebenen Probleme von PHP in diesem Bereich zu vermeiden, warum nicht in ein Shell-Skript einfügen? PHP kann dann das Shell-Skript ausführen, bei dem alle Umleitungen intern verarbeitet werden.

Wenn Sie Dinge dynamisch ändern müssen, warum schreiben Sie dann nicht das Shell-Skript und führen es dann aus (und reinigen Sie es anschließend).

28

Ich hatte dieses Problem auch und es stellt sich heraus, dass dies ein Fehler in PHP (# 11430) ist. Das Problem besteht darin, PHP-CLI zu verwenden, wenn ein anderes PHP-Skript in einem PHP-Skript aufgerufen wird. So können Sie immer noch exec verwenden, aber anstatt Verwendung PHP php-cli, wenn sie im Browser aufrufen:

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

Das ist für mich gearbeitet.

+1

Das funktionierte auch für mich. Wünschte, ich hätte diese Antwort früher gesehen, hätte eine 5-stündige Kopfschmerzen gelöst. – Omar

+1

Sie haben meinen Tag gerettet. Dies ist die richtige Antwort. – DataHerder

+1

Ich habe das für HOURS gesucht und wollte gerade aufgeben. Beachten Sie, dass dies bei Verwendung von PHPSuEXEC nicht erforderlich zu sein scheint, aber sobald Sie suexec deaktivieren, müssen Sie php-cli wie angegeben verwenden. – rinogo

1

Wenn Sie einfach nur ein PHP-Skript ausführen, besteht eine Möglichkeit, den gesamten Code auszuführen, das include(), das die PHP-Datei ausführt und alle Ergebnisse ausgibt. Sie können die Ausgabe in eine Textdatei direkt, aber es sollte im Browser-Fenster angezeigt, wenn Sie Hallo Welt PHP-Skript sind sieht aus wie

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

dann wird es, dass die in den Browser spucken. So Ihr zweiter Code aussehen würde

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

auf einer Seite führt, die aussehen würde,

Hallo Welt! PHP ROCKS

0

Dies läuft, als ob Sie das Skript aus dem Browser ausführen.

Dies kam während der Arbeit an einem Projekt auf Linux-Plattform.

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

Hoffe, das hilft !! John