2016-05-10 5 views
5

Ich bin der einzige Administrator der Datenbank. Ich möchte ein einmaliges Skript ausführen, das ungefähr 3800 gescannte Bilder benötigt (es wird bis zu 10.000.000 wachsen) und ein paar Miniaturen für jedes Bild erstellen, indem ich die exec() -Funktion von PHP benutze, um das externe Programm imagemagick zu erstellen Vorschaubilder.Maximale Ausführungszeit Fehler in PHP-Skript, ist dies eine gute Lösung, um es zu umgehen?

Ich habe das Skript erstellt, startete es und alles funktioniert perfekt! Alles geschieht auf meinem lokalen Entwicklungsserver. Das Skript benötigt ungefähr 11 Minuten, um Tausende von Miniaturansichten zu erstellen. Es ist eine einmalige Operation, die alle zwei Jahre durchgeführt wird, daher sind die Konsequenzen minimal.

So weit so gut. Hier ist, wenn ich Probleme habe.

Alles, was ich auf meinem lokalen Entwicklungsserver getan habe, habe ich auf dem Live-Server zu Testzwecken gemacht. Ich habe ein gemeinsames Host-Konto mit Hostgator. Das Ausführen meines 11 Minuten langen Skripts auf einem freigegebenen Host gibt mir den Fehler 'Maximale Ausführungszeit von 30 Sekunden überschritten ...'. Ich habe meine Nachforschungen angestellt und viele der in diesem Beitrag gefundenen Lösungen ausprobiert (Increase max execution time for php), um festzustellen, dass ich nichts tun kann, um die maximale Ausführungszeit eines Skripts auf einem gemeinsam genutzten Host zu ändern.

Ich stecke fest. Also, meine Frage ist, was ist die offensichtliche Lösung hier.

Ich habe überlegt, das Skript für jeweils 200 Bilder zu starten, die Seite automatisch zu aktualisieren und das Skript für die nächsten 200 Bilder erneut auszuführen usw., bis keine Bilder mehr vorhanden sind. Auf diese Weise bin ich sicher, dass die maximale Ausführungszeit von 30 Sekunden auf meinem freigegebenen Host eingehalten wird. Es sieht wie eine Lösung direkt von der Spitze meines Kopfes aus, aber ich bin nicht sicher, ob das ein NEIN ist, wenn ich in größere Probleme, zu viele Negative laufen werde.

Ist das das Offensichtliche Lösung? Hat jemand das gleiche Problem? Was hast du vorgeschlagen?

Dank

+2

Warum müssen Sie alle zwei Jahre Miniaturansichten erstellen? Sollte das einmalige Erstellen des Originalbildes nicht ausreichen, um auch das Thumbnail zu erstellen und es für immer zu belassen (bis es veraltet ist)? –

+2

Haben Sie überprüft, ob im CLI-Modus keine Ausführungszeit läuft? Normalerweise gibt es für CLI-Skripte "0" (kein Limit) für die max_execution_time - http://php.net/manual/en/info.configuration.php # ini.max-execution-time – codedge

+0

viele gemeinsame Hosts stoppen ein lang laufendes Skript, egal was Sie tun - also überprüfen Sie zuerst –

Antwort

7

Angenommen, Sie haben einen Grund tun, um die Thumbnails im Batch zu erstellen, anstatt sie bei jedem Hochladen von Bildern wie wurde vorgeschlagen, zu tun, würde ich genau das tun, was du hast - ein Skript verwenden, das sich erfrischt - außer dass ich keine feste Anzahl von Bildern einstellen würde.

Eher würde ich die Skript Zeit hat, sich nach jedem Bild, und aufhören, wenn es erreicht hat, sagen, 25 Sekunden:

$stop = time() + 25; 
while (time() < $stop) { 
    ...find image to process, process it. 
    if (finished()) { 
     die("OK"); 
    } 
} 
// Redirect to next batch of images 
die(Header('Location: ....')); 

jedoch Scheck mit Ihrem ISP tun, weil das Skript sein könnte entweder als Missbrauch des Dienstes angesehen, oder es könnte mit einem Angriff verwechselt werden. Erkundigen Sie sich auch, ob es eine bevorzugte Tageszeit für diese Art der Wartung gibt.

Eine andere, unartigere Art, das gleiche zu tun ist, das Skript für eine sehr kleine Anzahl von Bildern laufen zu lassen (möglicherweise eine einzige) jedesmal jemand schlägt die Homepage. Dies hat zur Folge, dass die zusätzliche Last aus dem Skript die tatsächliche Last auf dem Server nachahmt, wodurch peinliche Spitzen oder mysteriöse Nicht-Null-Basislasten vermieden werden. Sie müssen einen Weg finden, nie dasselbe Bild aus verschiedenen Instanzen des Skripts zu wählen, das parallel läuft (als ich dies tun musste, setzte ich eine Flagge in einer Datenbank).

+2

Denken Sie daran, _Track das letzte Bild erfolgreich verarbeitet_ und starten Sie von ihm die nächste Ausführung ... –

+0

Warum nicht nur eins nach dem anderen? Vor allem würde es alles vereinfachen – ArtisticPhoenix

+1

@ArtisiticPhoenix, die zu (in diesem Fall)> 3800 Server-Anfragen innerhalb ziemlich kurzer Zeit führen wird. Es wird den Server verlangsamen, da das Herstellen der Verbindung für jede Anforderung einige Zeit und CPU benötigt und wenn der Server nicht genug physische Ressourcen hat, in einem sehr schlechten Fall könnte es untergehen. – lolbas

Verwandte Themen