2010-11-18 9 views
1

Ich habe eine PHP-Website und möchte ein sehr langes Python-Skript im Hintergrund ausführen (300 MB Speicher und 100 Sekunden). Die Prozesskommunikation erfolgt über eine Datenbank: Wenn das Python-Skript seinen Job beendet, aktualisiert es ein Feld in der Datenbank und dann rendert die Website basierend auf den Ergebnissen des Python-Skripts einige Grafiken.PHP und shell_exec

Ich kann "manuell" das Python-Skript von Bash (beliebiges aktuelles Verzeichnis) ausführen und es funktioniert. Ich möchte es in PHP integrieren, und ich versuchte die Funktion shell_exec:

shell_exec("python /full/path/to/my/script") aber es funktioniert nicht (ich sehe keine Ausgabe)

Haben Sie Ideen oder Anregungen? Es ist erwähnenswert, dass das Python-Skript ein Wrapper über andere Polyglottools ist (Java gemischt mit C++).

Danke!

+0

Bitte fügen Sie weitere Details wie das Skript als Web-Prozess oder über die Befehlszeilenschnittstelle ausführen - in Kürze, 100 Sekunden und die 300Mb wird wahrscheinlich überschritten Seite Ausführungszeit und Speicher - lesen Sie diese http://StackOverflow.com/ Fragen/45953/php-execute-a-background-process – ajreal

+0

- er sagte, dass er shell_exec verwendet - also nehme ich an er er verwendet sein Skript als Kommandozeilen-Tool – Thariama

+0

das Skript ist ein Kommandozeilen-Tool –

Antwort

0

Vielen Dank für Ihre Antworten, aber keiner von ihnen arbeitete :(ich beschlossen, in einer schmutzigen Weise zu implementieren, mit beschäftigt warten, anstatt ein Ereignis auszulösen, wenn ein Datensatz eingefügt wird

Ich schrieb ein Backup-Verfahren ss, das für immer läuft und bei jeder Iteration überprüft, ob es etwas Neues in der Datenbank gibt. Wenn es einen Datensatz findet, führt es das Skript aus und alles ist in Ordnung. Die Idee ist, dass ich den Backup-Prozess von der Shell starten.

0

Ein Problem könnte sein, dass Ihr Skript länger dauert als die für eine Anfrage definierte Serverwartezeit (kann in der php.ini oder httpd.conf gesetzt werden).

Ein weiteres Problem könnte sein, dass das Serverkonto nicht berechtigt ist, Code oder Dateien auszuführen oder darauf zuzugreifen, die für die Ausführung des Skripts benötigt werden.

+0

Sie haben recht mit dem ersten Problem, aber wie kann ich einen Hintergrundjob von PHP starten? (auch, wie kann ich das Problem debuggen, dass es von der Befehlszeile und nicht von exec_shell funktioniert) –

+0

Nun, Sie haben ein Skript - wenn Sie dieses Skript von PHP über Exec ausführen, müssen Sie irgendeine Art von Debug-Informationen erhalten. Warum schreiben Sie nicht ein paar Debug-Anweisungen in Ihr Skript (schreiben Sie in STDERR oder eine Datei?) – Thariama

+0

das Problem ist, dass die Debug-Informationen vage sind; Ich führe "Black Box" Programme aus und sie berichten nicht zu viel. Ich habe die Implementierung geändert und jetzt ist alles in Ordnung (siehe meine Antwort). –

1

Zuerst einmal set_time_limit(0); wird Ihr Skript für immer laufen lassen, so sollte Timeout kein Problem sein. Zweitens verwendet ein * exec-Aufruf in PHP standardmäßig nicht den PATH (kann von der Konfiguration abhängen), also wird das Skript beendet, ohne irgendwelche Informationen über das Problem zu geben, und es kommt oft vor, dass es das Programm nicht findet, In diesem Fall Python. So ändern Sie es zu:

shell_exec("/full/path/to/python /full/path/to/my/script"); 

Wenn Ihr Python-Skript auf seine eigene ohne Probleme läuft, dann ist es sehr wahrscheinlich, dass dies das Problem ist. Was den Speicher angeht, bin ich mir ziemlich sicher, dass PHP nicht den gleichen Speicher verwenden wird, den Python verwendet. Also, wenn es 300MB verwendet, sollte PHP auf Standard (sagen 1MB) bleiben und einfach auf das Ende von Shell_Exec warten.

0

diese Gefunden vor und hat mir geholfen, meine Ausführung im Hintergrund Problem zu lösen:

function background_exec($command) 
{ 
    if(substr(php_uname(), 0, 7) == 'Windows') 
    { 
     pclose(popen('start "background_exec" ' . $command, 'r')); 
    } 
    else 
    { 
     exec($command . ' > /dev/null &'); 
    } 
} 

. Quelle:

http://www.warpturn.com/execute-a-background-process-on-windows-and-linux-with-php/

+0

aww sry falsch gelesen das Thema, aber vielleicht hilft es, wenn Ihr Skript zu lange läuft –

3

shell_exec einen String zurückgibt, wenn Sie es alleine laufen wird es keine Ausgabe erzeugen, so können Sie schreiben:

$output = shell_exec(...); 
print $output; 
0

fand ich, dass das Problem, wenn ich das versucht, die einfache Tatsache war, dass ich tat Kompilieren Sie die Quelle nicht auf dem Server, auf dem ich sie ausgeführt habe. Durch das Kompilieren auf Ihrem lokalen Computer und das anschließende Hochladen auf Ihren Server wird es in gewisser Weise beschädigt. shell_exec() sollte funktionieren, indem Sie die Quelle kompilieren, die Sie auf demselben Server ausführen möchten, auf dem das Skript ausgeführt wird.

Verwandte Themen