Oprettet fre. d. 23. april 2010 kl. 13:37:28

nemlig
nemlig (5.151 point. Point ude: 0)

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?

Skrevet fre. d. 23. april 2010 kl. 15:39:38| #1

DGudiksen
DGudiksen (4.400 point)
www.gudiik.dk
Hos din ydbyder burde du kunne sætte dit cronjob til kun at kører engang om dagen. f.eks hver dag klokken 16.00.

Den mulighed har jeg hvertfald hos min udbyder.

Skrevet fre. d. 23. april 2010 kl. 15:47:53| #2

kimsey0
kimsey0 (23.714 point)
jacobbundgaard.dk
Hmm... Det eneste jeg lige kan finde på er, at lægge dags dato i et unikt (primary) felt, og så kun sende e-mailen hvis indsætningen af datoen lykkes.

Skrevet fre. d. 23. april 2010 kl. 16:34:46| #3

nemlig
nemlig (5.151 point)
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?

Skrevet fre. d. 23. april 2010 kl. 18:53:25| #4

showsource
showsource (32.621 point)
Hvis det kører to gange på samme tid, så får du vel to datoer som er ens ?

Det burde kunne undgås hvis feltet er UNIQUE.
Og ellers er det vel noget med LOCK YABLES ?
http://dev.mysql.com/ (...)

Skrevet fre. d. 23. april 2010 kl. 23:09:49| #5

nemlig
nemlig (5.151 point)
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:

$date = date("Y-m-d");
if($date != $row['cronjob_dato']) {   

Løsningen er måske LOCK TABLES.
Kan tabellerne også låses for at foretage forespørgsler - ellers kan jeg ikke se, at det hjælper.

Skrevet lør. d. 24. april 2010 kl. 09:38:08| #6

nemlig
nemlig (5.151 point)
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.

Skrevet lør. d. 24. april 2010 kl. 12:50:16| #7

showsource
showsource (32.621 point)
Jeg er godt nok lettere forvirret.
Den eneste løsning jeg kan se, er at du deler dit cronjob op.
Altså to cronjobs

En foresp. kan evt. gå lynhurtigt, så ved næste er feltet atter 0 igen.

Skrevet lør. d. 24. april 2010 kl. 13:25:10| #8

nemlig
nemlig (5.151 point)
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)

Nu prøver jeg det i hvert fald.

Skrevet søn. d. 25. april 2010 kl. 18:19:27| #9

coderdk
coderdk (160.399 point)
Hvad med bare en simpel semafor, implementeret som en fil?

if ( file_exists( "script_koerer" ) )
{
  exit;
}
touch( "script_koerer" );
// lav arbejdet her
unlink( "script_koerer" );


Evt check hvor gammel filen er?

Skrevet man. d. 26. april 2010 kl. 21:34:09| #10

nemlig
nemlig (5.151 point)
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.

Skrevet tor. d. 12. august 2010 kl. 10:48:07| #11

nemlig
nemlig (5.151 point)
Lukketid.....
Sender showsource et svar!

Skrevet ons. d. 18. august 2010 kl. 17:32:48| #12

nemlig
nemlig (5.151 point)
Showsource - hvor er du?  :)

Skrevet tir. d. 24. august 2010 kl. 22:30:01| #13

nemlig
nemlig (5.151 point)
Lukketid. Ellers må Showsource efterfølgende sende mig en besked, og jeg oprettet et nyt spørgsmål for at tildele pointene retteligt.

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Brugerliste med link til profil

Oprettet den 26. maj 2012 kl. 14.29
sayn giver 30 point for svar | Giv et svar »

php curl driller

Oprettet den 26. maj 2012 kl. 08.31
PHPnQrd giver 200 point for svar | Giv et svar »

Array i array

Oprettet den 25. maj 2012 kl. 08.32
sebster giver 60 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger