zagadka do rozwiazania - dlaczego licznik strony sie resetuje?
Adam Iganowicz - 21-08-2006 01:29
zagadka do rozwiazania - dlaczego licznik strony sie resetuje?
Witam, Spadla na mnie "pod opieke" pewna strona, na ktorej dziala sobie licznik. index.html wyglada nastepujaco:
<?php define("HOME", "1");
require_once("szablony/naglowek.php"); require_once("szablony/glowne/menu_glowne.php"); require_once("szablony/srodek.php");
require_once("szablony/glowne/text_witajacy.php");
require_once("szablony/stopka.php"); ?>
w czesci naglowek.php mamy kod ustawiania licznika:
<?php session_start(); if(!isset($_SESSION['counter'])) { if(file_exists("licznik.txt")) { $p = fopen("licznik.txt", "r"); flock($p, LOCK_SH); $count = (double) fread($p, filesize("licznik.txt")); flock($p, LOCK_UN);
fclose($p);
//zwiekszenie o jeden i zapis $count +=1; $p = fopen("licznik.txt", "w"); flock($p, LOCK_EX); fwrite($p, $count); flock($p, LOCK_UN); fclose($p); }
$_SESSION['counter'] = true; } ?>
a w czesci srodek.php jest wywolanie licznika:
<?php
if(file_exists("licznik.txt")) { $plik = fopen("licznik.txt", "r");
if($plik==null) $licznik = '0'; else { flock($plik, LOCK_SH); $licznik = fread($plik, filesize("licznik.txt")); flock($plik, LOCK_UN); } } else $licznik = "1";
for($i=0; $i<10-strlen($licznik); $i++) { echo "<img src=\"grafika/licznik/0.png\" alt=\"\" border=\"0\"/>"; }
for($i=0; $i<strlen($licznik); $i++) { echo "<img src=\"grafika/licznik/".substr($licznik, $i, 1).".png\" alt=\"\" border=\"0\"/>"; } ?>
No i raz na jakis czas licznik sie samoistnie resetuje i jedzie pewnie od zera, czego nie jestem pewien bo zauwazam dopiero jak zamiast 36tys odzwiedzin, ktore byly jeszcze wczoraj, wyswietla sie np. 88 ;) Nie ma szans zeby ktos recznie i zlosliwie nadpisywal plik licznik.txt bo haslo do ftp gdzie lezy strona znam tylko ja.
Jakby sie komus z was chcialo rozwiazac ta zagadke to bylbym bardzo wdzieczny. (nie ukrywam ze php to nie jest jakas moja szczegolnie mocna strona - nie wykluczam wiec ze nie widze w tym kodzie jakiegos oczywistego bledu ktory ktos z was zauwazy od razu ;)
Pozdrawiam. AI
porneL - 21-08-2006 01:33
On Sun, 20 Aug 2006 13:19:39 +0100, Adam Iganowicz <iganowicz@wp.pl.xyz> wrote:
> No i raz na jakis czas licznik sie samoistnie resetuje i jedzie pewnie od > zera, czego nie jestem pewien bo zauwazam dopiero jak zamiast 36tys > odzwiedzin, ktore byly jeszcze wczoraj, wyswietla sie np. 88 ;)
bo musisz zdjąc lock między końcem odczytu, a początkiem zapisu. Niestety nie da się trzymać pliku zablokowanego cały czas, dlatego wszystkie cuda na plikach są skazane na porażkę. Użyj bazy.
-- * html {redirect-to: url(http://kurs.browsehappy.pl);} this.author = new Geek("porneL");
sg - 21-08-2006 01:33
porneL napisał(a): > On Sun, 20 Aug 2006 13:19:39 +0100, Adam Iganowicz <iganowicz@wp.pl.xyz> > wrote: > > >> No i raz na jakis czas licznik sie samoistnie resetuje i jedzie pewnieod >> zera, czego nie jestem pewien bo zauwazam dopiero jak zamiast 36tys >> odzwiedzin, ktore byly jeszcze wczoraj, wyswietla sie np. 88 ;) > > bo musisz zdjąc lock między końcem odczytu, a początkiem zapisu. > Niestety nie da się trzymać pliku zablokowanego cały czas, dlatego > wszystkie cuda na plikach są skazane na porażkę. Użyj bazy. >
nie są, nie są, nie czaruj... zakładasz exclusive lock na początku, odczytujesz dane, zmieniasz je, zapisujesz i zwalniasz lock.
sg
the_foe - 21-08-2006 01:33
Dnia Sun, 20 Aug 2006 13:56:23 +0100, porneL napisał(a):
> On Sun, 20 Aug 2006 13:19:39 +0100, Adam Iganowicz <iganowicz@wp.pl.xyz> > wrote: > > >> No i raz na jakis czas licznik sie samoistnie resetuje i jedzie pewnie od >> zera, czego nie jestem pewien bo zauwazam dopiero jak zamiast 36tys >> odzwiedzin, ktore byly jeszcze wczoraj, wyswietla sie np. 88 ;) > > bo musisz zdjąc lock między końcem odczytu, a początkiem zapisu. Niestety > nie da się trzymać pliku zablokowanego cały czas, dlatego wszystkie cuda > na plikach są skazane na porażkę. Użyj bazy.
da sie, uzywajac while. trzymasz skrypt w petli dopoki plik nie jest wolny. Oczywiscie to kosztuje duzym narzutem straty wydajnosci, ale jak ktos nie chce uzywac bazy to rozumiem ze wizyt nie ma na poziomie 1000 na sekunde ;)
the_foe - 21-08-2006 01:33
Dnia Sun, 20 Aug 2006 15:06:26 +0200, sg napisał(a):
> porneL napisał(a): >> On Sun, 20 Aug 2006 13:19:39 +0100, Adam Iganowicz <iganowicz@wp.pl.xyz> >> wrote: >> >> >>> No i raz na jakis czas licznik sie samoistnie resetuje i jedzie pewnie od >>> zera, czego nie jestem pewien bo zauwazam dopiero jak zamiast 36tys >>> odzwiedzin, ktore byly jeszcze wczoraj, wyswietla sie np. 88 ;) >> >> bo musisz zdjąc lock między końcem odczytu, a początkiem zapisu. >> Niestety nie da się trzymać pliku zablokowanego cały czas, dlatego >> wszystkie cuda na plikach są skazane na porażkę. Użyj bazy. >> > > nie są, nie są, nie czaruj... > zakładasz exclusive lock na początku, odczytujesz dane, zmieniasz je, > zapisujesz i zwalniasz lock. > > sg
tiak, ale w przypadku licznika, jesli wejdzie Ci na strone powiedzmy 1000 ludzi na raz :) to zaloze sie ze co prawda licznik sie nie zzeruje ale zarejstruje cos kolo 100 wejsc. bez while nie pojedziesz, a z while to tez droga donikad bo zarzniesz serwer przy duzej liczbie userow na raz. Pozostaje tylko baza. Operacje na plikach oplacaja sie tylko kiedy jest duza dysproporcja miedzy odczytem a zapisem. Na przyklad zapis jest rzadko wykonywany, albo nie nastepuje w ogole odczytywanie plikow (dopis do pliku, np logi). W przypadku kiedy na kazdy odczyt jest jeden zapis lub odwrotnie to na dluzsza mete nie ma sensu
Jacek Dębowczyk - 23-08-2006 00:16
the_foe <the_foeWYTNIJ@wytnijwp.pl> napisał(a): > da sie, uzywajac while. trzymasz skrypt w petli dopoki plik nie jest > wolny.
Nie prawda. Flock() domyślnie jest blokujący.
> Oczywiscie to kosztuje duzym narzutem straty wydajnosci, ale jak > ktos nie chce uzywac bazy to rozumiem ze wizyt nie ma na poziomie 1000 na > sekunde ;)
Nie prawda. W większości systemów flock() jest zaimplementowany na syscallu, więc narzut pustych cykli nie wchodzi w grę.
-- Pozdrawiam, Jacek.
I will not buy this record - it is scratched.
the_foe - 23-08-2006 00:16
Dnia Mon, 21 Aug 2006 21:28:25 +0000 (UTC), Jacek Dębowczyk napisał(a):
> the_foe <the_foeWYTNIJ@wytnijwp.pl> napisał(a): >> da sie, uzywajac while. trzymasz skrypt w petli dopoki plik nie jest >> wolny. > > Nie prawda. Flock() domyślnie jest blokujący.
WOW, a ja myslalem ze smazy frytki... Tylko powiedz mi co sie stanie jak dzialanie 1000 userow w ciagu sekundy spowoduje probe nalozenia LOCK_EX 1000 razy w tym samym czasie? Rozwiazaniem jest taki zapis (z komentarzy manuala): function wait_for_file($fp) { if ($fp === false) { return; } while (true) { if (flock($fp, LOCK_EX)) { return; } $k = rand(0, 20); usleep(round($k * 10000)); # k * 10ms } } > >> Oczywiscie to kosztuje duzym narzutem straty wydajnosci, ale jak >> ktos nie chce uzywac bazy to rozumiem ze wizyt nie ma na poziomie 1000 na >> sekunde ;) > > Nie prawda. W większości systemów flock() jest zaimplementowany na syscallu, > więc narzut pustych cykli nie wchodzi w grę.
a co Ty z ta nieprawda tak wyskakujesz? Naucz sie najpierw czytac ze zrozumieniem. Pisalem o narzucie jaki daje while() a nie operacje na plikach
-- http://the-foe.blogspot.com/
Jacek Dębowczyk - 23-08-2006 00:16
the_foe <the_foeWYTNIJ@wytnijwp.pl> napisał(a): >> Nie prawda. Flock() domyślnie jest blokujący. > > WOW, a ja myslalem ze smazy frytki... > Tylko powiedz mi co sie stanie jak dzialanie 1000 userow w ciagu sekundy > spowoduje probe nalozenia LOCK_EX 1000 razy w tym samym czasie?
To jak w końcu, w tym samym czasie, czy w ciągu sekundy? To pierwsze jest całkowitą abstrakcją, jeśli chodzi chociażby o dostęp do dysku. A jeśli drugie, to co za różnica - 1 sekunda, 10, czy 100? Conajwyżej każdy z userów poczeka o tych kilkadziesiąt ms dłużej na dostęp do pliku.
> Rozwiazaniem jest taki zapis (z komentarzy manuala): > function wait_for_file($fp) { > if ($fp === false) { > return; > } > while (true) { > if (flock($fp, LOCK_EX)) { > return; > } > $k = rand(0, 20); > usleep(round($k * 10000)); # k * 10ms > } > }
Więc jednak smaży frytki?!? Skoro już wydajesz takie autorytatywne sądy, to racz się dokładniej zapoznać z sytuacją, kiedy flock() zwraca FALSE. Ja bym zrobił dokładnie takjak w komentarzu znajdującym się zaraz nad tym, na który się powołujesz: flock($f, LOCK_EX) or die("Error getting lock!");
.... ale oczywiście życzę powodzenia Twojemu procesorowi w przypadku trafienia na system plików nie wspierający flock().
>> Nie prawda. W większości systemów flock() jest zaimplementowany na syscallu, >> więc narzut pustych cykli nie wchodzi w grę. > > a co Ty z ta nieprawda tak wyskakujesz? Naucz sie najpierw czytac ze > zrozumieniem.
Jeśli już, to pisać ze zrozumieniem. Dopiero dostrzegłem orta, zaco niniejszym przepraszam czytelników.
> Pisalem o narzucie jaki daje while() a nie operacje na > plikach
A ja pisałem o tym, że użycie while() jest zbyteczne, więc możejednak Tobie przyda się nauka czytania ze zrozumieniem?
-- Pozdrawiam, Jacek.
I will not buy this record - it is scratched.
the_foe - 23-08-2006 00:17
Dnia Mon, 21 Aug 2006 23:44:17 +0000 (UTC), Jacek Dębowczyk napisał(a):
> the_foe <the_foeWYTNIJ@wytnijwp.pl> napisał(a): bla bla bla, powiem tylko nie znasz sie... flock NIGDY w 100% nie zabezpieczy pliku tak jakbys chcial. Problemem jest to, ze w dostepie do pliku nie mqa czekania jesli damy LOCK_EX zaden proces nie ma do niego dostepu do czasu LOCK_UN. Tak wiec jesli do pliku cos chce sie dobrac miedzy tymi zdarzeniami zobaczy fige z makiem.
-- http://the-foe.blogspot.com/
Mik - 23-08-2006 00:17
Dnia Sun, 20 Aug 2006 15:15:41 +0200, the_foe napisał(a):
> > da sie, uzywajac while. trzymasz skrypt w petli dopoki plik nie jest > wolny. Oczywiscie to kosztuje duzym narzutem straty wydajnosci, ale jak > ktos nie chce uzywac bazy to rozumiem ze wizyt nie ma na poziomie 1000 na > sekunde ;)
Qrcze.. ciekawy problem pojawia się na niektórych serwerach hostingowych. Maksymalna ilość połączeń z bazą to 4, wskazówka dotycząca stron www: używać krótkich połączeń i po wykorzystaniu zamknąć :) Aczkolwiek.. 1000wejść na sekundę, to raczej niewiele serwerów na świecie obsłuży :)
pozdr. Mik
the_foe - 23-08-2006 00:17
Dnia Tue, 22 Aug 2006 19:24:10 +0200, Mik napisał(a):
> Dnia Sun, 20 Aug 2006 15:15:41 +0200, the_foe napisał(a): > >> >> da sie, uzywajac while. trzymasz skrypt w petli dopoki plik nie jest >> wolny. Oczywiscie to kosztuje duzym narzutem straty wydajnosci, ale jak >> ktos nie chce uzywac bazy to rozumiem ze wizyt nie ma na poziomie 1000 na >> sekunde ;) > > Qrcze.. ciekawy problem pojawia się na niektórych serwerach > hostingowych. Maksymalna ilość połączeń z bazą to 4, wskazówka > dotycząca stron www: używać krótkich połączeń i po wykorzystaniu > zamknąć :) Aczkolwiek.. 1000wejść na sekundę, to raczej niewiele > serwerów na świecie obsłuży :) > > pozdr. > Mik
niewiele pozwala na stale polaczenie, a zwykle jest automatycznie zamykane z koncem skryptu (jesli nie bylo zamkniete). Sam nie mam jakiegos "boskiego" hostingu (qualityhostonline) a mam mysql.max_links unlimited. -- http://the-foe.blogspot.com/
Jacek Dębowczyk - 24-08-2006 05:08
the_foe <the_foeWYTNIJ@wytnijwp.pl> napisał(a): > bla bla bla, powiem tylko nie znasz sie...
Powinieneś skończyć na 'bla bla bla', przynajmniej byś się nie kompromitował.
> flock NIGDY w 100% nie zabezpieczy pliku tak jakbys chcial.
To ciekawe. Flock() w PHP jest tylko wrapperem na flocka systemowego, implementowanego w jądrach systemów operacyjnych jeszcze wówczas, gdy o PHP nikt nie słyszał. Wiele aplikacji uniksowych korzysta z powodzeniem zusług flock(). Czyżby ich autorzy byli niedouczeni? A inne pokrewne techniki - semafory, pamięć dzielona? Pewnie też sąg* warte, ekspercie? :>
> Problemem jest to, ze w dostepie do pliku nie mqa czekania jesli damy > LOCK_EX zaden proces nie ma do niego dostepu do czasu LOCK_UN. Tak wiec > jesli do pliku cos chce sie dobrac miedzy tymi zdarzeniami zobaczy figez > makiem.
Skąd u Ciebie ta zawziętość w bronieniu nieprawdziwej tezy? Wobec tak merytorycznych argumentów z Twojej strony, ogłaszam EOT.
PS. O tym, że flock() jest blokujący/czekający możesz się przekonać sprawdzając kod z mojego niegdysiejszego posta: http://groups.google.pl/group/pl.com...t&rnum=1&hl=pl
-- Pozdrawiam, Jacek.
I will not buy this record - it is scratched.
the_foe - 25-08-2006 02:51
Dnia Wed, 23 Aug 2006 00:19:19 +0000 (UTC), Jacek Dębowczyk napisał(a):
> the_foe <the_foeWYTNIJ@wytnijwp.pl> napisał(a): >> bla bla bla, powiem tylko nie znasz sie... > > Powinieneś skończyć na 'bla bla bla', przynajmniej byś się nie > kompromitował. > >> flock NIGDY w 100% nie zabezpieczy pliku tak jakbys chcial. > > To ciekawe. Flock() w PHP jest tylko wrapperem na flocka systemowego, > implementowanego w jądrach systemów operacyjnych jeszcze wówczas, gdy o PHP > nikt nie słyszał. Wiele aplikacji uniksowych korzysta z powodzeniem z usług > flock(). Czyżby ich autorzy byli niedouczeni? > A inne pokrewne techniki - semafory, pamięć dzielona? Pewnie też są g* > warte, ekspercie? :> > >> Problemem jest to, ze w dostepie do pliku nie mqa czekania jesli damy >> LOCK_EX zaden proces nie ma do niego dostepu do czasu LOCK_UN. Tak wiec >> jesli do pliku cos chce sie dobrac miedzy tymi zdarzeniami zobaczy fige z >> makiem. > > Skąd u Ciebie ta zawziętość w bronieniu nieprawdziwej tezy? > Wobec tak merytorycznych argumentów z Twojej strony, ogłaszam EOT. > > PS. O tym, że flock() jest blokujący/czekający możesz się przekonać > sprawdzając kod z mojego niegdysiejszego posta: > http://groups.google.pl/group/pl.com...t&rnum=1&hl=pl
wyglada na to ze masz racje. To ja sie nie znam. Musze zrewidowac moja wiedze na temat flocka. Pozdr. -- http://the-foe.blogspot.com/
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
=?ISO-8859-2?Q?Prosz=EA_o_ocen=EA_strony?=
[MS SQL 2000] - wielkosc strony danych a wielkosc klastra dyskowego
=?iso-8859-2?q?Projektu_/_layoutu_strony_tytu=B3owej_portalu_spo=B3eczno=B6 ci_internetowej?=
Pilnie poszukujemy webmastera Dd prowadzenia strony Naszego Radia!
=?iso-8859-2?Q?=5Bocena_strony=5D_-_pro=B6ba?=
Jak stworzyś odnośnik do strony www z wyliczonym wcześniej parametrem.
[wykonam] strony www, plakaty, ulotki, logotypy itp.
[wykonam] Strony www w php za 30 zł.
Re: [Oracle] Brak strony Database Administrator
program do zapisu obrazu całej strony www???
zanotowane.pldoc.pisz.plpdf.pisz.pltejsza.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|