• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Set execute Limit, wie lange?

jumbo125

Mitglied
Hallo miteinander

Ich habe ein Problem. Mein Script dient zum upload, resizen, zwischenspwichern und Datenbank Einträgen von riesigen Bilder mengen

Hier kommt man schnell an das Limit der time und bekommt einen Fehler

Nun möchte ich mit ini Set die time Limit erhöhen.
Jedoch weiß ich nicht wieviel zeit von Nöten IST. Je nach user upload können 400 Bilder oder auch nur 3 Bilder bearbeitet werden

Daher meine Frage, wie viel sollte man setzen?

Ev wäre es möglich die bereits abgelaufene zeit abzufragen und bspw. Bei geringen Verbleib sie um 1 Sekunde zu erhöhen.

Bspw. Am Ende jeder schleifen Wiederholung eine Abfrage function ausführen und wenn nur mehr 1 Sekunde über wäre, diese mit 2 Sekunden zu verlänger
 
Werbung:
Mich würde dabei erstmal interessieren wie genau ein solcher Prozess bei dir abläuft? So wie ich es jetzt verstehe laden die Nutzer Bilder auf einer Webseite hoch und direkt im Anschluss an den Upload wird das Bild konvertiert und ggfs. anderweitig verarbeitet, wobei letzteres besonders viel Zeit in Anspruch nimmt. Hierbei werden mitunter einige Dutzend Bilder gleichzeitig hochgeladen. Sehe ich das so richtig?
 
Genau erfasst

Vorher erfolgt serverseitig in php eine Bilder Prüfung und bereits davor eine Client prfung( jquery)
Daher werden nur die passenden Bilder verarbeitet
 
Werbung:
Die Bilder werden gepackt mit zip hochgeladen, da anhand der ordnerstruktur im zip file die Ordner erstellt werden und die dB Einträge erfolgen. Es gibt auch noch einen Einzel upload, hier muss man jedoch vorher die Infos händisch eintragen. Bei 400 Bilder dauert das zu lange
 
Ich würde empfehlen den Upload ohne anschließende Verarbeitung zu machen. Einfach nur hochladen, speichern, fertig. Per cronjob könntest Du neu hochgeladene Dateien dann entpacken und importieren. Dadurch musst Du nicht mit irgendwelchen Timeouts rechnen und die Nutzer, die die Dateien hochladen, müssen auch nicht mehr so lange warten.
 
Was ist ein cronjob?
Nach kurzer Internet Recherche habe ich herausgefunden das es Sichuan ein Script handelt, welches von einer anderen Seite ausgeführt wird?!
Stimmt das?
Das Script ist in joomla eingebunden, es fällt schwer darauf zu zugreifen

Wie muss das Script angepasst werden?
Funktioniert normaler php Code?
Wenn dieser Code in ein joomla article eingebunden ist, kann ich dann auf den article verweisen?
Ich müsste alle Daten zwischen speichern
Der User muss noch warten, der abläuft mit html request Client mäßig
 
Werbung:
Ein cronjob ist ein Dienst der auf einem Server läuft und Prozesse aufruft die "irgendetwas" machen - und das ohne, dass jemand etwas aufrufen oder machen muss dafür. cronjobs können in Zeitintervallen ausgeführt werden, wodurch sie sehr flexibel einsetzbar sind und es ermöglichen vom Web unabhängige Abläufe durchzuführen. cronjobs können sowohl PHP-Dateien (lokal per PHP-Parser, nicht übers Web) als auch alle anderen auf einem Sevrer zur Verfügung stehenden Programme ausführen.

Ob dein Webspace cronjobs anbietet musst Du bei deinem Webhoster fragen. Alternativ kannst Du auch sogenannte cronjob-Dienste im Web verwenden, die irgendeine URL bei dir aufrufen - allerdings sehe ich hier ebenfalls ein mögliches Timeout-Problem bei der Verarbeitung, weshalb ich eher zu ersterem Weg (direkt auf deinem Webspace/Server) raten würde.

Mit Joomla kenne ich mich leider (noch) nicht aus. Aus meiner Sicht müsstest Du bei deinem Joomla-Modul die Verarbeitung (entpacken etc.) weglassen. Ob und wie das geht kann ich dir nicht sagen da ich weder Joomla noch dein dafür verwendetes Modul kenne. Sobald das klar ist, müsstest Du die Verarbeitung der Dateien vorbereiten. Wie das genau in Zusammenhang mit deinem Joomla-Modul möglich und machbar ist, kann ich dir ebenfalls nicht sagen. Du müsstest das ggfs. in einem Joomla-Forum fragen, falls es bei dem Modul nicht dokumentiert ist.

Ich sehe inzwischen noch einige alternative Wege, ohne die Timeouts zu verändern, die jedoch allesamt nur möglich sind wenn dein Joomla-Modul das auch mitmacht ..
 
okay, das modul hab ich selbst geschriebn, das wäre alles "kein" problem, die anführungszeichen sind wegen der aufkommenden neurlichen arbeit -,-

inzwischen habe ich selbst noch eine möglichkeit und würde gerne deine meinugn dazu hören:
idee- die max-ime ermitteln. bei beginn des scripts mittels javascript einen sekundenzähler laufen lassen. erricht der die max.execute time(oder 2 sekunden) weniger, zur sicherheit, werden einfach mittles jquery die code snippet eingefügt, um die exeute time zu erweitern. debenbei läuft auch noch ein zweiter zähler mit, welcher die gesamt zeit miest. das dient dazu, das script nach 20min abzubrechen, weil da hats dann doch was... serverauslastung usw.
hier wäre mal so ein schnell script:
Code:
<script type="text/javascript" src="setting/jquery/jquery-1.11.1.js">//jquery einbinden </script>
               
    <script>
 
      var sekunden = 0;
      //sekunden zähler
      var gesamt_zeit = 0;
      //gesamt zähler, um das script irgendwann mal stoppne zu können
      var max_time=50;
     // max time bspw 50000, dass sind

    </script>
 
   <?php echo ini_get('max_execution_time');
           //aktuelle max time auslesen
     set_time_limit(20);
    // zeit um 20 erhöhen
     echo ini_get('max_execution_time');
       //zur kontrolle auslesen
       $end_fragez = "?";
       $end_klammer = ">";
echo '                         //jetzt schreiben
 
    <script>
         $(document).ready(function(){
   var zeit=setInterval(function () {time()}, 1000);
function time(){
   $("body").append("\n" + sekunden);
  sekunden++;
  gesamt_zeit++;
  //sekunden erhöhen pro sekunde
  var limit = '. ini_get("max_execution_time").'
  //max execution time ermitteln
  if(sekunden == (limit -1)){
  alert("zeit um 20 erweitert");
  //wenn nur mehr 1 sekunde vor der max_execut_time bleibt
      $("body").append("<?php set_time_limit(20);'.$end_fragez.$end_klammer.'");
      //in das document ini_set schreiben
    sekunden = 0;
    //sekunden zurücsetzen
}

if(gesamt_zeit == max_time){
//wenn gesamtZeit erreicht ist soll es beendet werden
clearInterval(zeit);
}
}
});</script> ';
  ?>
 
  1. echo ini_get('max_execution_time');
  2. //aktuelle max time auslesen
  3. set_time_limit(20);
  4. // zeit um 20 erhöhen
  5. echo ini_get('max_execution_time');
  6. //zur kontrolle auslesen
dient nur um die derzeitige einstellung zu wissen
 
Werbung:
Durch das Absenden eines AJAX-Requests an den Server wird auf dem Server ein vom eigentlichen Upload-Prozess unabhängiger Vorgang gestartet. Wenn Du in diesem per ini_set() eine Einstellung änderst wirkt die einzig auf den AJAX-Request, nicht aber auf den Upload-Prozess. Das kann also nicht funktionieren.
 
Das verstehe ich jetzt nicht ganz....
Der upload ist client seitig, d.h. ob 2mb oder 2GB, hier gibt es kein Time Limit.
das time_limit dient nur für das php script.
Sobal das File fertig upgeloadet ist, startet das php script.(es ist ja nur eine Datei)

ich bin zurzeit nicht zu hause, daher kann ich kein script bsp einfügen.
jedoch habe ich den upload nach diesem prinzip eingerichtet:
Code:
var client = null;
function uploadFile()
{
//Wieder unser File Objekt
var file = document.getElementById("fileA").files[0];
//FormData Objekt erzeugen
var formData = new FormData();
//XMLHttpRequest Objekt erzeugen
client = new XMLHttpRequest();
var prog = document.getElementById("progress");
if(!file)
return;
prog.value = 0;
prog.max = 100;
//Fügt dem formData Objekt unser File Objekt hinzu
formData.append("datei", file);
client.onerror = function(e) {
alert("onError");
};
client.onload = function(e) {
document.getElementById("prozent").innerHTML = "100%";
prog.value = prog.max;
};
client.upload.onprogress = function(e) {
var p = Math.round(100 / e.total * e.loaded);
document.getElementById("progress").value = p;
document.getElementById("prozent").innerHTML = p + "%";
};
client.onabort = function(e) {
alert("Upload abgebrochen");
};
client.open("POST", "upload.php");
client.send(formData);
}

dazu hätte ich auchn och eine Frage:
1. bei onload() wird dieses event ausgelöst, wenn die datei fertig geuploadet wird, oder wenn das php script fertig durchgelaufen ist?
2. das sind zwei vershciedene schuhe, der upload(ohne time_limit), php script nach dem upload(da schreibe ich meinen limit sdcript rein)
 
Ein Upload läuft nie Clientseitig. Ein Upload zu einem Server überträgt die Bytes der Daten zum Server, der sie entgegen nimmt. Zum Entgegennehmen der Daten startet der Server einen Prozess der bestimmten Einstellungen (auch PHP-Einstellungen) unterliegt. Gerade bei PHP-Scripten, die solche Uploads entgegen nehmen, kann es durchaus zu Timeouts kommt - nicht nur durch PHP, auch durch den Apache selbst.

D.h. in der Zeit in der der Upload läuft läuft auf dem Server ein Prozess der die Daten entgegen nimmt. Diesen Prozess kannst Du von außen - weder per AJAX-Request noch anderswie - nicht beeinflussen. Daher ist es auch nicht möglich hier eine Timeout-Einstellung während der Laufzeit hoch zu setzen.

Wenn ich es richtig sehe liefert die serverseitig laufende PHP-Datei die den Upload entgegen nimmt dann einen HTML-Code aus der per onload()-Event ein JavaScript im Browser des Nutzers startet (das wäre dann clientseitig ;) ). Das wird natürlich erst dann gestartet wenn der HTML-Code komplett beim Browser angekommen ist - nicht während der Upload noch läuft, da hat der Browser ja noch nicht mal eine Antwort bekommen.
 
Werbung:
Eine weiter Möglichkeit solche Timeoutprobleme zu minimieren ist, die weiterverabeitenden Funktionen nicht direkt in PHP aufzurufen, sondern per Request (multicurl). Für den Apache sind dies dann neue Verarbeitungsinstanzen die ihren eigenen neuen Timeout haben. So startet also die Verarbeitung jedes Bildes in einem eigenen Prozess, für den der standardtimeout normalerweise ausreichen sollte.
Dabei muss man allerdings etwas aufpassen. Die Prozesse laufen dann parallel und je nach Anzahl und Serverkapazität kann man den Apache durchaus an die Wand fahren. Also schauen, was sonst noch auf dem Server läuft und gründlich testen.
 
Zurück
Oben