Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: flock toimivuus

Sivun loppuun

pistemies [28.01.2012 17:50:21]

#

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.

tsuriga [28.01.2012 19:44:21]

#

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.

Metabolix [28.01.2012 19:48:01]

#

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.

pistemies [28.01.2012 20:09:39]

#

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ö:

if (!flock($fp, LOCK_EX)) {

}

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.

tsuriga [28.01.2012 20:29:25]

#

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); }.

pistemies [28.01.2012 21:03:24]

#

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

tsuriga [29.01.2012 00:55:32]

#

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.

pistemies [29.01.2012 11:57:57]

#

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".


Sivun alkuun

Vastaus

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

Tietoa sivustosta