PHP script vraagje

Onderwerpen die nergens anders thuis horen en toch eerder technisch van aard zijn? Post ze hier!
Plaats reactie
krisken
Moderator
Moderator
Berichten: 19634
Lid geworden op: 07 nov 2006, 12:11
Twitter: kriskenbe
Locatie: Massemen - 91WET0
Uitgedeelde bedankjes: 1863 keer
Bedankt: 1003 keer
Contacteer:

Er is een database met 3 waarden : GSMnummer, bericht en send. GSM nummer en bericht spreken voor zichzelf, send is gewoon een waarde 0 (nog niet verzonden) of 1 (bericht verzonden). Elk bericht dat in de database komt, krijgt dus automatisch bij send de waarde 0.

Nu zou er een PHP script moeten komen dat in de database kijkt of er berichten staan waarbij send op 0 staat, zo ja verstuurd hij dat bericht en zet hij send op 1.

Het versturen van een bericht duurt ongeveer 7 seconden. Per minuut kan je dus 4 berichten versturen.

Vraag : hoe kan ik er voor zorgen dat deze database elke 15 seconden "bekeken" word naar berichten die op 0 staan? Crontab kent enkel minuten als laagste waarde. In PHP kan ik werken met sleep, maar als ik voor één of andere reden de server moet rebooten (of de vm) dan mag ik niet vergeten het script op te starten. Zoek dus eigenlijk iets dat ik eenmalig kan goed zetten en voor de rest weinig omkijk naar heb...

Internet = Orange 100/10Mbps + WirelessBelgië
Telefonie = EDPnet + OVH
GSM = Orange Go Extreme + Scarlet Red
TV = TVV App + Netflix + Disney+ + Streamz
Netwerk = Mikrotik + Ubiquiti
CCatalyst
Elite Poster
Elite Poster
Berichten: 6659
Lid geworden op: 20 jun 2016, 18:36
Uitgedeelde bedankjes: 18 keer
Bedankt: 386 keer

Met sleep kan dit toch? Maar niet in PHP, laat cron elke minuut een shell script draaien :

php-script
sleep 15
php-script
sleep 15
php-script
sleep 15
php-script

Na reboot zal het weer beginnen draaien vanaf de eerstvolgende minuut na het opstarten van crond.
krisken
Moderator
Moderator
Berichten: 19634
Lid geworden op: 07 nov 2006, 12:11
Twitter: kriskenbe
Locatie: Massemen - 91WET0
Uitgedeelde bedankjes: 1863 keer
Bedankt: 1003 keer
Contacteer:

Je zou dus cron en sleep combineren met elkaar?

00:00:00 Cron
00:00:15 Sleep
00:00:30 Sleep
00:00:45 Sleep
00:01:00 Cron
00:01:15 Sleep
00:01:30 Sleep
00:01:45 Sleep
...

Hmm dat kan inderdaad ook. Gewoon 3x een sleep inbouwen.

Internet = Orange 100/10Mbps + WirelessBelgië
Telefonie = EDPnet + OVH
GSM = Orange Go Extreme + Scarlet Red
TV = TVV App + Netflix + Disney+ + Streamz
Netwerk = Mikrotik + Ubiquiti
seriewoordenaar007
Member
Member
Berichten: 72
Lid geworden op: 09 maa 2018, 23:13
Uitgedeelde bedankjes: 6 keer
Bedankt: 11 keer

Eleganter is om alle instructies binnen het PHP script in een oneindige lus te plaatsen :

Code: Selecteer alles

while(true)
     {
     Alle instructies
     }
De uitvoering binnen het script kan ook met sleep(...) worden gepauzeerd, met ... het aantal seconden.
Slakkenpost en gevederde luchtkoeriers zijn mijn favoriete communicatiemiddelen. :banana:
krisken
Moderator
Moderator
Berichten: 19634
Lid geworden op: 07 nov 2006, 12:11
Twitter: kriskenbe
Locatie: Massemen - 91WET0
Uitgedeelde bedankjes: 1863 keer
Bedankt: 1003 keer
Contacteer:

Een lus is volgens mij net niet de oplossing? Ik moet dan telkens als de server opgestart is er aan denken om dat zelf te starten. En als ik een cronjob doe en een lus tegelijk dan gaan die in elkaars weg lopen.

Internet = Orange 100/10Mbps + WirelessBelgië
Telefonie = EDPnet + OVH
GSM = Orange Go Extreme + Scarlet Red
TV = TVV App + Netflix + Disney+ + Streamz
Netwerk = Mikrotik + Ubiquiti
Tim.Bracquez
Elite Poster
Elite Poster
Berichten: 3202
Lid geworden op: 05 dec 2010, 15:09
Bedankt: 451 keer

Code: Selecteer alles

while(true)
     {
      #Alle instructies
      sleep 15;
     }
Gebruik inderdaad dit en zet je script in in de opstart file met een sleep.

Moet je geen check doen of het script "uniek draait" (pid file) enzo, anders lopen die in elkaars weg.
Ordon
Elite Poster
Elite Poster
Berichten: 1573
Lid geworden op: 27 apr 2019, 06:52
Uitgedeelde bedankjes: 36 keer
Bedankt: 70 keer

Een cronjob kan je ook eenmalig uit voeren bij het opstarten.
Bijvoorbeeld 45 seconden na de reboot zodat andere zaken eerst netjes kunnen gestart worden.

Code: Selecteer alles

@reboot sleep 45; /path/to/simplescript.sh
=========================

Wat ook kan.
Een eenmalig, via crontab, uitgevoerd script (respawn.sh) kan monitoren of het uit te voeren programma (simplescript.sh) nog draait (en indien nodig terug opstarten).
Het aantal seconden bepaal je in beide gevallen zelf.
(In onderstaand voorbeeld: opstarten van "respawn.sh" 45 seconden na reboot en deze gaat dan iedere 5 seconden controleren of "simplescript.sh" nog draait).


Bijvoorbeeld crontab:

Code: Selecteer alles

@reboot sleep 45; /path/to/respawn.sh /path/to/simplescript.sh 5
Met respawn.sh:

Code: Selecteer alles

#!/bin/bash

# This script is a simple respawn deamon for those of us who dont want
# to deal with the /etc/event.d, monit etc...
# Usage: sh respawn.sh [program] [sleep time]

while [ true ]
do
	sleep $2
	if ps ax | grep -v grep | $1 > /dev/null
	then
		echo $1": Stopped. Restarting in "$2" seconds."
	else
		$1 &
	fi
done
Bron respawn.sh
CCatalyst
Elite Poster
Elite Poster
Berichten: 6659
Lid geworden op: 20 jun 2016, 18:36
Uitgedeelde bedankjes: 18 keer
Bedankt: 386 keer

Reden dat ik niet alles in PHP wil zetten is dat het volledig gedaan is als het proces crasht om een of andere reden. crond is veel betrouwbaarder dan gelijk welke PHP interpreter.

Je kan idd wel die 3 sleep's in het PHP script zetten ook en cron elke minuut het PHP script laten firen, dat is minder belastend voor het systeem dan elke 15 seconden het script te firen. Het hangt af van hoe goed het PHP script geschreven is en hoeveel tolerantie er is om eventueel eens enkele keren geen check te hebben na 15s.
Tim.Bracquez
Elite Poster
Elite Poster
Berichten: 3202
Lid geworden op: 05 dec 2010, 15:09
Bedankt: 451 keer

@CCatalyst: de ene keer kan de uitvoering 30 sec duren, de andere keren 40min.... Als er een hele sms run is.

Dus als je niet een heel framework en checks er rond wilt schrijven of het al draait of niet is het eenvoudiger in een oneindige loop.


Heb zo voor mijn bel thuis eentje in php draaien, al langer dan een jaar. Voor eenvoudige dingen geen probleem
Plaats reactie

Terug naar “Allerlei”