Autor Zpráva
Lamička
Profil *
Neumím doladit jednu vychytávku: do txt souboru potřebuju zapisovat IP adresy (přístupy) jedné php stránky, zapisuju to zatím nějak takto:

$ip = $_SERVER['REMOTE_ADDR']; 
file_put_contents("ipecka.txt", "$ip" "\n", FILE_APPEND|LOCK_EX);

Potřeboval bych ovšem, aby to zapsalo maximálně posledních 20 IP adres (řádkově pod sebe), tak aby ty nové byly na prvním řádku a starší se odmazávaly (nad 20)....
AM_
Profil
$f = fopen('ipecka.txt', 'r+');
$ip = explode('\n', fread($f, filesize('ipecka.txt')));
while (count($ip) >= 20){
  array_shift($ip);
}
fseek($f, 0);
ftruncate($f, 0);
$ip[] = $_SERVER['REMOTE_ADDR'];
fwrite("ipecka.txt", implode('\n', $ip));
fclose($f);

file_get_contents a file_put_contents nejsou vhodné, lepší je vše provést při jednom otevření, protože se může stát že skript spustí dva uživatelé paralerně a zapíší se zkreslená data.
Lamička
Profil *
protože se může stát že skript spustí dva uživatelé paralerně a zapíší se zkreslená data
Aha? to jsem netušil... díky moc !!!
Nox
Profil
AM_
Tvůj skript myslím taky není atomický, jestli se nepletu... alespoň podle co jsem četl u Vrány "Na první pohled je vidět, že problém je mezi funkcemi fopen a fwrite",
tak by asi mohl být problém i tu

http://php.vrana.cz/atomicita-operaci.php
je tam jakési řešení, myslím že ten člověk docela umí, takže by to mělo být funkční

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: