2017-05-18 4 views
4

Ich habe ein Python-Skript, das eine PDF-Datei konvertiert. Es wird über PHP in meinem Laravel App namens:Warum schlägt ein lang laufendes Python-Skript aus PHP fehl

$command = escapeshellcmd("python /home/forge/default/pdf.py " . $id); 
$output = shell_exec($command); 

Dies mit jedem PDF bis zu 250MB funktioniert gut, aber nicht mit einem größeren PDF, zum Beispiel 500 MB.

Wenn ich das Python-Skript direkt von der Befehlszeile aus aufrufen, funktioniert es gut und ist in ca. 5 Minuten abgeschlossen. Nur wenn es von shell_exec aufgerufen wird, schlägt es fehl.

Dies passiert in einem Laravel-Job in der Warteschlange, so weit ich weiß, verwendet nicht HTTP/PHP FPM, aber die Befehlszeile, die keine Zeitüberschreitung haben sollte?

Der Laravel-Warteschlangen-Worker wird mit dem Zeitlimit 0 (kein Zeitlimit) ausgeführt.

Gibt es noch etwas in den PHP CLI-Einstellungen, das dazu führen könnte, dass dies fehlschlägt? Weiß irgendwas, wo Fehler aufgezeichnet werden - es gibt nichts in failed_jobs Tabellen, nichts in laravel.log, und nichts wird von meiner Bugsnag Integration gefangen.

Da es OK von der Befehlszeile ausgeführt wird, vermute ich, es ist kein Python-Problem, sondern etwas mit dem Aufruf von PHP zu tun.

Der Server verfügt über 60 GB RAM und überwacht den Prozess über htop, es wird nie über 3% der RAM-Auslastung erhalten. Könnte es ein anderes fest codiertes RAM-Limit geben?

Ich benutze Laravel 5.4, Ubuntu-Server, Python 2.7.12.

Antwort

0

es ist, weil es eine Ausführungszeit und Speicherbegrenzung für Skript gibt, können Sie in der php.ini einchecken. normalerweise ist es max_execute_time = 30s. und Speicherlimit Standard 128M

; Maximum execution time of each script, in seconds 
; http://php.net/max-execution-time 
; Note: This directive is hardcoded to 0 for the CLI SAPI 
max_execution_time = 300 

und Speichergrenze

; Maximum amount of memory a script may consume (128MB) 
; http://php.net/memory-limit 
memory_limit = 1280M 
+0

Hmm. Ich hatte bereits den Speicher auf 25000 eingestellt. Ausführungszeit war 30 - aber ich habe viele Warteschlangenaufträge 3-5 Minuten ohne Problem? Ich habe gerade versucht, die Ausführungszeit auf 900 (15 Minuten) zu setzen und es scheiterte nach etwa 5 Minuten ... – samiles

+0

Ich habe versucht, sowohl 'php-cli' als auch' php-fpm' .ini Dateien auf 'memory_limit = 50000M' und 'max_execution_time = 3600', aber das Skript stirbt immer noch bei ungefähr 5 Minuten: \ Es gibt keine Fehler, es verschwindet einfach von oben und der Rest des Warteschlangenauftrags wird nicht ausgeführt. – samiles