[php/CLI] to "fork" or not to fork?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xces
  • Registratie: Juli 2001
  • Laatst online: 20-09 16:56

xces

To got or not to got..

Topicstarter
Ik ben bezig met mijn eigen aquariumcomputer. Deze gaat in eerste instantie simpel gezegd mijn verlichting aansturen en mijn temperatuur meten. Dit alles gaat via het 1-wire protocol. De verlichting is dimbaar, d.w.z. dat er op gezette tijden een TL lamp van 0% naar 100% gaat. De aansturing (het 1-wire gedeelte) is 100% klaar, ook de interface vanuit PHP naar het protocol is klaar en werkt.

Ik ben nu bezig met de software. Het volgende probleem heb ik, en hiervoor zoek ik een juiste methode om het probleem te tackelen (dus geen code, slechts andere inzichten)

om de "x" tijd een aantal (bijv. 6) sensoren uitlezen en vervolgens (afhankelijk van de status van een sensor) iets doen.

ik wil bovenstaande met PHP gaan doen, aangezien ik daar het meeste ervaring in heb. Dit is allemaal geen probleem, de vraag is concreet hoe zouden jullie de casus aanpakken?

optie 1 (Command Line Interface) :
Ik kan één PHP script maken voor alle sensoren, wat via de CLI gestart gaat worden. Hierin summon ik een daemon dat iedere 5 seconden 6x forked (in geval van 6 sensoren) en in de childs vervolgens de sensor gaan uitlezen en de juiste actie gaat doen.

Voordeel;
- Het hoofdscript blijft om de 5 seconden draaien en dus op tijd lopen (erg belangrijk)

Nadeel;
- Relatief veel kennis nodig om te gaan forken.
- Als er iets wijzigd (bijv. dim tijden wijzigen) moet het script dit weten. Ik wil dit eigenlijk "real-time" en dus niet pas na 5 seconden zien. Dit zou ik kunnen oplossen door het geforkte proces te laten luisteren op een socket...

Optie 2 (CLI/web):
Via PHP een script "infinite" laten lopen dat iedere 5 seconden bijv. 6x een "WGET http://localhost/sensor1.php" aanroept.

Nadeel;
- Als er iets wijzigd (bijv. dim tijden wijzigen) moet het script dit weten. Ik wil dit eigenlijk "real-time" en dus niet pas na 5 seconden zien. Dit zou ik kunnen oplossen door het geforkte proces te laten luisteren op een socket...

Optie 3 (Command Line Interface):
Gewoon voor iedere sensor (TL1, TL2, Temperatuur) een eigen script maken wat:
a) iedere x seconden kijkt of er iets moet wijzigen
b) Forked (de actie doet) indien nodig.
c) luisterd op een poort naar commando's van de webinterface

Voordeel:
- Iedere sensor heeft zijn/haar eigen script
- Instelbare tijd. Kan bijv. dat sensor 1 om de 5 seconden moet pollen, sensor 2 om de 1 minuut?

Nadeel:
- Dubbele code?

Hebben jullie misschien aanvullingen / andere gedachtes?

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Als je met zulke korte intervals zit zou ik gewoon voor 1 script gaan wat gewoon luistert op een poort. Waarom je dan per sensor 1 script nodig hebt ( en dus ook per sensor 1 poort ) zie ik even niet, je script kan toch ook gewoon bepalen van welke sensor het signaal afkomstig is.

Dubbele code heb je eigenlijk helemaal niet mee te maken, met includes houd je alles in 1 script. ( of je houdt alles sowieso in 1 script )

Als je een continue luisterend script hebt zou ik dit script zo simpel mogelijk houden en het echte werk laten verrichten door een 2e script wat aangeroepen wordt door het 1e script. Dit vanwege het feit dat de meeste php-scripts niet netjes met het geheugen omgaan ( je moet opeens alle variabelen gaan unsetten etc. of anders krijg je een memory-leak in je script wat na 5 dagen je pc laat hangen )

Acties:
  • 0 Henk 'm!

Verwijderd

Ik vind dat je een slechte reden hebt om het in PHP te doen. Volgens mij mis je gewoon wat basic kennis over daemons en threading, en kun je dit soort zaken veel beter in C schrijven. En als je per se wilt scripten, waarom dan niet in Perl?

En ik vraag me af waarom je denkt dat je überhaupt moet forken... En waarom iedere 5 seconden? :)

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:43
Waarom kun je bij optie 1 het hoofdproces niet laten controleren op wijzigingen van de configuratie (desnoods genotified via de webinterface) zoals je bij optie 3 ook doet?

Werken met verschillende daemons en die synchroon laten lopen lijkt me ontzettend gedoe. Dan is optie 1 een stuk handiger (childs forken, werk doen, exiten) maar dan nog vraag ik me af of je de acties die eens per vijf seconden plaatsvinden niet gewoon sequentieel kunt doen, dan kun je het expliciete forken achterwege laten. (Natuurlijk forkt php al als je iets simpel als een system() call doet, maar daar is niets mis mee.)

Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
In PHP CLI is het relatief eenvoudig om een echte deamon te schrijven. (Daemonization).

Je kan dan ook bijvoorbeeld via init.d zo'n deamon starten/stoppen etc. (dat moet je wel ook zelf programmeren). Vervolgens kun je child processes gaan starten, maar voor 6 sensoren lijkt me dat niet echt nodig.

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

Verwijderd

Ik ben het ermee eens dat je een slechte reden hebt om PHP te gebruiken. Bij mijn weten is PHP niet bedoeld voor dit soort activiteiten. Dat er wat vage methoden zijn om tóch een soort halve service te maken is nog steeds geen reden om voor PHP te kiezen.

Ook hier geldt: the right tool for the right job. De overstap van PHP naar C lijkt mij persoonlijk wat groot - even los van de syntax. Waarom kijk je niet naar een platform en taal met een lage instapdrempel, zoals C# of desnoods Java? We zitten hier in Programming dus ja, wij vinden het leuk om nieuwe dingen te leren ;) Zeker dit soort projecten zijn uiterst geschikt om een nieuwe omgeving te leren kennen.

Wat betreft polling: ik kan me voorstellen dat je enige tijd wilt wachten voor de volgende poll, aangezien het effect van de vorige poll niet direct meetbaar is. Ideaal zou natuurlijk zijn veel meten, dit opslaan en op basis van het verloop hiervan ingrijpen en daarna nog wat bijsturen.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:35
Volgens mij is hier het makkelijkst om een heel simpele:

C:
1
2
3
4
5
6
7
while( !quit )
{
    ..read sensors
    ..do stuff
    ..write outputs
    ..sleep
}


te doen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • xces
  • Registratie: Juli 2001
  • Laatst online: 20-09 16:56

xces

To got or not to got..

Topicstarter
mocean schreef op zaterdag 03 mei 2008 @ 12:41:
In PHP CLI is het relatief eenvoudig om een echte deamon te schrijven. (Daemonization).

Je kan dan ook bijvoorbeeld via init.d zo'n deamon starten/stoppen etc. (dat moet je wel ook zelf programmeren). Vervolgens kun je child processes gaan starten, maar voor 6 sensoren lijkt me dat niet echt nodig.
Even ter verduidelijking; in het "dagelijkse leven" ben ik C# programmeur met ruim 7 jaar ervaring en de nodige actuele certificering. PHP is een hobbytaal voor mij en daarom vind ik het inderdaad leuk om te kijken of ik zaken op een andere, misschien niet zo voor de hand liggende manier op kan pakken.

Het totaal aantal sensoren / chips wat ik aan moet sturen zal op kunnen lopen tot ongeveer 30. Ik moet gebruik maken van een commandline tool (owwrite en owread) om de sensoren uit te lezen. Aangezien het uitlezen van een sensor tot wel 2 seconden kan duren (blame the network) heb ik dus eraan gedacht om het semi-simultaan via forken op te lossen. Het systeem MOET namelijk op bepaalde tijden bepaalde acties uitvoeren, vandaar dat ik het idee had om (zodra er gelezen moet worden) hiervoor andere processen aan te roepen zodat het hoofdscript op de klok blijft lopen. Dit zou mijns inziens net zo goed (misschien wel beter) in perl opgelost kunnen worden.

Het starten van threads gaat zo te zien redelijk simpel in Perl, even uitgaande van de pseudo code van Farlane; Volgens mij moet ik met de volgende links zelf een end verder komen;
- http://hayne.net/MacDev/TestSignals/testsignals
- http://www.scribd.com/doc/387837/Perl-5-Tutorial
- http://perldoc.perl.org/perlfaq8.html
- http://archive.netbsd.se/...nners&a=2008-03&t=6740003

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    use threads;

    sub thrsub {
       my ($message) = @_;
       sleep 1;
       print "thread $message\n";
    }

    while (1) {
        my $thr1 = threads->new(\&thrsub, "sensor1");
        my $thr2 = threads->new(\&thrsub, "sensor2");
        sleep 5;
    }
    exit;


Het idee waar ik nu mee zit te spelen is
- één server; die luistert naar connecties en doet iets afgaande op wat er naar hem gezonden zal worden door clients.
- Daarnaast 1 deamon die om de "x" seconden een commando's naar de server stuurt (bijv. 30 sensoren uitlezen)
- Ook zou ik dan via PHP (de instel website) een commando kunnen sturen naar de server dat er nieuwe waardes moeten worden geinitialiseerd?

Is dat een goed idee of kan het nog makkelijker?

[ Voor 25% gewijzigd door xces op 04-05-2008 16:23 ]

Pagina: 1