Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP, MySQL: Liikaa avoimia yhteyksiä?

Sivun loppuun

E1ss [04.05.2017 19:57:07]

#

Minulla tuli tälläinen viesti kun yritin yhdistää php koodeihini jotka ovat ehostin serverillä.

SQLSTATE[42000] [1203] User freerol1_hello already has more than 'max_user_connections' active connections

Mitä tämä tarkoittaa? Luin jostain että se liittyisi jotenkin siihen että koodissani on liikaa sql kutsuja ja saattaisin päästä pois errorista kun käyttäisin komentoa mysql_close(); ja mysql_refresh(); En kuitenkaan ymmärrä miten niitä käytetään joten voisiko joku mahdollisimman pian vastata. Alla viellä yhden php koodini metodi:

function WinnerPosition($yhteys){
		global $tableXCards;
		$kysely = $yhteys->prepare("SELECT card FROM $tableXCards WHERE id = ?");
		$kysely->execute(array("winner"));
		$tulos = $kysely->fetch(PDO::FETCH_OBJ);
		$winners;
		foreach($tulos as $winners){}
		$winnerList = explode(";", $winners);
		echo "winner:";
		foreach($winnerList as $winner){
			echo "$winner:";
		}
	}

Lisäys: Viellä lisäksenä että koodini hakee vähän yli puolet sql kutsuista ja sen jälkeen tulostaa errorin.

Lisäys: Nyt tutustuin asiaan enemmän ja huomasin että se onkin joku shared hostingin asettama raja. Onko kellään mitään ideoita miten sitä muuttaa. Luin jotain juttuja englanniksi mutta minusta niissä oli joitain aukkoja joten jos joku viitsisi kirjoittaa kokeillun ohjeen niin olisin kiitollinen.

xxmss [04.05.2017 23:50:58]

#

Taitaa riippua webhotellin tarjoajasta tämä asia, miten monta yhtäaikaista yhteyttä tietokantaan sallitaan.

Teuro [05.05.2017 10:54:44]

#

Saatttaa olla palvelutarjoajan virhe. Stackoverflow:a on hiukan tarinaa

Muutoin kyselysi pitäisi kaiken järjen mukaan palauttaa yksiselitteinen voittaja tai korkeintaan taulukollinen voittajia, mutta tulosjoukon käsittely on toteutettu jotenkin oudosti. Missä vaiheessa voittajat yhdistetään yhdeksi merkkijonoksi?

E1ss [05.05.2017 11:58:50]

#

Kokeilin muutamaa overstackin vastausta ja paras oli tämä

SET GLOBAL max_user_connections = 0;

Kun tuon muuttaa nollaksi joku väitti että sql kutsuja saa tehdä loputtomasti. Ongelmana tuli kuitenkin että se ei toteuttanut käskyä vaan tulosti

Access denied; you need (at least one of) the SUPER privilege(s) for this operation

Onko kellään ideoita että miten saisin oikeuden tai voisinko jotenkin ohittaa tämän. Yritin ottaa yhteyttä ehostin apuun mutta siellä joku intialainen ei oikein ymmärtänyt ongelmaani.

E1ss [05.05.2017 14:33:42]

#

Keskustelin uudelleen shared hosting palvelun ylläpitäjien kanssa ja he sanoivat että max user connections on 25 eikä sitä saa suuremmaksi. Luin hieman (mutta en ymmärtänyt) että sql kutsu pitäisi jotenkin sulkea tai jotain. Onko jollain antaa esimerkki koodia miten sql kutsuja ei tule yhden koodin aikana yli 25.

Metabolix [05.05.2017 18:02:01]

#

Tietokantayhteys sulkeutuu automaattisesti sivupyynnön lopussa, jos et erikseen tee siitä pysyvää (persistent) eikä palvelimessa ole jotain kummallista vikaa.

Kysymys ei ole ”yhden koodin aikana” tulevista yhteyksistä vaan kaikista tietokantayhteyksistä. On noin neljä vaihtoehtoa:

  1. Sinulla on samaan aikaan kesken enemmän kuin 25 sivunlatausta. Tämä voisi johtua joko suuresta käyttäjämäärästä tai omatekoisesta virheestäsi, jos esim. olet tehnyt jonkin silmukan, joka odottaa pelaajan omaa vuoroa ja jää jotenkin taustalle pyörimään.
  2. Olet oikeasti tunaroinut koodisi ja avaat monta tietokantayhteyttä. Varmista, että sivullasi on vain yhdessä paikassa ”new PDO” esimerkiksi oppaiden mukaisesti toteutettuna.
  3. Olet ottanut ilmaisen webhotellin, ja freerol1_hello ei olekaan oma tunnuksesi vaan jokin jaettu tietokantatunnus, ja muiden käyttäjien sivut tukkivat tietokannan. Tämä olisi aivan huikea ominaisuus myös tietoturvaa ajatellen.
  4. Palvelimessa on jotain muuta vikaa.

Turha valittaa myöskään, että intialainen ei ymmärrä ongelmaasi, kun selvästi et edes itse ymmärrä kunnolla ongelmaasi etkä erota MySQL-yhteyttä ja MySQL-kyselyä ja puhut jostain "sql kutsusta", joka ei nyt varmasti ole oikea termi.

E1ss [05.05.2017 19:21:24]

#

Kiitos kattavasta vastauksesta. Nyt kun kävin vaihtoehdot läpi niin ainakaan 2 ja 3 se ei ole. Ja kun otin yhteyttä olisi luullut että he olisivat huomanneet jos siellä on jotain ongelmaa joten vaihtoehto 4 ei ole mahdollinen. Ainoaksi vaihtoehdoksi jää 1 joka on kuitenkin epätodennäköinen. Se on jännä juttu että kun menen koodiin selaimella tulostuksessa ei mainita virhettä mutta se ei kuitenkaan tulosta kaikkea. Unityllä taas se tulostaa samaan kohtaan jonka jälkeen siinä lukee error. Tätä ongelmaa ei ollut keskiviikkona mutta kun lisäsin koodiin muutaman pienen function joissa on sql-kysely niin ongelma tuli. Näitä functioita selain juuri ei tulosta ja error viesti tulee. Voisiko olla mahdollista että juuri nämä kaksi functiota olisi täyttänyt kyselyiden määrän vai voisiko niissä olla jokin virhe jota selain ei jostainsyystä tulosta?

Lisäys:

Tämä on todella mystinen juttu koska kokeilin poistaa uusimmat jutut koodistani ja se ei silti toiminut. Sen jälkeen tein uuden käyttäjän mutta se ei silti toiminut. Osaako joku sanoa mitä tehdä?

Kokeilin viellä muita koodejani ja ne toimivat normaalisti. Pitäisikö minun koodata koko koodi uudestaan vai voisiko jotain viellä yrittää.

Grez [05.05.2017 20:09:38]

#

Jos minulla olisi vastaava ongelma enkä millään keksisi mikä koodissaon vikana, niin kokeilisin varmaan ajaa systeemiä omalla palvelimella (esim. omalla koneella) ja katsoa montako samanaikaista yhteyttä muodostuu ja jos niitä tulee enemmän kuin oletettu, niin sitten voisi helpommin selvittää mistä johtuu erilaisilla debugtyökaluilla.

E1ss [05.05.2017 20:59:18]

#

Käytän xappia joten näkeekö siitä jotenkin kuinka monta yhteyttä on käytössä? Olisiko viisasta tehdä koko koodista kommentti ja yksi functio kerralla kokeilla koska ongelma ilmenee. Tuo debug työkalu juttu kuulostaa hyvältä mutta minulla ei ole kokemusta. Jos viitsisit laittaa linkin niin olisin kiitollinen.

Grez [05.05.2017 21:54:54]

#

E1ss kirjoitti:

Käytän xappia joten näkeekö siitä jotenkin kuinka monta yhteyttä on käytössä?

Xapp ei ole itselle ennestään tuttu, mutta yleisesti ottaen MySQL:ltä voi kysyä
http://stackoverflow.com/questions/1620662/mysql-see-all-open-connections-to-a-given-database

E1ss [05.05.2017 22:20:32]

#

Kiitos grez

Metabolix [05.05.2017 23:19:11]

#

Jos kerran osa sivusta tulostuu, on aika helppo nähdä, mihin tulostus loppuu, ja voit sitten etsiä koodista vastaavan kohdan. Siinä kohdassa varmaan yrität luoda uuden tietokantayhteyden (new PDO), koska muutenhan virhettä ei voi tapahtua. Jos se ei ole ensimmäinen tietokantaa käyttävä kohta koodissasi, kyseessä on mainitsemani virhe 2, eli luot itse liikaa tietokantayhteyksiä samassa koodissa.

E1ss [06.05.2017 10:48:16]

#

Tuo kyseinen winnerPosition functio on se jonka jälkeen mitään ei tulostu. En näe ainakaan mitään virheitä mutta kokeilen muuttaa hieman C# koodiani jossa saattaisi olla virhe.

Lisäys: En löytänyt virhettä C# koodista joten en tiedä mitä tehdä.

Lisäys: NYT SAIN TOIMIMAAN!!! Tietokannastani puuttui yksi tieto joka jostain syystä aiheutti tälläisen ongelman. Kiitos kaikille vastauksista.

The Alchemist [06.05.2017 12:53:53]

#

E1ss kirjoitti:

Se on jännä juttu että kun menen koodiin selaimella tulostuksessa ei mainita virhettä mutta se ei kuitenkaan tulosta kaikkea.

Se on ihan normaali juttu, ei jännä juttu. Tuotantopalvelimet pääsääntöisesti piilottavat virheet, koska ne voivat sisältää salasanoja, tiedostopolkuja tai konffeja tai muuta tietoa, jota ei haluta paljastaa kenelle tahansa vierailijalle. Voit laittaa oma-aloitteisesti virheiden näytön päälle ja mahdollisesti ne ovat myös luettavissa palvelimen lokeissa, jos sinulla on sinne pääsyä.

E1ss [30.06.2017 15:19:59]

#

Nyt minulla tulee taas ongelmaa mutta oudointa tässä on se että ongelman tullessa koodissa sammutan koodin suorituksen ja yritän minuutin päästä uudelleen. Nyt koodi joka ennen toimi aiheuttaa max users connection ongelman ja kun odotan yli 5 min koodi toimii taas. Jääkö servereille jokin pyörimään pariksi minuutiksi jonka takia oikeat koodit eivät toimi huonon koodin luvun jälkeen?

Metabolix [30.06.2017 15:37:43]

#

Jos koodissasi on sopivanlainen bugi (esim. ikuinen silmukka tai pitkä sleep-komento tms.), koodi jumittaa palvelimella siihen asti, että palvelin sammuttaa sen esimerkiksi liian pitkän suoritusajan takia. Et voi selaimesta luotettavasti pysäyttää PHP-skriptiä. Punaisen rastin painaminen ei välttämättä pysäytä koodia.

Suunnittele PHP-koodisi niin, että se suoritetaan kerralla ja sivunlataus on varmasti ”heti” valmis. Ei kannata laittaa koodiin mitään uudelleen yrittämisen silmukoita tai odotuksia, jos ei ole ihan tarkkaan tiedossa, miten ne toimivat.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta