Datetimes vergelijken cronjob
Ik moet een uitnodiging systeem maken en dit gaat me prima af maar over het vergelijken en versturen van een uitnodiging e-mail zou ik graag wat advies inwinnen.
Klant besteld in een webshop, mijn extensie stuurt de datetime van wanneer bestelling verzonden is door naar mijn database.
1. 03-03-2020:11:39:05
Klant kan in zijn account aangeven wanneer uitnodiging mail verzonden moet worden dus na 1 uur of in dagen.
Nu wil ik een cronjob deze tijden laten vergelijken en wanneer ze matchen een invite versturen.
Ik heb het nu met datums gemaakt en werkt wel maar dan stuurt die dus gewoon de invite als de datums matchen en niet precies 1 uur of precies 2 dagen.
Ik kan toch niet de cronjob elke seconden laten runnen om deze check te doen, dit zal een keer mis gaan en kost veel resources denk ik steeds?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$SentCyclus = getDomainSentInviteCyclusByDomainId($rows['domain_id']); // 1 hour - 2 days etc..
$orderCompletedDateTime = $rows['created_at']; // 2020-02-17;16:00
// convert datetimes to normal dates.
$OrderCompletedDate = new DateTime($orderCompletedDateTime);
$OrderCompletedDate = $OrderCompletedDate->format('Y-m-d'); // 2020-02-17
$CompareDate = date('Y-m-d', strtotime($OrderCompletedDate. ' + '.$SentCyclus.' days'));
if ($CompareDate == date('Y-m-d'))
{
// Today is the day to sent the invite.
}
?>
$SentCyclus = getDomainSentInviteCyclusByDomainId($rows['domain_id']); // 1 hour - 2 days etc..
$orderCompletedDateTime = $rows['created_at']; // 2020-02-17;16:00
// convert datetimes to normal dates.
$OrderCompletedDate = new DateTime($orderCompletedDateTime);
$OrderCompletedDate = $OrderCompletedDate->format('Y-m-d'); // 2020-02-17
$CompareDate = date('Y-m-d', strtotime($OrderCompletedDate. ' + '.$SentCyclus.' days'));
if ($CompareDate == date('Y-m-d'))
{
// Today is the day to sent the invite.
}
?>
Zelf opgelost door simpelweg (Y-m-d: H:i) te gebruiken overal. Lange dagen maken je onscherp
Gewijzigd op 03/03/2020 12:24:59 door Furio Scripting
Je zegt daar in comments "1 hour, 2 days", maar $CompareDate gaat altijd uit van dagen (x days)?
Daarbij, wat als je deze frequentie on-the-fly verandert (als dat kan)? Dan veranderen ineens de datums/tijdstippen waarop (eerder) geplande uitnodigingen worden verstuurd? Dat is mogelijk niet wenselijk?
Tevens, als je dan toch DateTime gebruikt, waarom dan niet ook DateInterval (of DateTime->diff())?
En waarom draai je het niet om, in plaats van op elk moment controleren (+uitrekenen) of een bepaald tijdstip al is bereikt, plan je een verzenddatum in met de instellingen van dat moment. Hierbij bereken je dus direct het resultaat.
Vervolgens zorg je dat je elke 5-10-15-whatever minuten een cron uitvoert die controleert of er verzendmomenten zijn die in het verleden liggen van berichten die nog niet verstuurd zijn. Dit is ook minder foutgevoelig dan een exacte match die om wat voor reden dan ook kan passeren en dan dus vervolgens nooit meer matcht :]. Zelfs als een uitnodiging wat later wordt verstuurd dan lijkt mij dat nog altijd beter dan een uitnodiging die in het geheel niet wordt verstuurd.
En als je dan zo'n interval wilt aanpassen, dan zou ik dat in een aparte bewerking stoppen die het verzendmoment van alle onverzonden uitnodigingen in 1x bijwerkt. Zo blijft het plannen en daadwerkelijk verzenden van dit soort berichten beter gescheiden.
Quote:
Ik heb het nu met datums gemaakt en werkt wel maar dan stuurt die dus gewoon de invite als de datums matchen en niet precies 1 uur of precies 2 dagen.
Dit zou inhouden dat de berekening in $CompareDate misgaat.