23. april 2010 - 13:37Der er
12 kommentarer og 1 løsning
Hvordan sikrer jeg, at samme script ikke køres på samme tid
Hejsa.
Jeg har et script, som hver dag sender en email. Scriptet kaldes af et cronjob, som kører mange gange i løbet af en dag. Men scriptet skal kun køre 1 gang pr. dag. Derfor har jeg lavet det sådan:
1. Tjek i MySQL, om scriptet er kørt i dag 2. Hvis ingen timestamp for dd. i MySQL, så kør scriptet ellers spring over. 3. Smid et timestamp i MySQL, hvis scriptet er kørt.
Men jeg har nu i nogle dage oplevet, at scriptet køres 2 gange på samme tid (samme sekund), og det lugter af, at cronjobbet kalder mit script dobbet, hvorfor scriptet når at køre begge gange inden der er skrevet til MySQL.
Kan man gøre et eller andet for at scriptet ikke køres dobbelt, hvis det skulle kaldes dobbelt?
DGudiksen: Ikke for at være uforskammet, men jeg søger ikke en løsning med frekvensen af cronjobbet :) Der er forskellige årsager til den måde cronjobbene afvikles (Drupal installation og nogle rettigheder). Kimsey0: Det kan godt være, at jeg misforstår dit forslag, men er det ikke lige præcis det, jeg gør?
Showsource: Jeg anvender UPDATE og ikke INSERT, når jeg indsætter date i databasen. Så er UNIQUE ligegyldigt. Når jeg så tjekker, om scriptet er kørt tidligere, så tjekker jeg med:
Det med Lock Tables er lidt for avanceret for mig, og det ser også ud til, at det måske slet ikke er muligt på webhotellet.
Kunne løsningen være, at det første, jeg gør i scriptet, er at lave en UPDATE, hvor jeg fx sætter '1' i et tjek-felt, kører scriptet og til sidst ændrer tjek-feltet til '0'.
Altså dette forløb:
1. Kontroller, om scriptet er i gang ved at lave en forespørgsel på tjek-feltet. 2. Hvis ikke (hvor tjek-feltet = '0'), så sæt tjek-feltet til '1' 3. Kør scriptet 4. Smide dateoen i dato-feltet. 4. Ændre tjek-feltet til 0.
Denne løsning vil som det første opdatere MySQL, hvor min oprindelige løsning, først opdaterede MySQL, når hele scriptet var kørt via dato-feltet.
Når så scriptet kaldes millisekunder efter, kan det være, at det første kald har nået at sætte tjek-feltet til '1', hvorfor scriptet ikke køres 2. gang.
Jeg kan se, at der typisk går 0,3 til 0,6 sekund imellem dobbelt kaledene.
Sorry med forklaringerne..... Det handler bare om et script som kun skal køre én gang dagligt. Scriptet kaldes mange gange i løbet af dagen via cronjob-funktion i en Drupal-installatione, og så sker det jævnligt, at "kaldene" sker dobbelt - det vil sige indenfor samme sekund. Dermed skal scriptet kun køres første gang, det kaldes pr. dag.
Derfor gør jeg det, at jeg smider dd. i et MySQL-felt i afslutningen af scriptet.
Afviklingen af scriptet tager måske 2 sekunder, hvorfor dd. skrives i MySQL efter ca. 2. sekunder. Hvis så scriptet kaldes igen, inden scriptet er kørt færdigt (altså inden for de 2 sekunder), så vil scriptet kører 1 gang til, hvilket ikke må ske.
Derfor ser jeg en løsning med, at der i starten af scriptafviklingen skrives til et tjek-felt i MySQl. Det sker måske allerede efter 0,1 sekund.
Herved kan jeg styre om, scriptet er gang med afvikling (et alternativ til LOCK TABLES)
Jeg mener, at det er løst ved at jeg "reserverer" filen, ved at skrive et "tjek" til MySQL. Altså en løsning, der læner sig op af showsource's forslag med at låse tabellerne.
Jeg vælger derfor at tildele pointene til showsource, hvis du venligst vil sende et svar.
Lukketid. Ellers må Showsource efterfølgende sende mig en besked, og jeg oprettet et nyt spørgsmål for at tildele pointene retteligt.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.