Miten saisi (vai saisiko) php:lla tehtyä skriptin, joka näyttää kuinka paljon käyttäjiä on katsomassa sivua ilman tietokantaa? Löysin muutaman skriptin, joka tallentaa tämä tiedostoon, mutta mielestäni, jos samaan tiedostoon ruvetaan kirjoittamaan samanaikaisesti, niin se vaurioittuu.
Mitä tarkoitat että tiedosto vaurioituu o_O Eihän sinne voi edes kirjoittaa yhtä aikaan kun skriptihän tulkataan lause kerrallaan.
https://www.ohjelmointiputka.net/koodit_nayta.
Tossa ei ilmeisesti pysty kirjottamaan tiedostoon samaan aikaan.
rndprogy kirjoitti:
skriptihän tulkataan lause kerrallaan.
Jos kaksi käyttäjää samaan aikaan sivulla.
Jo, tarkoitan sitä, että jos tulee samanaikaisesti 2 eri käyttäjää sivulle, niin se tiedosto vaurioittuu.
Jos tiedostossa on vain sivuja selaavien käyttäjien ip:t ja kellonajat, niin herää kysymys, onko se niin vaarallista, jos se tiedosto hajoaa? Varsinkin, jos ja kun se itsestään korjaantuu seuraavalla sivunlatauksella. Pienemmillä käyttäjämäärillä tuo on kuitenkin todella epätodennäköistä.
Edit:
pr0 kirjoitti:
Jo, tarkoitan sitä, että jos tulee samanaikaisesti 2 eri käyttäjää sivulle, niin se tiedosto vaurioittuu.
Ei tiedosto hajoa, jos sivuilla on kaksi käyttäjää samaan aikaan. Tiedosto voi hajota, kun kaksi käyttäjää lataa sivun täsmälleen samaan aikaan, jolloin tavallaan kaksi php-skriptiä avaa tiedoston samalla hetkellä. Tähänkin auttaa hyvin pitkälti flock(), vaikka kuulemma sekään ei mitään takaa.
ajv kirjoitti:
Jos tiedostossa on vain sivuja selaavien käyttäjien ip:t ja kellonajat, niin herää kysymys, onko se niin vaarallista, jos se tiedosto hajoaa? Varsinkin, jos ja kun se itsestään korjaantuu seuraavalla sivunlatauksella. Pienemmillä käyttäjämäärillä tuo on kuitenkin todella epätodennäköistä.
Edit:
pr0 kirjoitti:
Jo, tarkoitan sitä, että jos tulee samanaikaisesti 2 eri käyttäjää sivulle, niin se tiedosto vaurioittuu.
Ei tiedosto hajoa, jos sivuilla on kaksi käyttäjää samaan aikaan. Tiedosto voi hajota, kun kaksi käyttäjää lataa sivun täsmälleen samaan aikaan, jolloin tavallaan kaksi php-skriptiä avaa tiedoston samalla hetkellä. Tähänkin auttaa hyvin pitkälti flock(), vaikka kuulemma sekään ei mitään takaa.
siis tarkoitan juuri sitä että hajoaa, jos tulee 2 käyttäjää samanaikaisesti. Toi flock kai toimii niin, että jos tulee 2
käyttäjää samanaikaisesti, niin vain yksi rekisteröidään.
Jos haluaa 99% varman systeemin, on tehtävä jokaiselle ip-osoitteelle oma tiedosto. Silti on mahdollista, että esim. minä ja työkaverini töissä ladataan samaan aikaan saman proxyn takaa samalla ip-osoitteella sivujasi ja tiedosto poksahtaa.
Löysin nyt alla olevan, mutta
saan virheilmoituksen: Parse error: parse error, unexpected T_ELSE in /home/echomcf/public_html/test.php
Osaako joku sanoa missä on vika?
<?php session_save_path("/path/"); /* Start the session */ session_start(); /* Define how long the maximum amount of time the session can be inactive. */ define("MAX_IDLE_TIME", 3); function getOnlineUsers(){ if ( $directory_handle = opendir( session_save_path() ) ) { $count = 0; while ( false !== ( $file = readdir( $directory_handle ) ) ) { if($file != '.' && $file != '..'){ // Comment the 'if(...){' and '}' lines if you get a significant amount of traffic if(time()- fileatime(session_save_path() . '\\' . $file) < MAX_IDLE_TIME * 60) { $count++; } } closedir($directory_handle); return $count; } else { return false; } } echo 'Number of online users: ' . getOnlineUsers() . '<br />'; ?>
Debuggailitko ite tota kuinka pitkään? Käy joku kunnon editori millä näät luo {}-lohkot, kthx.
Ps. Tuota on iha hirveä lukea kun sulkujen välissä on aina väli.
EDIT: Nonih tulipa se oikeaki vastaus sieltä, ite katoin väärin (kun ne sisennykset on _taas_ päin mäntyjä) ;V
Ei pitäisi olla niin huolimaton poista viesti-napin kanssa... No, tässä uudestaan:
<?php session_save_path("/path/"); /* Start the session */ session_start(); /* Define how long the maximum amount of time the session can be inactive. */ define("MAX_IDLE_TIME", 3); function getOnlineUsers(){ if ( $directory_handle = opendir( session_save_path() ) ) { $count = 0; while ( false !== ( $file = readdir( $directory_handle ) ) ) { if($file != '.' && $file != '..'){ // Comment the 'if(...){' and '}' lines if you get a significant amount of traffic if(time()- fileatime(session_save_path() . '\\' . $file) < MAX_IDLE_TIME * 60) { $count++; } } closedir($directory_handle); return $count; } } else { return false; } } echo 'Number of online users: ' . getOnlineUsers() . '<br />'; ?>
Nyt "toimii", mutta näyttää, että on 0 käyttäjää online:)
Aika jännä toteutus, kieltämättä. Itse sain toimimaan seuraavan:
<?php session_save_path("path"); session_start(); $_SESSION['foo'] = rand(); function getOnlineUsers($idle_minutes = 3){ $count=0; foreach(glob(session_save_path()."/*") as $file){ if(time()- fileatime($file) < $idle_minutes * 60) $count++; } return $count; } echo '<br />Number of online users: ' . getOnlineUsers() . '<br />'; ?>
Raakaversio ilman mitään ylimääräisiä tarkistuksia. Vika näytti itellä ainakin olevan siinä, että sessioon ei tehty muutoksia, jolloin session muokkausaika ei muuttunut. $_SESSION['foo'] = rand(); korjasi sen asian.
Nyt tulee seuraava varoitus:
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /home/echomcf/public_html/test.php:6)
Tämä varmaan johtuu sitä, että php.inissa on määritelty, että sessio alkaa automaattisesti ilman session_startia.
Jos reloadaan, niin onlineusereiden määrä kasvaa aina yhdellä (nollautuu kyllä 3 min. välein).
Kun poistan session_startin(), niin varoitusta ei tule, mutta onlineusereiden määrä on puhdas 0.Mistä tämä voi johtua?
Nonnniiin, nyt kai sain toimimaan kunnolla, mutta kiinnostaa sellainen, että jos on esimerkiksi ollut samalla sivulla 10 min. ja on lukenut siellä jotain ja idle_minutes=3 min., niin onko se niin että 3 min. jälkeen laskuri näyttää uusille käyttäjille, että käyttäjä ei enää ole sivulla? Jos tekee sellaisen online-laskurin, että se tallentaa tulevat käyttäjät MySql-tietokantaan, niin osaako MySql käsitellä samanaikaisen tietueiden lisäyksen?
Aihe on jo aika vanha, joten et voi enää vastata siihen.