Modify

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 Gerhard Waldemair, 3 years ago

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.

comment:2 by noRiddle, 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 Gerhard Waldemair, 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 noRiddle, 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 noRiddle, 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

Modify Ticket

Action
as new The owner will remain somebody.

Add Comment


E-mail address and name can be saved in the Preferences .
 
Note: See TracTickets for help on using tickets.