Kyselen, onko tämä flock kuinka toimiva systeemi. Olen laittanut tämäntapaisen toiminnon tekemääni ohjelmaan. Tätä vaan en pysty oikein testaamaan :)
<?php $fp = fopen(".tmp/".$palsta."_lock.txt", "w"); if (flock($fp, LOCK_EX)) { ftruncate($fp, 0); fwrite($fp, $from); # palstan viestilaskuri $fm2 = fopen($topics2,"w"); fwrite($fm2, $next2); fclose($fm2); flock($fp, LOCK_UN); } else { echo "<div class=\"ruuhka\">Tällä hetkellä ruuhkaa! </div>"; } fclose($fp); ?>
Jos jollakin olisi tästä tietoa, onko tämä tarkoitukseen sopiva vai pitääkö kehitellä parempi.
Jotakuinkin (paitsi jos kysyy T.M.:ltä :p). Ehkä tohon vois laittaa jonkunlaisen loopin, että yrittäs X määrän kertoja lukita ennenko failaa. Ihmeelliset sisennykset.
Muista, että lukkotiedosto (johon nähtävästi myös haluat jotain tallentaa) tyhjenee w-lipun ansiosta jo tuossa fopen-rivillä täysin tilanteesta riippumatta.
tsuriga kirjoitti:
Jotakuinkin (paitsi jos kysyy T.M.:ltä :p). Ehkä tohon vois laittaa jonkunlaisen loopin, että yrittäs X määrän kertoja lukita ennenko failaa. Ihmeelliset sisennykset.
En ihan ymmärtänyt mitä tarkoitit tuolla loopilla..? Jotain tämmöstäkö:
Tarkoittaako tämä, ettei pysty lukitsemaan tiedostoa, koska se on jonkun toisen lukitsema..?
[Sisennykset johtuu paljon tuosta, miten sen kopioin ja liitin. Ylin rivi meni siksi vasempaan laitaan.]
Joo... tuossa pitäisi olla avausmoodina r+, kuten php.netin esimerkissäkin. On muuttunut minulla hoksaamatta.
Nyt kon tarkemmin asiaan tutustuin, niin jos tätä sivua on uskominen (vaikka onkin Perl-sivusto PHP:n sijaan), blokkaavan lukituksen pitäisi odottaa muiden lukkojen vapautumista. En sitten tiedä PHP:n toteutustavasta ja eroista eri käyttöjärjestelmissä, mutta mikäli useilta käyttäjiltä alkaa kuulumaan valitusta ruuhkaviesteistä, voit koittaa lisätä tuonne loopin mallia while (!($isLocked = flock($fp, LOCK_EX)) && $i++ < 10) { usleep(500); }
.
tsuriga kirjoitti:
En sitten tiedä PHP:n toteutustavasta ja eroista eri käyttöjärjestelmissä, mutta mikäli useilta käyttäjiltä alkaa kuulumaan valitusta ruuhkaviesteistä, voit koittaa lisätä tuonne loopin mallia
while (!($isLocked = flock($fp, LOCK_EX)) && $i++ < 10) { usleep(500); }
.
Tuolta löytyi myös tuollainen esimerkki:
https://www.php.net/manual/en/function.flock.php#101701
Antaako tuo 5 millisekuntia aikaa tehdä homma?
Ja tämä sieltä löytyi myös:
<?php //code here while (!flock($file_handle, LOCK_EX | LOCK_NB)) { //Lock not acquired, try again in: usleep(round(rand(0, 100)*1000)) //0-100 miliseconds } //lock acquired //rest of the code ?>
Laittaako tämä tulijan odottamaan ja kirjoittaa sitten kun on vapaata..? Tuleeko tuo edellä eka-skriptissä oleva flock-systeemi sitten tuohon silmukkaan usleepin jälkeen.. vai tuohon kohtaan rest of the code?
Offtopic 22:12. Olen tehnyt tätä hommaa asiaan, jota en itse tarvii. Sain idean tehdä php-foorumin, joka tallentaa kaikki viestit ym. xml-tiedostoihin. Olen joskus tehnyt foorumin, joka tallentaa teksti-tiedostoihin. Se oli vähän aikansa elänyt, mutta edelleen on kysyntää foorumeista, jotka toimii palvelimilla, joissa ei ole käytössä mysql ja eikä ole myöskään käytössä php 5. Mutta päätin, etten kyllä enää ala söheltämään taulukkoja txt-tiedostoihin. Sen verran mielenkiintoista oli tehdä tämä homma xml-systeemillä, että taidan soveltaa sitä johonkin muuhunkin. Oon laittanut ohjelman ladattavaksi tuonne Offtopic
Kirjoitat luultavimmin niin pieniä määriä tietoa, että voit korvata koko roskan tällä:
<?php file_put_contents('laskuri.txt', $count, LOCK_EX); ?>
Myös uudet tiedostonkäpristelyfunkkarit tukevat siis lukkoja. Ongelmia tässä tulisi/tulee ehkä silloin, jos yrität kirjoittaa PHP:lle asetetun muistimäärän verran dataa könttänä, mikä viittaisi ehkä suunnitteluvirheeseen.
Jos nyt rajat kumminkin sattuvat paukkumaan ja tarvitse noita vanhoja resurssivirtoja käyttäviä funktioita, löytämääsi koodia voisi parannella näin:
<?php $i = 0; $isLocked = false; while (!($isLocked = flock($flockHandle, LOCK_EX | LOCK_NB)) && $i++ < 10) { usleep(5000); } if ($isLocked) { // lock acquired } else { // system busy } ?>
Näin koodi ei jää ikuiseen silmukkaan, vaikka lukko ei purkautuisi, eikä käyttäjän tarvitse odotella kohtuuttomia aikoja sivun latautumista (nukutaan max 50 ms).
Jos palvelimella ei ole käytössä PHP 5, on kiireesti aika vaihtaa palvelinta, PHP 4:n tuki (patchaus) lopetettiin aikoja sitten.
Kiitoksia! Sovellan noita.
tsuriga kirjoitti:
Jos palvelimella ei ole käytössä PHP 5, on kiireesti aika vaihtaa palvelinta, PHP 4:n tuki (patchaus) lopetettiin aikoja sitten.
Olen aivan samaa mieltä. En vo olla kummastelematta seuraavaa tietoa:
mbi.mbnet.fi/mbinternet/ohjeet/php kirjoitti:
MBinternetissä on käytössä php:n versio 4.3.10.
Tämä minun ohjelma menee yleiseen jakeluun ja tässä on annettu jokin mahdollisuus myös noille, jotka pitävät sivujaan tuolla tai jossakin "ilmaispalvelimella".
Aihe on jo aika vanha, joten et voi enää vastata siihen.