Mr.Dauerschleife: For-Schleife nachträglich beenden

hallo,

kleines Problem. Schlimm ist es nicht, aber mal interessant zu wissen.
Ich lese mittels cURL ein Forum aus, anhand der id der threads. Schema: forum.php?id=[0-1000000]

Das Skript funktioniert folgendermaßen:
Wenn bei einer ID in den Beiträgen ein bestimmtes Muster vorhanden ist, wird direkt in eine Textdatei die ID geschrieben. Falls das Muster nicht zutrifft, wird keine Notiz geschrieben. Das ganze läuft in einer for-Schleife ab. Ich möchte die Daten nicht in einer Queue zwischenspeichern, es geht nicht um den Skriptaufbau und wofür er gut ist. Es geht um die gleich nachfolgende Frage.

Für das Auslesen benötigt es je ID und Bearbeitung 1 Sekunde. Das heißt, rund 1 Million Sekunden bis das Skript fertig ist. Das Skript liest jetzt jeden Datensatz in die Textdatei ein, und zwar die ID Nummern.

z.B.

0
1
2
3
4
5
7
9
20

etc.

Zwischendurch fällt der Computer aus oder die Webseite, also das aufrufende Skript, wird geschlossen. Sagen wir mal, weil eben was geändert werden soll. Das Skript stoppt - nicht. Es zählt weiter und schreibt die knapp 2 Wochen munter Zahlen in die Datei.

Wie kann ich ein solches Skript stoppen? Möglichkeit ohne root Rechte und Möglichkeit mit Rootrechten? max_execution_time greift nicht, da ein plausibles Ende vorhanden ist und sich nicht aufhängen kann. PHP muss ja auf nichts warten.

mfg,
Bernd

  1. Meine Herren!

    Wie kann ich ein solches Skript stoppen? Möglichkeit ohne root Rechte und Möglichkeit mit Rootrechten? max_execution_time greift nicht, da ein plausibles Ende vorhanden ist und sich nicht aufhängen kann. PHP muss ja auf nichts warten.

    Lies dir mal den Artikel zu Connection Handling durch. Insbesondere auch den weiterführenden Artikel zu connection_aborted().

    Du kannst den Prozess auch von mit einer Shell töten, dafür musst du dir die Prozess-ID holen (top oder htop) und ihn dann abschießen: (kill oder htop -> prozess mit tastatur auswählen -> "k"-Taste drücken -> sig_term oder sig_int auswählen.

    --
    “All right, then, I'll go to hell.” – Huck Finn
    1. Hallo!

      Lies dir mal den Artikel zu Connection Handling durch. Insbesondere auch den weiterführenden Artikel zu connection_aborted().

      Du kannst den Prozess auch von mit einer Shell töten, dafür musst du dir die Prozess-ID holen (top oder htop) und ihn dann abschießen: (kill oder htop -> prozess mit tastatur auswählen -> "k"-Taste drücken -> sig_term oder sig_int auswählen.

      Vielen Dank, das war genau das was ich gesucht habe!

      mfg

  2. hallo,

    Hi

    kleines Problem. Schlimm ist es nicht, aber mal interessant zu wissen.
    Ich lese mittels cURL ein Forum aus, anhand der id der threads. Schema: forum.php?id=[0-1000000]

    OK

    Das Skript funktioniert folgendermaßen:

    OK, das script arbeitet solange es ID findet vermutlich

    Für das Auslesen benötigt es je ID und Bearbeitung 1 Sekunde. Das heißt, rund 1 Million Sekunden bis das Skript fertig ist. Das Skript liest jetzt jeden Datensatz in die Textdatei ein, und zwar die ID Nummern.

    OK

    Zwischendurch fällt der Computer aus oder die Webseite, also das aufrufende Skript, wird geschlossen. Sagen wir mal, weil eben was geändert werden soll. Das Skript stoppt - nicht. Es zählt weiter und schreibt die knapp 2 Wochen munter Zahlen in die Datei.

    Streng genommen müsste es doch einen Fehler geben, wenn die ID nicht mehr abgerufen werden können oder?

    Wie kann ich ein solches Skript stoppen? Möglichkeit ohne root Rechte und Möglichkeit mit Rootrechten? max_execution_time greift nicht, da ein plausibles Ende vorhanden ist und sich nicht aufhängen kann. PHP muss ja auf nichts warten.

    Trotz vieler Fragen die noch offen sind in meinen Augen... Eine Bedingung einbauen, wenn die eintritt dann ein break;
    Also in welchen Fall soll denn dasw Script aufhören zu arbeiten? Und wann soll es die Arbeit wieder aufnehmen?

    1. Hallo!

      Streng genommen müsste es doch einen Fehler geben, wenn die ID nicht mehr abgerufen werden können oder?

      Ne, da PHP ja serverseitig ist. Den interessiert dann nicht, ob der client fehlt der die Seite anguckt. PHP ruft ja selbst über den root die Seite von dem Forum auf, über die for-Schleife.

      Trotz vieler Fragen die noch offen sind in meinen Augen... Eine Bedingung einbauen, wenn die eintritt dann ein break;

      Die Bedingung ist gewollt, dass das Skript nach 1 Million aufrufen aufhört, also nach ca. 2 Wochen. In meinem Fall hilft leider kein break. Es soll ja eigentlich genau das machen, ohne das ich da bin: arbeiten.

      Also in welchen Fall soll denn das Script aufhören zu arbeiten? Und wann soll es die Arbeit wieder aufnehmen?

      Für den Fall, dass ich zwischendurch Parameter ändern will, kann ich das Skript nicht manuell vom Browser aus stoppen z.B. durch einfaches schließen, da es serverseitig weiterarbeitet.

      UnitedPower hat die Lösung gepostet:
      http://forum.de.selfhtml.org/?t=218528&m=1505105

      Dennoch vielen Dank!

      mfg