Andreas: zeitlich abhängige Aktionen

Hallo,
ich habe eine Terminverwaltung mit php erstellt und möchte x-Tage vor einem Ereignis eine Erinnerungsmail absenden.
Meine erste Idee war per Cronjob einmal täglich ein Script auszuführen. Doch wie funktioniert das mit dem Cronjob? Welche Anforderungen gibt es an das Script? Welche (kostenlose) Dienste gibt es?

Gruß Andreas

  1. Hello,

    Meine erste Idee war per Cronjob einmal täglich ein Script auszuführen. Doch wie funktioniert das mit dem Cronjob? Welche Anforderungen gibt es an das Script? Welche (kostenlose) Dienste gibt es?

    Dazu musst Du auf irgend einem Server Chronjobs oder "Aufgaben" einrichten können.
    Dieser muss ein Werkzeug zur Verfügung bekommen, das dann die Arbeit durchführt.

    Wenn alle Server auf einer Maschine liegen, ruft der Chronjob-Prozess den passenden Interpreter für Dein Script auf (im Hintergrund) und dieses führt die Aufgabe durch, so als hättest Du es über HTTP aufgerufen.

    Wenn Deine Seite Besucher hat, kannst Du den Startaufruf aber auch z.B. in die Startseite einbauen. Das kostet auch nicht viel Power. Die eigentliche Aktion wird dann aber nur gestartet, wenn sie nicht schon erledigt wurde...
    Du benötigst dafür aber die Möglichkeit, einen Systemaufruf durchführen zu können und eine Instanz des Interpreters in den Hintergrund zu laden, damit Dein Besucher nicht auf Erledigung des Jobs warten muss.

    Welches OS hast Du für den Webserver?
    Welchen Webserver hast Du?
    Hast Du zugriff auf die Konsole des OS?
    Darft Du Systemprogramme ausführen (lassen)?
    Darfst Du Chronjobs einrichten? (dann solltest Du auch den Interpreter aufrufen dürfen)

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. Hallo,
      habe ein Webpack L bei HostEurope, bin ziemlich sicher dass da kein Cronjob enthalten ist, die gibts erst bei dedicated Webspace.
      Ich habe mal hier im Foum gelesen dass es Dienste bzw. Anbieter gibt die kostenlos Cronjob ausführen lassen können, Z.B. freenet oder ähnlich.

      Ich hab mir auch überlegt, dass ich in die index.php diese Prüfung der Serverzeit vornehme, z.B. wenn ich täglich um 0:00 Nachts das Script ausführen lassen möchte, könnte ich bei jedem laden der Datei prüfen ob 0:00 ist oder später. Wenn Prüfaktion gestartet ist setze ich einfach ein Flag, damit das System nicht überlauft.
      Wenn ein Robot oder Besucher halt erst morgens um 7:00 die Seite besucht wird das Script halt erst dann ausgeführt.
      Was meint ihr, sowas wäre doch sicherlich auch machbar, bei einer halbwegs häufig besuchten Seite.

      Gruß Andreas

      1. hi,

        Ich habe mal hier im Foum gelesen dass es Dienste bzw. Anbieter gibt die kostenlos Cronjob ausführen lassen können, Z.B. freenet oder ähnlich.

        google: cronjob gratis

        Bei solchen Diensten kannst du idR. einen HTTP-URL angeben, unter dem dein Script aufrufbar ist.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
      2. Hello,

        Was meint ihr, sowas wäre doch sicherlich auch machbar, bei einer halbwegs häufig besuchten Seite.

        Du hast die Fragen bisher nicht beantwortet, oder hatte ich gar vergessen, sie zu stellen? *gg*
        Nö, hab gerade nochmal nachgeschaut.

        Wenn Du exec() benutzen darfst und den PHP-Interpreter damit aufrufen darfst, und die Ausführungszeit beeinflussen darfst, hast Du schon gewonnen. Dann brauchst Du nur noch zwei zeitlich statistisch gut verteilte Besucher am Tag, und alles wird gut :-))

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. Halo Tom,
          sorry, hab es nicht kapiert und meine beste Strategie war es einfach zu ignorieren :)
          Wie erfahr ich ob ich exec() ausfürhen kann? Ist das ein PHP Befehl?

          Gruß Andreas

          1. Hello,

            sorry, hab es nicht kapiert und meine beste Strategie war es einfach zu ignorieren :)
            Wie erfahr ich ob ich exec() ausfürhen kann? Ist das ein PHP Befehl?

            Wie erfährst Du, ob exec() eine PHP-Funktion ist?
            < http://de3.php.net/manual/en/index.php>
            oder
            http://de3.php.net/manual/en/ref.exec.php
            oder
            http://de3.php.net/manual/en/function.exec.php

            Und ob Du es benutzen darfst?
            Einfach mal ausprobieren mit einem einfachen Kommando für das jeweilige OS, auf dem Dein PHP läuft.

            Wenn das dann ein erwartetes Ergebnis gibt, darfst Du es benutzen.

            Harzliche Grüße vom Berg
            http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

            1. Hi,
              echo exec('whoami');
              gibt "nobody" auf dem Bildschirm aus.
              Bedeutet das ich kann exec() einsetzen?

              Gruß Andreas

              1. Hallo Andreas.

                echo exec('whoami');
                gibt "nobody" auf dem Bildschirm aus.
                Bedeutet das ich kann exec() einsetzen?

                Ja, „nobody“ ist hier also der Username, unter dem der Apache läuft.

                Einen schönen Montag noch.

                Gruß, Ashura

                --
                sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
                [HTML Design Constraints: Logical Markup]
                1. Hello,

                  echo exec('whoami');
                  gibt "nobody" auf dem Bildschirm aus.
                  Bedeutet das ich kann exec() einsetzen?

                  Ja, „nobody“ ist hier also der Username, unter dem der Apache läuft.

                  Der nächste Schritt wäre nun, zu prüfen, ob Du mittels Exec einen PHP-Interpreter starten darfst.

                  <?php  ### start_process.php ###
                  $pid=exec("/usr/local/bin/php run.php > /dev/null & echo $!",$_ergebnis,$error);

                  echo "<pre>\n";
                  echo "Prozess-Nummer: $pid \n";
                  echo "Fehlercode: $error \n";
                  echo "</pre>\n";

                  ?>

                  und

                  <?php  ### run.php ###

                  file_put_contents('testausgabe.txt','Prozess konnte gestartet werden\n"');

                  ?>

                  Erstmal so zum Testen.

                  Dann wäre noch spannend, ob Du auch set_time_limit(0) verwenden darfst.
                  http://de2.php.net/manual/de/function.set-time-limit.php

                  Dann könntest Du nämlich einen Prozess abspalten, der im Hintergrund dauernd läuft und seinerseits wieder Prozesse ausführen lassen kann.

                  Harzliche Grüße vom Berg
                  http://www.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau

      3. Hallo.

        habe ein Webpack L bei HostEurope, bin ziemlich sicher dass da kein Cronjob enthalten ist, die gibts erst bei dedicated Webspace.

        Chronisch ungünstig.
        MfG, at

  2. Was genau meinst du? Ein Cronjob ist einfach ein Befehl der von einem 24/7 laufenden Daemon ausgeführt wird. Der muß dann halt ein php-sript aufrufen, welches dann alle Termine durchgeht und schaut ob die einer Errinerung bedürfen. Was meinst du mit Dienste? Ein Cron-Daemon an sich ist natürlich kostenlos, aber niht jeder hat bei seinem Webpacket Cronjobs drin. Wir können dir ja nicht sagen welchen Leistungsumfang dein Paket hat.