2011-01-11 12 views
2

Ich habe ein PHP-Skript, das mit einem Cron-Job auf meinem Server aufgerufen wird, um hochgeladene Video-Conversions auszuführen. Es funktioniert gut für einige Videos, aber wenn das Video ein bisschen größer ist (21MB zum Beispiel) bekomme ich eine 500 Internal Server Error und keine andere Ausgabe.PHP Interner Server Fehler 500 bei der Verwendung von ffmpeg zum Konvertieren von Dateien

Ich denke, dass es möglich ist, dass dieses Problem wegen Timeouts war, also habe ich set_time_limit(9000) und auch ini_set('max_execution_time', 9000) hinzugefügt, um dies zu verhindern, aber das löst nichts.

ich ausführen ffmpeg mit:

$cmdOut = shell_exec ('ffmpeg -y -i [....] 2>&1'); // [....] is the rest of the command, it works fine with other videos, so i assume that it works ok. 
echo print_r($cmdOut); 

jedoch keine Ausgabe ist, und die folgenden Zeilen nicht ausgeführt werden, so dass nach dem shell_exec das Skript abgebrochen.

am Apache error_log Suche ich diese Zeile sehen:

[Wed Jan 12 00:12:46 2011] [error] [client xx.xxx.xxx.xxx] Premature end of script headers: index.php 

Aber es gibt keine weiteren Hinweise. Kann mir jemand helfen?

Für Testzwecke ich dieses PHP-Skript erstellt haben:

<?php 
set_time_limit(300); 
sleep(120); 
echo "SLEEP OUT"; 
?> 

Dieses Skript führt zu einem „500 Internal Server Error“, wenn ich es von meinem Web-Browser aufrufen, so nehme ich an, dass set_time_limit nicht funktioniert. Wenn ich schlafe (30), funktioniert es und es gibt den Text SLEEP OUT zurück. Die Frage ist also, wie kann ich den Timeout-Fehler vermeiden, um ein PHP-Skript auszuführen, das 5 oder 10 Minuten dauert?

HINWEIS: Server ist CentOS mit Apache und PHP als FastCGI-Modul.

+1

Warum rufen Sie dieses Skript von einem Webserver auf? Kannst du nicht einfach CLI verwenden? Es wäre besser für die Videokonvertierung geeignet. – netcoder

+0

@Yehonatan - jetzt sprechen wir nicht mit anderen Benutzern so. Sei nett, sei höflich. – Kev

+0

@Kev: Ja, aber er bekommt 500 HTTP Response Code, was bedeutet, dass er von einem Webserver ausgeführt wurde. – netcoder

Antwort

1

Benötigen Sie wirklich die Konsolenausgabe für alles? Ich stieß einmal auf ein ähnliches Problem, obwohl ich die primäre php.ini selbst änderte, um das Ausführungszeitlimit zu verlängern, würde es immer noch zufällig fallen, wenn ich ffmpeg durch exec mache. Verwundete bis > /dev/null & es zu stoppen Ausführung zu stoppen, dann hat es gut funktioniert, unabhängig davon, was geworfen wurde.

+0

Willst du damit meinen, dass ich "2> & 1" am Ende meines Befehls durch ">/dev/null &" ersetzen muss? Ich brauche nicht die Konsolenausgabe, es ist nur zu wissen, was mit dem Befehl falsch ist ... Ich habe auch bemerkt, dass, selbst wenn ich 500 Fehler in meinem Webbrowser bekomme (es dauert etwa 45 Sekunden, um diesen Fehler zu bekommen), der Prozess läuft weiter, weil ich sehen kann, dass die Dateigröße der erstellten Ausgabedatei jedes Mal wächst ... – FidoBoy

+0

Ich habe ">/dev/null &" in meinem Befehl hinzugefügt und das Ergebnis ist dasselbe, 500 HTTP-Fehlerantwort :( – FidoBoy

+0

Ja, '>/dev/null 2> & 1 &' könnte besser sein, sagt ihm, dass er alle Fehler/std Ausgaben (2> & 1) nach/dev/null (das schwarze Loch) routen und als Hintergrundaufgabe ausführen soll (&) Manche Leute analysieren die Konsolenausgabe, um verschiedene Informationen über die verarbeitete Datei zu erhalten, obwohl ich dafür http://ffmpeg-php.sourceforge.net/index.php verwenden würde, aber es kann keine Conversions durchführen obwohl, nur Informationen und Bildschirmobergrenzen, so muss immer noch die Konvertierung über exec laufen. – Phoenix

1

Endlich habe ich das selbst gelöst. Ich habe eine Problemumgehung entwickelt, um die Timeout-Beschränkung in PHP zu umgehen. Meine Lösung besteht darin, das PHP-Skript mit dem Befehl php-cli mit einem geplanten Cron-Job auszuführen. Auf diese Weise habe ich nicht das Zeitlimit bei der Ausführung meines Skripts und es funktioniert gut.

Danke an alle, speziell an Phoenix für ihre Zeit und Ideen zu diesem Thema.

Verwandte Themen