Automatische Aktualisierung bei Ablauf -> per batch?

TribunM

Erfahrenes Mitglied
Hallo Freunde,

folgende Situation:

Ich habe einen kleinen Auktionsbereich erstellt. Die Artikel laufen nach einer vordefinierten Zeit aus. Nun ist es so, dass ich gerne eine Option anbieten möchte, die abgelaufene Artikel automatisch erneuert und überlege welches der beste Weg dafür ist.

Ich kann einen batch laufen lassen, der jede halbe Stunde überprüft, wie lange der Artikel noch läuft und bei knapp über 30 Minuten den dann automatisch erneuert. Aber geht das vielleicht auch anders bzw. eleganter?

Über eure Ansätze und Tipps würde ich mich freuen.

Greetz Tribbi
 
Soll der User die Auktion erneuern oder wie?

So richtig schlau werde ich gerade nicht, was du genau willst
 
Folgende Überlegungen:

Ein Auktionsartikel hat drei Zustände:
- Nicht verkauft, Auktion läuft
- verkauft, Auktion zu Ende
- nicht verkauft, Auktion ist abgelaufen

Nach Deiner Beschreibung gäbe es im Optimalfall keine abgelaufenen Auktionen im herkömmlichen Sinne. Sprich, wenn Du einen Cronjob machst, der alle Sekunde überprüft, ob in der Datenbank ein Artikel abgelaufen (und nicht verkauft) ist, wird die Auktionszeit wieder auf XX gestellt und der Artikel auf "läuft" aktualisiert.

Deine Auktionsanzeige zeigt doch lediglich jene Artikel an, die den Stand "Auktion läuft" haben.

mfg chmee
 
Ja stimmte schon.

Es gibt die Zustände: Auktion läuft, beendet (noch kein Unterschied ob verkauft oder nicht)

Und diesen Unterschied möchte ich machen. Also ein Flag setzten automatisch erneuern, der dann die Auktion so lange verlängert, bis das Flag gelöscht wird oder eben der Artikel verkauft ist.

Also muss man das schon per batch/cronjob machen. Nutze die relativ wenig, ist es egal wie oft man einen Cron laufen lässt, ich meine Performancetechnisch?

Im Moment sieht es so aus, dass der cron jede halbe Stunde die Auktionen überprüft die dieses erneuern Flag gesetzt haben und wenn die Zeit kleiner als 30 Minuten ist, erneuert der dieses um die gleiche Laufzeit + der Restlaufzeit. Also ist dieser Weg richtig?
 
Warum muss man immer alles mit einem Cronjob lösen wenn es in den regulären Seitenaufbau eingearbeitet werden kann?

Der erstbeste User, der den Artikel betrachtet, setzt den Status zurück und fertig. Wenn sich niemand den Auktions-Artikel ansieht, ist es doch völlig schnuppe, welchen Status er hat. Das kann man übrigens auch machen, wenn mehrere Artikel gelistet sind.
 
Nun hört sich nach einer recht einfachen Aufgabe an ;)

(1) eine php-Datei, die die MySQL-Tabelle nach Objekten abfragt, die das Flag "abgelaufen" haben. Alle gefundenen Einträge bekommen eine neue Auktionsendzeit und das Flag wird gelöscht.
(2) die Auktionsanzeige benutzt die gleiche Tabelle und zeigt nur jene Einträge, bei denen das Flag nicht gesetzt ist (und sortiert zB nach Auktionsende)

(!) Ein cron an sich ist nicht ressourcenhungrig. Und wenn Du Deine Abfrage aus (1) eben nur alle X Sekunden machst (solange, wie die Abarbeitung dauert), dann sollte es unkritisch sein. Ein Webserver hat eh nicht soviel zu tun :)

mfg chmee

(@saftmeister: Damit wäre ja der Neubeginn einer beendeten Auktion immer von Seiten-Visits abhängig.. Ich würde logischerweise das Auktions-Universum entbunden von Userklicks lassen..)
 
Zuletzt bearbeitet:
stimme chmee zu das webseitenabhängig zu machen, ist nicht praxistauglich. Alleine deshalb weil in der Suche die Zeit angezeigt wird und diese dann auch schon diesen Abgleich durchführen müsste.

Dann bleibe ich wohl doch besser bei der Cronvariante. War mein Ansatz ja nicht verkehrt.

Merci
 
Wenn es eine EMail-Benachrichtigung geben soll, stimme ich zu, ansonsten ist das anpingen der DB wohl sinnlos, wenn ein Cronjob nix zu tun hat...

Imho kann CRON aber nur minuten-genau laufen, Sekunden-Angaben sind in den seltensten Fällen möglich, zu mindest kenne ich keine Implementierung, die sekunden-bezogen arbeitet.

Wenn dir ein Zeitfenster von im ungünstigsten Fall 59 Sekunden ausreicht, ist cron eine Möglichkeit, das du realisieren.

Aber: Ob man den Status durch Cron ändern lässt, oder vor den eigentlichen SELECTS in der Seite pauschal ein UPDATE-Statement baut, was den Job erledigt, ist doch wohl das gleiche. Ich würde es in ein Include-Script packen und fertig.

Cron ist ohne sonstige Aktionen, die auf dem Status aufbauen wohl Kanonen auf Spatzen - meine Meinung :-)
 
Meine Meinung: Der Cron soll ja lediglich beendete Auktionen wieder anstoßen, ob da nun zwischen beendet und wiedereingestellt 10sek oder 1min vergeht, halte ich für unproblematisch, 30 Minuten wären mir zuviel. Crontab ist sicherlich nicht Kanonen auf Spatzen. Einen Javaserver dazu zu starten hielte ich für overdosed :)

Saftmeister, wie würdest Du denn ein selbstlaufendes System aufbauen? Sowas abhängig zu machen von Klicks halte ich für wenig sinnvoll.

mfg chmee
 
Letztendlich ist das Geschmackssache und hängt davon ab, wie schnell TribunM Resultat sehen will. Er hat nichts von einer Benachrichtung per E-Mail geschrieben auch nicht von sonstigen Aktionen, die durchgeführt werden sollen, wenn die Aktion beendet ist (automatisiert - versteht sich). Daher halte ich meinen Ansatz für resourcen-schonender - wenn man lediglich das Umschalten von Status X auf Status A als Use-Case in Betracht zieht.

Ich möchte auch erklären warum:

- Ein Cron-Job muss zwangsläufig, auch wenn es nichts zu tun gibt, eine Verbindung zur Datenbank öffnen.
- Er muss zwangsläufig, auch wenn es nichts zu tun gibt, entweder SELECTs ausführen, die keine Resultate liefern oder ein UPDATE ausführen, was keine Änderungen vornimmt. Bei beiden Vorgängen sollte man - um es korrekt zu machen - ein LOCKING durchführen (im Falle von MySQL sogar die ganze Table), und das obwohl es keine Garantie gibt, das sich was ändert.


Ich sehe keinen Grund, warum das permanent immer wieder zyklisch gemacht werden muss, wenn es niemanden gibt, den es interessiert, ob der Artikel nun Status X oder A hat.

Ich gehe immer noch davon aus, das TribunM "nur" den Status ändern will und eine Benachrichtigung oder andere automatisierte Vorgänge keine Relevanz haben.

Vielleicht bin ich aber nur etwas borniert, weil ich normal in C programmiere und Ressourcen schonen einen hohen Stellenwert hat :-)

Als denn
 
Zurück