Pause im Script - wegen Laufzeitbeschränkung - wie geht das?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Pause im Script - wegen Laufzeitbeschränkung - wie geht das?

    Ich suche nach einem Ansatz wie ich ein script, welches immer wegen Laufzeitbeschränkung vom Server abgebrochen wird pausieren lassen kann bzw. in Etappen ausführen lasse.

    Innerhalb einer Schleife werden von unterschiedlichen Quellen Daten gesammelt. In jedem Schleifendurchgang eine andere Quelle. Die Quelle der Daten ändert sich bei jedem Durchgang und das Ausführen des Durchganges überschreitet die erlaubte Länge. Wie kann man so ein Problem angehen?

  • #2
    Ich denke, dass die einfachste Möglichkeit die ist, mit microtime() die Zeit zu messen. Wird diese kritisch, so speichert das Skript den aktuellen Stand, bricht ab und wird neu aufgerufen.
    Das Neuaufrufen machst du mittels JavaScript oder META-Refresh. Evtl. geht auch header(), bloß weiß ich nicht, wie das mit den Browsern ist. Ob die dann nicht mit der Meldung "Die aufgerufene Seite leitet die Anfrage so um, dass sie nie beendet werden kann" das Handtuch werfen.

    Kommentar


    • #3
      Werden diese Daten on Demand beötigt oder in unregelmäßigen oder regelmäßigen Abständen?

      In letzterem Fall empfehle ich, das ganze lokal (XAMPP zb) laufen zu lassen (So mache ich das momentan auch bei einem ähnlichen Vorhaben).
      In ersterem Fall gäbe es die Möglichkeit, das ganze mit ignore_user_abort()
      und manuellen HTTP-Requests zu machen, die sofort wieder geschlossen werden (serverseitig natürlich).

      Kommentar


      • #4
        Original geschrieben von Manko10
        Ich denke, dass die einfachste Möglichkeit die ist, mit microtime() die Zeit zu messen. Wird diese kritisch, so speichert das Skript den aktuellen Stand, bricht ab und wird neu aufgerufen.
        Das Neuaufrufen machst du mittels JavaScript oder META-Refresh. Evtl. geht auch header(), bloß weiß ich nicht, wie das mit den Browsern ist. Ob die dann nicht mit der Meldung "Die aufgerufene Seite leitet die Anfrage so um, dass sie nie beendet werden kann" das Handtuch werfen.
        Javascript ist nicht möglich, da es nicht per Browser, sondern per cron aufgerufen werden soll. Tatsächlich stellt sich die Frage wie der aktuelle Zustand gespeichert werden soll. Ich dachte an eine Pause nach jedem Schleifendurchgang. Blos wie speichere ich den Zustand?

        @$_Baker
        Die Daten werden in regelmäßigen Abständen überprüft.

        Zuletzt geändert von janein; 18.04.2008, 17:16.

        Kommentar


        • #5
          Wenns doch eh per Cron aufgerufen wird, dann setz das Timelimit eben höher ... oder direkt auf nicht limitiert.
          [FONT="Helvetica"]twitter.com/unset[/FONT]

          Shitstorm Podcast – Wöchentliches Auskotzen

          Kommentar


          • #6
            Du könntest eine Datei als Zwischenstandpuffer benutzen zb, und die Variante mit den kurzen HTTP-Requests laufen lassen.
            PHP-Code:
            fsockopen(serverdaten usw);
            fputs(HTTP GET...) 
            Cronscript:
            PHP-Code:
            ignore_user_abort(true);
            //Cronjob 
            Pseudocode

            Bitte auch die Dokumentation zu ignore_user_abort beachten!

            Kommentar


            • #7
              Wie sich das so anhört, handelt es sich um Backup-Lösungen. Benutze doch Tools, wie MySQLDumper. Die haben solche Sachen schon implementiert.

              Kommentar


              • #8
                Ich nehme eher an, das er als Quellen auch Html-Seiten hat, somit wäre nichts mit dem Dumper

                Und in Schleifen mit regulären Ausrücken aus diesen Inforamtionen holen kann dauern und performancelastig sein.

                Kommentar


                • #9
                  Original geschrieben von $_Baker
                  Ich nehme eher an, das er als Quellen auch Html-Seiten hat, somit wäre nichts mit dem Dumper

                  Und in Schleifen mit regulären Ausrücken aus diesen Inforamtionen holen kann dauern und performancelastig sein.
                  Genau so ist es ... :-)

                  Was macht denn usleep(); wird die Ausführung des scriptes tatsächlich unterbrochen? Dann könnte man ja
                  PHP-Code:
                                           foreach ($result as $i =>$value )
                                                      {
                                                       
                  fopen() ...
                                                        
                  usleep(60000000)
                                                       } 

                  Kommentar


                  • #10
                    Wenn du schon so utopische Werte angibst, warum dann nicht direkt sleep. Mal ganz abgesehen von der Tatsache, dass das Script dann noch länger läuft und einem vorhaben wohl nicht entsprichst. Aber ich frage einfach nochmal: Wenn das Script doch eh als Cronjob läuft, warum setzt du die maximale Laufzeit nicht einfach auf unbeschränkt?
                    [FONT="Helvetica"]twitter.com/unset[/FONT]

                    Shitstorm Podcast – Wöchentliches Auskotzen

                    Kommentar


                    • #11
                      Original geschrieben von unset
                      Wenn du schon so utopische Werte angibst, warum dann nicht direkt sleep. Mal ganz abgesehen von der Tatsache, dass das Script dann noch länger läuft und einem vorhaben wohl nicht entsprichst. Aber ich frage einfach nochmal: Wenn das Script doch eh als Cronjob läuft, warum setzt du die maximale Laufzeit nicht einfach auf unbeschränkt?
                      Ich finde das ist keine saubere, weil riskannte Lösung.

                      Wieso utopische Werte? Das ist eine Minute.

                      Also sleep() ruft das script nicht neu auf, sondern läßt es weiter und somit länger laufen? Dann ist das nicht meine Lösung.

                      Vielleicht mache ich es so. Die Schleifenlänge in einer Datei speichern und jede Minute das script aufrufen, so lange wie die Schleifenlänge 0 ist. Nur wie rufe ich das script immer wieder auf?
                      Zuletzt geändert von janein; 18.04.2008, 17:58.

                      Kommentar


                      • #12
                        Wenn man nicht programmieren kann, dann stimmt das wohl, vergessen wir den Vorschlag für dich also schnell wieder.

                        Dann leg eben mehrere Jobs an, die jeweils nur eine Quelle auslesen. Oder halt noch weiter zerstückelt, so dass es in die eingestellte Laufzeit passt.

                        Alternativ würde ichja zum Shared Memory raten, um zu speichern wo das Script das letzte mal war, aber nachher ballerst du alles kaputt.
                        [FONT="Helvetica"]twitter.com/unset[/FONT]

                        Shitstorm Podcast – Wöchentliches Auskotzen

                        Kommentar


                        • #13
                          Original geschrieben von janein
                          Wieso utopische Werte? Das ist eine Minute.
                          Eine Minute ist utopisch. Mehr als das.
                          Im Übrigen ist eine Minute 6000000 und nicht 60000000.
                          Zuletzt geändert von Manko10; 18.04.2008, 18:19.

                          Kommentar


                          • #14
                            Mir ging es mehr um den Wert, nicht, was dabei rauskommt. Wenn ich keine Microsekundengenaue angabe mache, dann nehm ich auch keine Funktion, die Microsekunden erwartet.
                            [FONT="Helvetica"]twitter.com/unset[/FONT]

                            Shitstorm Podcast – Wöchentliches Auskotzen

                            Kommentar


                            • #15
                              Wenn du dein Skript forkst, beginnt die Ausführungszeit dann von vorn? Probier das mal aus. Dann könntest du nach jedem Schleifendurchlauf prüfen, ob du noch Zeit genug hast. Wenn du kurz vorm Limit stehst, forkst du das Skript und terminierst den Vaterprozess.
                              Ich kann mir aber vorstellen, dass die Ausführungszeit für das Kindskript übernommen wird. Musst du mal ausprobieren!

                              Kommentar

                              Lädt...
                              X