[PHP/MySQL] taken recursief verwijderen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ik wil een zeer flexibel taken systeem maken. Nu kan ik hiervoor heel veel cronjobs maken, maar deze kan ik niet eenvoudig editten. Ik heb dus besloten om dit met behulp van een MySQL database te gaan doen. Elk uur wordt dmv een php scriptje de database gescand op taken die eventueel uitgevoerd moeten worden. In deze database heb ik de kolommen:

id int
year int null
month int null
week int null
day int null
hour int null
task text
status enum(open,gesloten)

Als een tijdseenheid de waarde null heeft dan moet deze taak voor die tijdseenheid elke keer uitgevoerd worden (hetzelfde effect als * bij cronjobs).

Met de volgende query haal ik de taken op:
PHP:
1
2
3
4
5
$year = date("Y");
$month = date("n");
$week = ltrim(date("W"),"0");
$day = date("j");
$hour = date("G");

MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT 
 id,
 year,
 month,
 week,
 day,
 hour,
 task,
 status
FROM
 tasks 
WHERE 
 (year=$year OR year IS NULL)
  AND 
 (month=$month OR month IS NULL)
  AND
 (week=$week OR week IS NULL)
  AND 
 (day=$day OR day IS NULL)
  AND
 (hour=$hour OR hour IS NULL)

Deze query haalt de taken netjes op en dan kan ik ze uitvoeren. Echter sommige taken zullen maar 1x of een aantal keer uitgevoerd worden en erna nooit meer. Deze kunnen dus gedelete worden, zodra ze nooit meer worden uitgevoerd. Nu zoek ik dus een functie die aan de hand van een aantal tijdseenheden kan checken of de taak nog vaker uitgevoerd zal worden of niet. Zelf heb ik iets bedacht met allerlei if constructies, alleen dit is 1 grote puinzooi. Volgens mij moet dit op een recursieve manier heel makkelijk te doen zijn. Echter vind ik het bedenken van recursieve functies zeer lastig, in verband met oneindige loops. Nu weet ik niet of recursief de oplossing is, maar mijn gevoel zegt van wel, omdat je eerst naar het jaar moet kijken of deze null of het huidige jaar is en dan naar de maand etc etc..

Misschien kan het wel veel eenvoudiger en zit ik op een verkeerd spoor.

[ Voor 3% gewijzigd door RSD op 17-02-2009 11:37 ]


Acties:
  • 0 Henk 'm!

  • Erikie
  • Registratie: September 2000
  • Laatst online: 12:37

Erikie

www.erikie.nl

--niet goed (half) gelezen :)

[ Voor 88% gewijzigd door Erikie op 17-02-2009 19:55 ]

traktor scratch!


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

Cron jobs worden gewoon opgeslagen in tekstbestandjes, als je voldoende rechten hebt kan je die ook gewoon aanpassen, en anders kan het met minder rechten ook nog via de command line.

[ Voor 22% gewijzigd door Johnny op 17-02-2009 12:04 ]

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Is het niet makkelijker om ook gewoon een geldigheids datum ( en eventueel start datum op te slaan ). Bij het aanmaken van je taak bereken je dan gewoon de datum tot waneer een taak geldig is, en in je query selecteer je gewoon alleen taken die nog geldig zijn.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 19-09 18:02
Erikie schreef op dinsdag 17 februari 2009 @ 12:00:
waarom splits je jaar - maand - dag - uur etc etc ? 'k zou t niet doen, dan moet je alles weer bij elkaar gaan plakken in php.

Er bestaan gewoon date functies voor mysql, en kun je gewoon data berekenen in de query zelf.

http://dev.mysql.com/doc/...e-and-time-functions.html :)
Je leest wel goed of niet? Volgens mij probeerts TS hier een eigen crontab-achtig systeem op te zetten.

Als ik het goed begrijp worden somiige taken een beperkt aantal keren aangeroepen. Dat zou ik dan ook bijhouden, samen met de maximale hoeveelheid die de taak mag worden uitgevoerd en deze dan filteren in je query. Recursie in php is nogal tricky, omdat na 100 recursies php er nog wel eens de brui aan wil geven.

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

  • jbdeiman
  • Registratie: September 2008
  • Laatst online: 19:44
Heel simpel gezegd, als je jaar maand dag hebt ingevuld, dan kan de taak maar 1 keer (of miss wel elk uur??) worden uitgevoerd. Is de dag voorbij dan zal die zich niet herhalen. Heb je maand/ dag ingevuld, dan zal elke keer in die maand en op die dag de taak worden uitgevoerd. (en zo verder)

Dus eigenlijk als jaartal != leeg, (en de verdere datum, indien ingevuld, anders het jaar zelf is verstreken) dan kan je hem verwijderen.

Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function hourisfinished($hour) {
    if (is_null($hour) {
        $isfinished = false;
    } elseif ($hour == date("G")) {
        $isfinished = false;
    } else {
        $isfinished = true;
    }
    return $isfinished;
}

function dayisfinished($day,$hour) {
    if (is_null($day) || $day == date("j")) {
        $isfinished = hourisfinished($hour);
    } else {
        $isfinished = true;
    }
    return $isfinished;
}

function weekisfinished($week,$day,$hour) {
    if (is_null($week) || $week == ltrim(date("W"),"0")) {
        $isfinished = dayisfinished($day,$hour);
    } else {
        $isfinished = true;
    }
    return $isfinished;
}

function monthisfinished($month,$week,$day,$hour) {
    if (is_null($month) || $month == date("n")) {
        $isfinished = weekisfinished($week,$day,$hour);
    } else {
        $isfinished = true;
    }
    return $isfinished;
}

function isfinished($year,$month,$week,$day,$hour) {
    if (is_null($year) || $year == date("Y")) {
        $isfinished = monthisfinished($month,$week,$day,$hour);
    } else {
        $isfinished = true;
    }
    return $isfinished;
}


Bovenstaande heb ik gemaakt om te kijken of iets verwijderd kan worden... dit ga ik nu testen, hopen dat het werkt ;-)

Acties:
  • 0 Henk 'm!

  • InputOutput
  • Registratie: September 2004
  • Laatst online: 18-09 10:52
Even een stapje terug:

je probeert een eigen takensysteem uit te vinden, maar legt niet uit wat er precies mis is met de huidige crondaemon, behalve dat je 'heel veel cronjobs [kan] maken, maar deze niet eenvoudig [kan] editten.'

Het klinkt alsof je het wiel opnieuw probeert uit te vinden. Waarom je taken in een RDBM opslaan? Dat voegt m.i. niets toe. Je kunt net zo goed je code een crontab laten uitspugen ipv SQL, dus iets in de geest van
* */1 * * * naam taak ... en dat dan wegschrijven.

Elke gebruiker kan een crontab hebben, daar hoef je niet per se root voor te zijn (zie man crontab & man 5(?) crontab voor het formaat).

En verder, een recursieve functie zou ik te allen tijden vermijden als het niet _echt_ nodig is. Introduceert alleen maar complexiteit en daarmee bugs.

Acties:
  • 0 Henk 'm!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ik gebruik een cronjob om het script elk uur uit te voeren. Het script kijkt dan of er taken zijn. Echter moeten aan deze taken data gekoppeld kunnen worden wanneer deze moeten worden uitgevoerd. Het probleem is niet dta ik niet bij de crontab kan, dat lukt me wel. Maar ik wil snel in een database een aantal taken kunnen invoeren en het script kijkt dan elk uur of er een taak is toegevoegd of niet. Sommige taken moeten een loop zijn van bijvoorbeeld elk jaar. In de database geef ik dan year=null en dan month=1 week=null en day=1 en hour=1 oid.

Ik kan wel in text bestandjes gaan editten ed, maar de taken moeten ook weer gedelete worden ed, omdat het er veel zijn en ze veel verschillende tijden hebben.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

RSD schreef op dinsdag 17 februari 2009 @ 12:31:

Bovenstaande heb ik gemaakt om te kijken of iets verwijderd kan worden... dit ga ik nu testen, hopen dat het werkt ;-)
Nou, ik kan zo wel zien dat dat niet gaat werken. Al bij de eerste test gaat hij de mist in. Het lijkt me namelijk dat iets wat als jaar null heeft ten alle tijden uitgevoerd kan worden. Je code geeft echter true als resultaat van de 'isFinished'.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Nu weet ik niet of recursief de oplossing is, maar mijn gevoel zegt van wel, omdat je eerst naar het jaar moet kijken of deze null of het huidige jaar is en dan naar de maand etc etc..
Dus, als je een lijstje met dingen afwerkt, heb je een recursieve oplossing nodig :? ;) Dit kan ook heel prima iteratief.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Ik ben het met InputOutput eens. Maak een beheer tool waarmee je crontab vult / update / leegt.
Dan kan je makkelijk de crontab editen ipv "crontab -e". Je database tabel is dan een 1 op 1 reflectie van wat er in crontab moet komen te staan. Velden die je niet gebruikt laat je lekker leeg =)

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Die functies werkten inderdaad niet, ik heb het nu helemaal anders gedaan en dat werkt ook goed. Ik heb een datum veld en een uur veld gedaan deze kunnen wel null zijn.
Pagina: 1