PHP Navngivne rør på vinduer

Indlæg af Hanne Mølgaard Plasc

Problem



Ok her er scenariet. Lad os sige, jeg har et php script, der skal vente på, at visse oplysninger bliver tilgængelige, og jeg regnede med det. 'Det er en god løsning, hvis jeg kunne lave denne scriptblok i stedet for travlt til Disse oplysninger bliver tilgængelige. Oplysningerne i sig selv vil blive leveret af en anden forekomst af et php script. Og lad os sige, jeg vil have X antal sådanne anmodninger til at blokere, indtil dette 1 forekomst af et script leverer disse oplysninger.
Jeg regnede med at jeg kunne bruge et navngivet rør, læseren processer ville blokere venter på røret skal skrives til, og forfatteren ville skrive og straks unblock alle læsere ved at give de nødvendige oplysninger gennem røret eller på anden måde.
Jeg fandt posix\_mkfifo, men det virker ikke på windows aparently, er der nogen anden måde at gøre dette, der ville arbejde på både windows og * nix.
Eller måske er der en slags måde at bare lave en flok forespørgselsblok, og for en anden anmodning om at 'sætte dem fri', når det er tid.
Jeg vil virkelig ikke ty til travle sløjfer, jeg vil spare CPU uden at bruge 1 sekunders forsinkelser og sutch.

Bedste reference


Hvis du har ledige udvidelser til rådighed (eller stream\_socket\_server()) kan du oprette en søserver i scriptet, der giver informationen til de andre scripts - lad os kalde det script til 'master'. Du kan så have alle dine scripts, som du vil blokere - 'slaverne' - gør en fsockopen() til localhost og sæt dem så op, at fgets(), fwrite() osv. Vil blokere indtil dataene stilles til rådighed over disse stikkontakter.


Dette er ikke ligefrem den mest effektive tilgang, da du skal under IPC ud til TCP stacken, men hvis du vil have det til at virke på Windoze, kan du ikke bruge * nix domæne stik, så det er hvad du sidder fast med.


Det eneste andet, jeg kan tænke på, at du kunne gøre, er noget, der involverer en tempfil og flock(), da det som standard vil blokere, indtil det kan få en lås. Dette er nok den mest bærbare mulighed, da opførelsen af ​​flock() har været den samme overalt siden forældremyndigheden, men det kan heller ikke (og sandsynligvis ikke) arbejde med PHP-forekomster, der kører som et ISAPI-modul (se PHP manualen ). [7]