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...
Fórum › PHP
Uspatie requestu až do okamihu, kým bude prebudený iným requestom
treba si este uvedomit ze beh kodu ma nejaky limit, vacsinou 30 sekund, cize po tomto case ti tak ci tak "zdochne"
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/...
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.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Nahradenie slovo inym — založil josa
Triedenie s inym typom dát — založil marioff
Vyhladanie retazcov a nahradenie iným — založil jurinecko
Win API , skoda ze nejde aj iným — založil Peter D.
Moderátoři diskuze