Очередь при доступе к файлу на примере счетчика для сайта
Решил написать простенький счетчик для сайта. Он умеет считать клики и хосты, т.е. айпишники компьютеров.
На этом примере я хотел бы показать как с помощью php можно обращаться к файлу не опасаясь конфликтов доступа и данных.
Также можете посмотреть пример работы с изображениями и файлами шрифтов для php.
<?php
if ($_SERVER['HTTP_HOST']===parse_url($_SERVER['HTTP_REFERER'],PHP_URL_HOST)) {
$ip=$_SERVER['REMOTE_ADDR']; //ip пользователя
$file="count.dat";
fclose(fopen($file, "a+b"));
$f=fopen($file, "r+t");
flock($f, LOCK_EX); //блокируем доступ к файлу
//чтение из файла
$count=array();
$count=unserialize(fgets($f));
$today=mktime(0,0,0,date("m"),date("d"),date("Y"));
$count[0][$ip]=$count[0][$ip]+1;
$count[$today][$ip]=$count[$today][$ip]+1;
ftruncate($f,0);
fseek($f,0,SEEK_SET);
//запись в файл
fputs($f,serialize($count));
fclose($f);
//подсчет всех хитов
$hits_today=0; foreach($count[$today] as $array_ip => $array_cnt) {$hits_today=$hits_today+$array_cnt;}//хиты за сегодня
$hosts_today=count($count[$today]);//хосты за сегодня
$hits=0; foreach($count[0] as $array_ip => $array_cnt) {$hits=$hits+$array_cnt;} //все хиты
$hosts=count($count[0]);//хосты общие
//обработка текста, который будет помещен на экран
$pict=ImageCreateFromGif("icon.gif");
$color=imageColorClosest($pict,0,0,0);
$white=imageColorClosest($pict,255,255,255);
imageTtfText($pict,7,0,32,9,$white,"ARLRDBD.TTF","TODAY");
imageTtfText($pict,7,0,2,15,$color,"ARLRDBD.TTF","-hits:");
imageTtfText($pict,7,0,2,23,$color,"ARLRDBD.TTF","-hosts: ");
imageTtfText($pict,7,0,26,32,$white,"ARLRDBD.TTF","GENERAL");
imageTtfText($pict,7,0,2,39,$color,"ARLRDBD.TTF","-hits: ");
imageTtfText($pict,7,0,2,46,$color,"ARLRDBD.TTF","-hosts: ");
//тут идет определение ширины каждого текста
$size=imageTtfBBox(7,0,"ARLRDBD.TTF",$hits_today);
$x=96-($size[2]-$size[0]);
imageTtfText($pict,7,0,$x,15,$color,"ARLRDBD.TTF",$hits_today);
$size=imageTtfBBox(7,0,"ARLRDBD.TTF",$hosts_today);
$x=96-($size[2]-$size[0]);
imageTtfText($pict,7,0,$x,23,$color,"ARLRDBD.TTF",$hosts_today);
$size=imageTtfBBox(7,0,"ARLRDBD.TTF",$hits);
$x=96-($size[2]-$size[0]);
imageTtfText($pict,7,0,$x,39,$color,"ARLRDBD.TTF",$hits);
$size=imageTtfBBox(7,0,"ARLRDBD.TTF",$hosts);
$x=96-($size[2]-$size[0]);
imageTtfText($pict,7,0,$x,46,$color,"ARLRDBD.TTF",$hosts);
Header("Content-type: image/gif");
imageGif($pict);
}
else {
$pict=ImageCreateFromGif("icon.gif");
$color=imageColorAllocate($pict,255,0,0);
imageTtfText($pict,16,0,2,33,$color,"ARLRDBD.TTF","ERROR!!!");
Header("Content-type: image/gif");
imageGif($pict);
imageDestroy($pict);
}
?>