Archief - PHP: data blijven uitlezen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

fromalk

Legacy Member
hallo allemaal,

ik zit met een kleine vraag betreffende het uitlezen van data voor een van mijn volgende sites.

Ik wil hierbij voor het eerst alle data wegschrijven in html files, updates worden dan bewaard in de database en worden van daaruit systematisch weer naar html geschreven. Redelijk omslachtig maar om wille van load management zal dit voor dit project op lange termijn beter uitkomen.

Probleem:
in de database zitten bv 100 records die verwerkt dienen te worden. Deze records zijn bv op 10 sec verwerkt en er komen er geen nieuwe meer bij.

Na 60sec komen er opnieuw 100 records binnen die verwerkt moeten worden. Php zal niet weten dat er nieuwe data bij is gekomen tenzij de pagina vernieuwd wordt. Dit vernieuwen kan dus via een cron job gaan. Alleen is een ander probleem dan weer het volgende:

stel dat op 00:10:59 een opdracht verwerkt wordt die 10sec in beslag zal nemen, de cronjob wordt elke minuut uitgevoerd, de opdracht van 00:10:59 is dus om 00:11:00 nog niet klaar. Is er een mogelijkheid o dit dubbel uitlezen te vermijden?

Alvast bedankt

dJeez

Legacy Member
Je kan vb. werken met timestamps om op die basis enkel de nieuwe te selecteren (enkel die records die aanwezig zijn tussen de huidige en de vorige start van het script - de eerste keer selecteer je dan uiteraard alle records die voor de huidige start van het script liggen). Dat lijkt mij althans de eenvoudigste oplossing.

BTW Je hypothese klopt overigens niet, een cron job zal nooit 59 seconden na de tijd die je hebt ingesteld gestart worden (toch niet bij een normale load op de machine), maar soit.

fromalk

Legacy Member
bedankt djeez, daar heb ik aan zitten denken,

nu in elk geval de volgende oplossing kan misschien wat belachelijk lijken ik denk wel dat dit kan werken;


$bool = false;
while(!bool) {
query....
while fetch_array() {
wegschrijven
}
}

op deze manier zal er constant gekeken worden of er data is.

het bestand wordt 1x geopend en zal altijd blijven lopen, probleem is dan wel de tijdslimiet, die kan ik moeilijk op oneindig zetten

Radiance

Legacy Member
Je kan een lockfile aanmaken (of er een veldje in uw database voor voorzien), als je wijzigingen aan de database uitvoert plaats je die lockfile, aan het einde verwijder je 'm weer.

Als de cronjob die file ziet staan : exit.
Misschien beter om aan het einde van elke update een lastChanged veldje weg te schrijven, dan hoeft uw cronjob enkel te draaien als er een change is.

Lord Kveldulv

Legacy Member
Hier een scriptje dat ik op het werk voorlopig gebruik om een mirror server te syncen elke 30 seconden. Quick & dirty, niet te hard op letten. Is op een paar minuten in elkaar gestoken.

Code:
#!/bin/sh
if [ -f "/var/run/mirror.pid" ]; then
   RUNPID=`cat /var/run/mirror.pid`
   if ps -p $RUNPID; then
      echo "Mirror is already running..."
      exit 1
   else
      echo "Mirror pid found but process dead, cleaning up"
      rm -f /var/run/mirror.pid
   fi
else
   echo "No Mirror Process Detected"
fi
echo $$ > /var/run/mirror.pid

echo -n "Mirror Started at "
date

==>UW COMMAND HIER<==

echo -n "Mirror Ended at "
date
rm -f /var/run/mirror.pid

Dat scriptje steekt ge dan in een cronjob. Als het script nog draait dan gaat hij niks doen. Als het script gecrashed is en de .pid staat er nog kan hij de ouwe pid verwijderen en herstarten.

Mbv php of de db zou ik zoiets niet doen tenzij het niet anders kan.

fromalk

Legacy Member
kleine vraag nog

stel nu dat de lus begint te lopen en er zitten 20 000 opdrachtten in de database die hij moet verwerken. Dat verwerken zal bv 10 uur duren (ik zeg nu maar iets), hoe kan ik er voor zorgen dat de file blijft lopen? Want met set_time_limit() staat die vooraf ingesteld op een vaste waarde?

Is het overigens mogelijk, en aan te raden om set_time_limit in de lus te gebruiken, ik neem aan dat de tijdslimiet dan voortdurend weer op een bepaalde waarde wordt gezet?

MVG Stijn
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan