ďťż
 
zagadka do rozwiazania - dlaczego licznik strony sie resetuje? ďťż
 
zagadka do rozwiazania - dlaczego licznik strony sie resetuje?
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    =?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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • tejsza.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com