[PHP] Uitvoeren tijdens het uitvoeren van andere functie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik vraag mij af of het mogelijk is om iets uit te voeren terwijl je aan het wachten bent op een andere functie.

Dus stel je hebt een functie die een waarde terug geeft na uitvoering. Tijdens het wachten tot het iets teruggeeft ga je met bijvoorbeeld een do while loop tot 100 tellen. Zodra de eerste functie een bool terug geeft moet de loop gebroken worden ook al is deze nog niet klaar.

Pseudo output:

code:
1
2
3
4
5
6
7
8
9
Start functie 1...
Start Do While Loop...
Tel tot 100...
1...
2...
3...
4...
Functie 1 is klaar!
Stop de loop!


Volgens mij kan zoiets iets alleen als Php multi threaded zou zijn 8)7

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
PHP is single-threaded, dus in eerste instantie, nee, PHP kan maar 1 ding tegelijk.

Afhankelijk van je uiteindelijke doel, heb je wellicht hier iets aan? http://nl2.php.net/manual...egister-tick-function.php

Acties:
  • 0 Henk 'm!

Verwijderd

Simpeler denk ik: een (soort van) globale variabele die tijdens na afloop van functie1 ge(un)set word en getest in de while loop van functie2.

Acties:
  • 0 Henk 'm!

Verwijderd

Hangt inderdaad een beetje van je doel af.

In sommige situaties kan het niet, soms kan het wel, zoals bijvoorbeeld de curl_multi functies.

Ook is Apache natuurlijk wel multi-threaded, dus je kan via 1 hoofd script meerdere subscripts aansturen. Het is alleen wel een beetje ingewikkeld en je moet vrij veel zelf doen (zoals communicatie tussen de hoofd en subscripts, opvangen van errors en crashes etc).

Dus afhankelijk van je doel zijn er wel mogelijkheden, ook al kan het misschien niet met PHP kun je misschien wel andere systemen inzetten om hetzelfde voor elkaar te krijgen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Curl is inderdaad een idee. Om een beter beeld van mijn doel te geven:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php

/**
 * Functie waarop ik wil wachten tot het een boolean terug geeft (duurd 5 sec).
 *
 * Note: Deze functie moet je zien als php functie die je 
 * niet kan wijzigen. Het enige dat je weet is dat het 
 * een boolean met `true` of `false` teruggeeft.
 */

function waitForMe()
{
    // Check of functie vaker uitgevoerd wordt(loop).
    echo ' <b>init waitForMe();</b> ';

    for ($i = 0; $i < 5; $i++) {
        
        // zZz
        sleep(1);
    }
    
    // True terugeven.
    return true;
}

$bool = waitForMe();

/**
 * In deze loop wil ik telkens een output maken en flushen
 * totdat de functie `waitForMe()` een boolean teruggeeft.
 */

// Output buffer starten!
ob_start();

do {

    // Check of functie al is uitgevoerd?
    global $bool;
    
    if(is_bool($bool)) {
    
        break;
    }

    // Output
    echo rand(0,100) . ' ';
    
    // Flush!
    ob_flush(); flush(); ob_clean();
    
    // zZz
    sleep(1);

} while(true);

?>

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Verwijderd schreef op zondag 04 maart 2007 @ 03:54:
Ook is Apache natuurlijk wel multi-threaded, dus je kan via 1 hoofd script meerdere subscripts aansturen. Het is alleen wel een beetje ingewikkeld en je moet vrij veel zelf doen (zoals communicatie tussen de hoofd en subscripts, opvangen van errors en crashes etc).
Met stom is :)

Je laatste voorbeeldcode is wel degelijk om te zetten naar iets multithreaded, door bijvoorbeeld een nieuwe instance van PHP aan te roepen en de output naar een file te schrijven:

PHP:
1
exec('php.exe file.php | output.txt');


file.php zal nu aangeroepen worden en zodra't klaar is z'n output naar het textbestand schrijven, terwijl je script gewoon doorgaat. Mooier is om de argument en return waarde van file.php te gebruiken, maar dan gaat exec wachten tot'ie klaar is :+ Ook even opletten dat het slimmer is file.php zelf de waarde van de boolean in bijvoorbeeld een database te gooien in plaats van om de seconde output.txt te gaan pollen, anders krijg je gedonder met twee instances die tegelijk een file willen schrijven en lezen.

Spreekt natuurlijk voor zich dat dit een inherent lelijke manier van coden is, dus weet je wel -heel- erg zeker dat je code moet kunnen uitvoeren terwijl je wacht op een proces?

[ Voor 16% gewijzigd door FragFrog op 04-03-2007 14:38 ]

[ Site ] [ twitch ] [ jijbuis ]

Pagina: 1