Olen tekemässä pokeria ja minun pitäisi saada siihen pelaajille aikaraja miettimiseen. Käytän php:tä ja ajaattelin käyttää yhtä koodia jota jokainen pelaaja hakee 1 sekunnin välein. Tähän koodin voisi laittaa että hakee tietokannasta pelaajan vuoron alkamisajan ja sitten se katsoo onko aika loppu. Ajattelin että kun pelaajia on enimmillään 9 pöydässä niin miten kannattaisi tehdä se ettei kaikki 8 hae yhden pelaajan vuoron ohitusta samaan aikaan ja 7 tulee error. Onko tämä hyvä lähestymistapa vai onko parempia ideoita?
Lisäys: Tarkennan viellä että kysymyksenäni on miten sql:llällä voi hakea että sisältääkö se jotain ilman erroria.
E1ss kirjoitti:
Tarkennan viellä että kysymyksenäni on miten sql:llällä voi hakea että sisältääkö se jotain ilman erroria.
Ihan hyvä tarkennus, koska eihän tuosta alkuperäisestä ajatuksenvirrasta saa mitään selvää.
SQL:llä voi hakea sisältääkö joku jotain esimerkiksi (mysql)
SELECT id FROM taulu WHERE sarake=52 LIMIT 1
Tämä siis palauttaa yhdestä rivistä yhden sarakkeen id, jos taulussa on jotain jossa ehto sarake=52 täyttyy ja ei palauta yhtään riviä jos siellä ei ole mitään ehtoa vastaavaa.
Itse ongelmaan tuntuisi toki järkevämmältä, että pelaaja hakee tiedon kerran ja saa palvelimelta esimerkiksi vastauksen kauanko vuoro on vielä jäljellä. En nyt keksi mitään järkeä siinä että samaa asiaa pitäisi kysyä sekunnin välein, ellei se sitten voi kesken kaiken muuttua.
ok
Tietokanta pitää kyllä itse huolen siitä, että samanaikaiset kyselyt ajetaan oikein ja ilman virheitä.
Grez voisitko selittää mitä tarkoitat että pelaaja hakee koodia vain silloin kun jokin muuttuu. Miten pelaajan on mahdollista tietää onko muut pelaajat tehneet siirron jos se ei jatkuvasti hae koodia ja katso onko tietokannassa tapahtunut muutoksia.
E1ss kirjoitti:
Grez voisitko selittää mitä tarkoitat että pelaaja hakee koodia vain silloin kun jokin muuttuu.
Niin no siis alkuperäisessä viestissä kirjoitit että tietokannassa olisi vuoron alkamisaika ja katsottaisiin milloin vuoro loppuu. Ei kai se alkamisaika mihinkään muutu.
Tarkoitit kuitenkin ilmeisesti, että jos pelaaja on jo tehnyt siirtonsa ja odotetaan sitä että muutkin pelaajat "tulevat valmiiksi". Tätä ei tosiaan voi tietää muuten kuin saamalla tiedon serveripäästä. PHP:llä se saattaa olla järkevää* juuri noin kuin ehdotit, että 1 sekunnin välein pollataan clientiltä.
*(Toinen vaihtoehto olisi avata pyyntö ja jäädä odottamaan vastausta, mutta tämä ilmeisesti jättäisi jokaista pyyntöä kohden PHP-prosessin pyörimään, ja kuormittaisi ehkä näin enemmän serveriä kuin kerran sekunnissa tapahtuvat nopeat pyynnöt. Tosin jos kuormitus tulee jossain vaiheessa ongelmaksi en ehkä tekisi palvelinpäätä ylipäätään PHP:llä)
Eikö PHP:ssä ole websocket mahdollisuutta? Sillähän noi jatkuvat systeemit kannattaa tehdä eikä mitään pollausvirityksiä intervalleilla.
Ei siihen voi ainakaan aukottomasti luottaa, kun on hyvin tyypillistä konffata palvelin tappamaan php-prosessit 30 tai 60 sekunnin jälkeen pyynnön "jäädessä jumiin". Web Socketit vaativat 24/7 pyörivän sovelluksen taustalle. Tarvittavan prosessin ajaminen tuskin on mahdollista ainakaan missään web-hotellissa.
Tästä en kyllä ole ennen kuullutkaan. Web-hotelleissa olen pyörittänyt railsin päällä applikaatioita ja käyttänyt websocketteja jo vuosia, eikä ole koskaan tullut tuollaista tilannetta vastaan, ja apachen päällä nekin pyörii (tai joskus nginxin, palveluntarjoajasta riippuen). Miksi juuri PHP konffataan näin typerästi? Tämähän tarkoittaa että mm. nodejs -pohjaiset ratkaisut eivät toimisi missään web-hotellissa, koska varsinainen web server aina vaan proxytetään nodejs applikaatioon, joka taasen pyörittää oman serveriään itsenäisesti, vaikka sitten Koa:lla tai Expressillä. Eli tilanne on sama, koska kyseinen serveri on päällä sen 24/7 eikä ole sidonnainen mihinkään 30/60sek sääntöihin. NodeJs softiin tosin en ole mitään webhotellia ikinä käyttänyt, nämä on käytännössä menneet aina PaaS:iin tai virtuaalikoneille.
groovyb kirjoitti:
Tästä en kyllä ole ennen kuullutkaan. Web-hotelleissa olen pyörittänyt railsin päällä applikaatioita ja käyttänyt websocketteja jo vuosia, eikä ole koskaan tullut tuollaista tilannetta vastaan, ja apachen päällä nekin pyörii (tai joskus nginxin, palveluntarjoajasta riippuen). Miksi juuri PHP konffataan näin typerästi?
Koska php on "shared nothing" -arkkitehtuuri ja historiallisesti logiikka on ollut se, että sivupyynnön tullessa avataan php-tulkki ja vastauksen lähtiessä se suljetaan. Tämä ei ole oleellisesti muuttunut mihinkään, vaikka suoritusta onkin pyritty optimoimaan esimerkiksi poolaamalla tulkkeja valmiiksi jne. Sivupyynnön tullessa koko php-järjestelmä initialisoidaan nollasta ja vastauksen lähtiessä kaikki tuhotaan. Jos jotain optimointia haluaa tehdä, niin kaikki on sovelluksen omalla vastuulla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.