Opened 4 years ago
Last modified 3 years ago
#2252 new Neues Feature
Simulierte Cron Jobs für ständige DB-Abfragen
| Reported by: | noRiddle | Owned by: | somebody |
|---|---|---|---|
| Priority: | normal | Milestone: | |
| Component: | Shop | Version: | 2.0.7.0 |
| Keywords: | Cc: | ||
| Blocked By: | Blocking: |
Description
Wie ich hier
MODUL: Produkterinnerung für modified eCommerce Shopsoftware Antwort #384
unter "Zusatzidee:" mal versucht habe darzulegen fände ich folgende Idee interessant und bedenkenswert:
Man lege eine DB-Tabelle an
CREATE TABLE simulated_cron_records ( application varchar(32) NOT NULL, last_executed date DEFAULT NULL, PRIMARY KEY (application) ) ENGINE=MyISAM DEFAULT CHARSET=utf8
und trage das Ausführen von Skripten die eigtl. nur einmal am Tag ausgeführt zu werden brauchen in diese Tabelle ein.
Die jeweiligen Skripte schauen dann lediglich, ob sie am heutigen Tag bereits ausgeführt wurden und wenn ja werden sie nicht erneut ausgeführt.
Das wäre z.B. sehr sinnvoll für das momentan noch bei jedem Seitenbaufruf ausgeführte xtc_expire_specials().
Auch für weitere, auch zukünftige, Aufgaben oder Custom-Applikationen wäre eine solche Vorgehensweise sinnvoll. Z.B. für Skripte die nicht lieferbare Artikel automatisch auf wieder lieferbar setzen wenn sich der Bestand von 0 auf X erhöht hat.
Für alle Skripte die nicht auch eine Uhrzeit sondern lediglich Tage berücksichtigen müssen wäre eine solche Implementation Klasse und würde die Performance des Shops verbessern.
Beispiel-Skript:
<?php
/*********************************
* my_application_script.php
*
*
*
*********************************/
$last_exec = NULL;
$mas_act = false;
$mas_last_exec_qu_str = "SELECT last_executed FROM simulated_cron_records WHERE application = 'my_application_script' AND last_executed IS NOT NULL";
$mas_last_exec_qu = xtc_db_query($mas_last_exec_qu_str);
if(xtc_db_num_rows($mas_last_exec_qu) == 1) {
$mas_last_exec_arr = xtc_db_fetch_array($mas_last_exec_qu);
$last_exec = $mas_last_exec_arr['last_executed'];
//do it only once a day
if($last_exec < date('Y-m-d', time()))
$mas_act = true;
}
if(is_null($last_exec) || (isset($mas_act) && $mas_act === true)) {
//do what ever this script is supposed to do
//update set database record
xtc_db_query("INSERT INTO simulated_cron_records (application, last_executed) VALUES('my_application_script', NOW()) ON DUPLICATE KEY UPDATE last_executed = VALUES(last_executed)");
}
?>
Gruß,
noRiddle
Attachments (0)
Change History (5)
comment:1 by , 3 years ago
comment:2 by , 3 years ago
Bzgl. Command Line gebe ich dir Recht was Timeouts usw. betrifft.
Ich finde meine Idee die du treffend Pseudo Cronjob nennst deshalb gut weil sie 1. unbedarfte User nicht in das Problem bringt nicht zu wissen wo und wie sie auf Ihrer Server-Umgebung einen Cron Job anlegen können und 2. weil sie ja lediglich Jobs ausführen soll die bislang ohnehin der Shop bei jedem Seitenaufruf macht oder gemacht hätte.
Gruß,
noRiddle
comment:3 by , 3 years ago
Ich verstehe was du willst, aber ich will von den Aufgaben die jetzt schon bei jedem Aufruf gemacht werden komplett weg. Das kostet nur Performance.
Deshalb einen richtigen Cronjob Manager.
da können dann auch sowas wie in einem anderen Ticket schon mal angeregt wurde, eine DB Maintenance gemacht werden uvm.
comment:4 by , 3 years ago
Ich freue mich, daß meine Anregungen auf Interesse stossen, und auch bereits bei euch angedacht sind.
Ein Cronjob Manager: spannend
Gruß,
noRiddle
comment:5 by , 3 years ago
Nur falls Ihr nicht daran denken solltet:
Das Update der Currencies mittels quote_primary_currency() könnte man mit aufnehmen und somit automatisieren.
Gruß,
noRiddle

Die Idee ist grundsätzlich gut und steht schon auf unserer Roadmap. Allerdings halte ich nichts von einem Pseudo Cronjob.
Wenn dann muss ein richtiger Cronjob eingerichtet werden der per CLI ausgeführt wird und damit ganz andere Timeouts hat.