Ik zit met de volgende situatie.
Ik heb een aantal stukjes code die als een soort cron moeten worden uitgevoerd. Mijn host voorziet niet in cronjobs. Dus had ik het volgende bedacht.
Ik heb gebruik de bezoekers op mijn site om een stukje code te triggeren. Op het moment dat een stukje code wordt afgeschoten, zet ik de datum/tijd (NOW()). Middels een interval wordt bekeken of de code afgeschoten moet worden.
Het probleem:
Soms komen/zijn er meerdere bezoekers tegelijk op de site, waardoor de code toch meerdere malen wordt afgeschoten. Is hier een oplossing voor?
- Code 1x uitvoeren
-
02-09-2014, 17:01 #1Particulier
- Berichten
- 70
- Lid sinds
- 17 Jaar
Code 1x uitvoeren
-
In de schijnwerper
Linkbuilding uitbesteden - 25 jaar ervaring - Zie behaalde resultatenAdvertentieruimteComplete domeinnamen portfolio te koop wegens voorlopig stoppenDomein te koopLinks op het gebied van schoonmaak en gezondheid gezocht, betaald of ruil.LinkpartnersComplete Webhosting incl. verhuisservice: slechts €3,99 per maandHosting -
02-09-2014, 17:13 #2Particulier
- Berichten
- 173
- Lid sinds
- 15 Jaar
Re: Code 1x uitvoeren
Het beste kunt u een asynchronisch script aanroepen waarin u de cron code uitvoert (bijvoorbeeld PHP).
cron.php (bevat de cron code)
cron.txt (timer)
Bovenin cron.php dient u de volgende code te plaatsen:
PHP Code:<?php
$interval = 3600; // Cron interval in seconden
# Javascript header
header("content-type: application/javascript");
echo '/* Javascript Cron */';
# Timer
if (file_exists('cron.txt')) {
$t = file_get_contents('cron.txt');
} else {
$t = false;
}
if ($t < (time() - $interval)) {
echo '// No time for cron'; exit;
}
echo '// Cron started...';
file_put_contents('cron.txt',time())
// CRON CODE HIER
echo '// [COMPLETED]';
Javascript in footer van pagina:
Code:<script type="text/javascript"> (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = 'cron.php'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script>
-
02-09-2014, 17:15 #3
- Berichten
- 1.470
- Lid sinds
- 18 Jaar
Re: Code 1x uitvoeren
Veld erlangs maken:
cron_finished = 0/1
Voltooide taken markeren met 1, en alleen bij het uitvoeren de taken ophalen die op 0 staan.
-
02-09-2014, 17:47 #4Particulier
- Berichten
- 153
- Lid sinds
- 13 Jaar
Re: Code 1x uitvoeren
Heb je wel toegang tot een database? Zo ja, dan zou ik het voorstel van Jan modificeren op basis van een database.
Nu loop je nog steeds een (kleiner weliswaar) risico dat het "cron" script vaker uitgevoerd wordt, omdat je een race-conditie creëert:
- request A leest cron.txt
- request B leest cron.txt
- request A update cron.txt
- request B update cron.txt
Zowel A als B zal (onbedoeld) je "cron" uitoveren. Met een database kun je om de read en write een transaction hangen en voorkom je een race conditie.
Overigens: je houdt altijd het risico dat je te weinig executies krijgt als je geen bezoekers hebt.
-
02-09-2014, 17:50 #5Particulier
- Berichten
- 173
- Lid sinds
- 15 Jaar
Re: Code 1x uitvoeren
Dat zou gaan om microseconden, in principe is dubbele uitvoering van het script onmogelijk. Je kunt eventueel een file lock toepassen zodat een dubbele start van de cron kan worden uitgesloten.
http://php.net/manual/en/function.flock.php
-
02-09-2014, 17:54 #6Particulier
- Berichten
- 153
- Lid sinds
- 13 Jaar
Re: Code 1x uitvoeren
Ah ik zie dat een expliciete filelock vragen ook non-blocking kan in PHP, dat wist ik niet - dan is dat ook een valide oplossing inderdaad.
En ja, de kans is zeker (heel) klein - maar onmogelijk is het niet. Het nare van racecondities is dat de kans vaak heel klein is, maar dat als het misgaat je al lang vergeten bent dat je er één had. Een exclusive lock is dan een elegante manier om het op te lossen als er geen database beschikbaar is.
-
02-09-2014, 18:25 #7
- Berichten
- 446
- Lid sinds
- 12 Jaar
Re: Code 1x uitvoeren
ooofff.....
Je maakt gebruik van een cronjob service zoals https://www.setcronjob.com/
Hebben ook gratis plans, ben je van alle moeilijkheden af.
Succes!
-
02-09-2014, 20:08 #8Particulier
- Berichten
- 70
- Lid sinds
- 17 Jaar
Re: Code 1x uitvoeren
ik zou het liefst een oplossing willen met alleen php en database.
Dus zou ik een transaction moeten gebruiken?
-
02-09-2014, 20:25 #9Particulier
- Berichten
- 153
- Lid sinds
- 13 Jaar
Re: Code 1x uitvoeren
Dat kan inderdaad. Als ik het goed beluister ben je er niet mee bekend? Bedenk wel dat het geen 10 minuten verhaal gaat worden op deze manier dan.
Een paar pointers voor leesmateriaal:
- database transactionality (http://en.wikipedia.org/wiki/Database_transaction bv.)
- PHP commit function (http://php.net/manual/en/mysqli.commit.php bv)
Voor wanneer je aan de gang gaat, een kleine tip: MyISAM is niet transactioneel, InnoDB wel. ;)
-
02-09-2014, 21:53 #1064BitsWebhosting.EU
- Berichten
- 2.092
- Lid sinds
- 17 Jaar
Re: Code 1x uitvoeren
Je moet inderdaad iets van semafoor maken. Of je dat in een bestandje doet een database maakt niet zoveel uit.
Een transactie is niet persé nodig, maar je moet zorgen dat je een 'atomic operation' krijgt. Met InnoDB kun je dat met een transactie doen, op MyIsam op een andere manier. Daarnaast kun je voor beide opties nog filelocks of tablelocks gebruiken.
Echter heb je op geen van bovenstaande methoden de garantie dat je cronjob uitgevoerd wordt.
Ik wist overigens niet dat er nog hosters bestonden die geen cronjobs aanbieden?
-
03-09-2014, 08:40 #11Particulier
- Berichten
- 442
- Lid sinds
- 15 Jaar
Re: Code 1x uitvoeren
Kan je dan niet gewoon zoiets nemen?
https://www.setcronjob.com/prices
Gratis voor 50x per dag
-
03-09-2014, 12:44 #12Particulier
- Berichten
- 442
- Lid sinds
- 15 Jaar
Re: Code 1x uitvoeren
Zie nu pas dat iemand het al voorstelde. Niet van toepassing dan.
-
04-09-2014, 00:41 #13
- Berichten
- 1.265
- Lid sinds
- 16 Jaar
Plaats een
- + Advertentie
- + Onderwerp
Marktplaats
Webmasterforum
- Websites algemeen
- Sitechecks
- Marketing
- Domeinen algemeen
- Waardebepaling
- CMS
- Wordpress
- Joomla
- Magento
- Google algemeen
- SEO
- Analytics
- Adsense
- Adwords
- HTML / XHTML
- CSS
- Programmeren
- PHP
- Javascript
- JQuery
- MySQL
- Ondernemen algemeen
- Belastingen
- Juridisch
- Grafisch ontwerp
- Hosting Algemeen
- Hardware Info
- Offtopic