[php] otwieranie plików

0

Mam pewien ciekawy problem. Napisałem sobie mały skrypt do zliczania unikalnych odwiedzających w ciągu 24h. Skrypt jest raczej niezbyt rozbudowany i opiera się od 2 funkcje.

<?
function print_licznik()
{
	$pl=fopen("l.cnf",r);
	if($pl==null) return;
	$licznik=fgets($pl,255);
	fclose($pl);
	echo "<center>";
	echo "\n odwiedziło nas już:<br>";
	echo $licznik;
	echo "</center>";
}

function set_licznik()
{
	if(isset($_COOKIE['byl'])) return;
	else
	{
		setcookie(byl,"1",time()+(24*3600));
		$pl=fopen("l.cnf","r");
		$ile=(int)fgets($pl,255);
		flock($pl,3);
		fclose($pl);
		$ile+=1;
		$pl2=fopen("l.cnf","w");
		flock($pl2,2);
		fputs($pl2,$ile);
		flock($pl2,3);
		fclose($pl2);
	}
}
?>

Problem jest w funkcji set_licznik(). Plik do zapisu nie jest otwarty. Plik ten ma atrybuty 755, więc powinno działać. Czy to jest coś nie tak ze skryptem, czy mam szukać co jest nie tak z konfiguracją http?

0

ustaw <s>777</s> 666. poza tym imho za duzo kodu, lepiej uzyc file_get_contents i file_put_contents, nie wiem tylko jak u niego z flockiem. poza tym nie musisz wywolywac flock(..., LOCK_UN) przed fclose

0

setcookie(byl,"1",time()+(24*3600));

"byl" to jest stala definiowana?
lub szybciej to mi pasuje:
setcookie("byl","1",time()+(24*3600));

0

bordeux: masz rację rzeczywiście powinno być w cudzysłowie. Drobna pomyłka

Tomkiewicz: jakoś czuję się pewniej otwierając i zamykając pliki samodzielnie. flock() przed zamknięciem został użyty tylko dlatego, że sprawdzałem, czy to nie tam jest jakiś problem :). Ustawienie chmod 777 rzeczywiście wszystko zmienia.

A ogólnie, to troszkę źle określiłem ten skrypt. W sumie, to on nie zlicza przez 24h unikalnych odwiedzin. Jeśli ktoś odwiedzi serwis o 22:00 i o 08:00, to zostanie policzony tylko raz, a powinien 2x. Muszę po prostu inaczej ustawiać cookies. Czas ważności musi być coraz krótszy im bliżej jest do północy.

0
<?php
function polnoc() /* odmierza ile sekund od danej chwili jest do konca dnia*/
{
   $teraz = date("H:i:s");
   $czas = explode(":", $teraz);
   $godziny = 23-$czas[0];
   $minuty  = 59-$czas[1];
   $sekundy = 59-$czas[2];
   $waznosc = $godziny*3600 + $minuty*60 + $sekundy;
return $waznosc;// thx tomkiewicz
   }

setcookie("licznik", "zliczono", time()+polnoc()+1 );

Ehh po co 2 razy pisac funcje liczącą do konca dnia, jesli juz jest na http://4programmers.net/PHP/Licznik_odwiedzin_w_PHP

0

return $waznosc; zjadłeś :P

0

płacą ci od linijki ?

<?php
function polnoc(){
  return strtotime('tomorrow midnight') - time();
}
?>

lub tomorrow 000, lub jeśli byś chciał co do sekundy dostać ten sam wynik to today 2359
mów co chcesz ale skrypt się wykonuje dłużej niż nawet dość rozbudowana ale "wbudowana" funkcja

// jak się przyjrzeć to potem jest:

setcookie("licznik", "zliczono", time()+polnoc()+1 );

czyli z powrotem dodanie time() który był odjęty i dodanie tej brakującej w poprzedniej metodzie jedynki (bo liczyło do 23:59,59 a nie do północy), jaki z tego morał ? że w ogóle nie potrzeba tworzyć nowej funkcji i cały kod to:

setcookie('licznik', 'zliczono', strtotime('tomorrow midnight'));
0

Czyli wychodzi na to, że cała zmiana jest niewielka :). Dzięki Adamo. Teraz jeszcze muszę upakować to w klasę, bo jakoś będę czuł się pewniej :).

bordeux: wiem, że to tam jest. Tyle tylko, że licznik odwiedzin, to na tyle mało wymagające zadanie programistyczne, że skoro mam więcej wolnego czasu niż mi potrzeba, to powinienem sam je wykonać. Funkcje użyte przez Adamo nie były mi dotąd znane, więc teraz jestem rzeczywiście do przodu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1