Uspatie requestu až do okamihu, kým bude prebudený iným requestom – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Uspatie requestu až do okamihu, kým bude prebudený iným requestom – PHP – Fórum – Programujte.comUspatie requestu až do okamihu, kým bude prebudený iným requestom – PHP – Fórum – Programujte.com

 

Prog.0
Věrný člen
10. 6. 2010   #1
-
0
-

Ahojte, mám taký teoretický problém.

Hľadám čo najefektívnejší spôsob, napodobnenia metód wait() - notifyAll() z viac vláknového programovania.

Zhruba by som chcel urobiť to, že ak na server pošlem požiadavku, napr:
http://www...../wait.php

Tak server neodpovie v momente, ale až keď pošlem druhý request:
http://www...../notify.php

Jediný spôsob, ktorý ma zatiaľ napadá, je, že prvý request bude cyklicky testovať existenciu nejakého zdroja, napr. súboru, alebo riadku v databáze, a v momente, keď sa daný zdroj objaví (vytvorí sa zavolaním notify.php), tak proces bude pokračovať v behu.

To "cyklicky testovať" mi však príde veľmi neefektívne, chcel by som niečo, čo pri vyžšej návštevnosti nezapečie server...

Nahlásit jako SPAM
IP: 213.160.186.–
Prog.
zdenda
~ Anonymní uživatel
257 příspěvků
11. 6. 2010   #2
-
0
-

To není dobrý nápad. Napiš, na co to potřebuješ, určitě bude jiné řešení.

Nahlásit jako SPAM
IP: 213.211.51.–
marioff0
Expert
11. 6. 2010   #3
-
0
-

treba si este uvedomit ze beh kodu ma nejaky limit, vacsinou 30 sekund, cize po tomto case ti tak ci tak "zdochne"

Nahlásit jako SPAM
IP: 195.78.44.–
Škoda, že život sa nedá "sejvovať", tak že by som po zlom životnom rozhodnutí mohol začať odznova :([br] Lenivosť je matka pokroku.[br][br] http://cut.sk/ - odstrihni si dlhý link
Prog.0
Věrný člen
11. 6. 2010   #4
-
0
-

Ide o online app, kde komunikujú viacerí užívatelia, niečo ako chat.

Každý client odosiela asynchrónne requesty, ktorými sa pýta, či pre neho nie je niečo nové. Každý tento request spôsobí SELECT z DB a na základe výsledku odošle dáta, alebo info - že nič nové nie je a spojenie sa uzavrie. To sa deje cyklicky, hneď po prijatí odpovede posiela client ďalši request.

Toto som čiastočne zoptimalizoval tak, že ten request na serveri držím kým to ide. Za tan čas sa na serveri cyklicky robí ten SELECT a ak sa nájdu nejaké data, tak sa clientovi pošlú, no spojenie sa neuzavrie. Až client detekuje uzavretie spojenia, tak okamžite otvára nové... Tým som ušetril server od častého otvárania a zatvárania množstva spojení. Keďže teraz je ten cyklus odosielajúci selecty priamo na serveri, tak bola DB bombardovaná rýchlejšie, taktiež bol procák nonstop na 100%, čo však vyriešil krátky polsekundový delay (usleep(500000)) v tom cykle medzi selectami.

Stále však mám pocit, že by to šlo podstatne viac odľahčiť. Viem si predstaviť riešenie, ako Java Servlet, kde mám requesty ako samostatné vlákna, ktoré zdieľajú rovnaké zdroje a vedia navzájom vedia komunikovať. V PHP však nepoznám spôosob, akým získať info o ostatných bežiacich vláknach o ich uspávaní a prebúdzani, čím som odkázaný (pravdepodobne) na jediné riešenie, a to cyklické refreshovanie - select DB/čítanie súboru/...


Nahlásit jako SPAM
IP: 213.160.186.–
Prog.
KIIV
~ Moderátor
+43
God of flame
11. 6. 2010   #5
-
0
-

ja bych klidne pouzil irc:cgi a irc server .. + by se dalo pripojit i poradnym klientem

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
zdenda
~ Anonymní uživatel
257 příspěvků
11. 6. 2010   #6
-
0
-

Místo toho čekání by to "vlákno" serveru mohlo vyřídit stovky rychlých dotazů.

Udělej to normálně na straně klienta, ať si opakovaně (refresh, ajax, ...) třeba každých 5 sekund vyzvedává zprávy. S Keep-Alive se ti několik dotazů sloučí do jednoho spojení, takže není moc co řešit.
Pak můžeš ubrat na zátěži třeba prodloužením doby čekání před dalším dotazem, pokud ten předchozí nic nevrátí, a pak se zase vrátit na rychlejší dotazování, až bude nějaká aktivita.

Taky by se dalo úplně vyhodit SQL, ale to u malého projektu už vůbec nemusíš řešit.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý