Cgi Aracılığı ile Formmail ve Sayaç Hazırlama


Bu bölümde örnek bir dosya grubu ile hatasız bir şekilde çalışır sayaç ve formmail hazırlama amacı güdülmüştür. Bu nedenle swf dosyasının hazırlanmasından bahsedilmeyecektir. Özellikle sayaç hazırlamak tamamen profesyonel işdir ki bu konu bizim amacımızı aşmaktadır.

Konulara geçmeden önce bu işlemin son derece hassas bir işlem olduğunu bu nedenle anlatılan uygulamalarda yapılacak en küçük bir hatanın çalışmayan bir sayaç veya mail olarak size döneceğini unutmayın. Lütfen açıklamaları uygularken son derece dikkatli olun.

FLASH İLE SAYAÇ HAZIRLAYALIM

Örnek çalışmayı anasayfada görebilirsiniz.

Kendi sayfamda da kullandığım bu tür bir çalışma için elinizde 5 dosya bulunmalıdır.
1- Swf dosyası
2- Cgi dosyası
3- Log dosyası
4- Swf dosyasını içinde barındıran HTML dosyası
5- Fla dosyası

Cgi dosyası :

Kodlar aşağıdadır. Bu kodların tamamını kopyalayıp bir txt dosyası açarak yapıştırın. Kaydettikten sonra dosya adını shcounter.cgi olarak değiştirin. Burada hiçbir alanda değişiklik yapmanıza gerek yoktur. Şu anda 1. dosyanız hazırlanmış oldu.


 

#!/usr/bin/perl
# change the above line according to your perl script location on your web server

#######################################################
# Seungho Choo http://tangible.new21.org
# GNU public license
#######################################################

# setting #################################################

$log_file = "./shcounter.log"; #the absolute path of log_file (chmod 766)
$log_file_cookie = 'shfcount'; #name unique one
$expire_cookie = 90;
$use_lock = 1; #(1 if use file lock else 0)

# no need to change below this line##################################
if (!$ARGV[0]) {
if($ENV{'REQUEST_METHOD'} eq 'GET') {
$ARGV[0] = $ENV{'QUERY_STRING'};
} else {
read(STDIN, $ARGV[0], $ENV{'CONTENT_LENGTH'});
}
}

if ($ARGV[0]) {
%FORM;
&get_arg;
if ($FORM{'loaded'} eq 'true') {
&read_only; #the count will not be changed if once loaded in flash movie.
}
}else{
&read_write; #add count number and send the count data to flash movie.

}
exit(0);

sub read_only() {
open(FILE, "<$log_file");
$hit = <FILE>;
($hit_total,$hit_bugun,$hit_dun,$lastday) = split(/:/, $hit);
close(FILE);
print "Content-type: text/plain\n\n";
print "&total=$hit_total&bugun=$hit_bugun&dun=$hit_dun";
print "&eof=true&";
}

sub read_write(){
open(FILE, "+<$log_file");
if ($use_lock) {flock(FILE, 2);}
seek(FILE, 0, 0);
$hit = <FILE>;
($hit_total,$hit_bugun,$hit_dun,$lastday) = split(/:/, $hit);
$hit_total++;
$hit_bugun++;
$hit_siz = &get_cookie + 1;

#####The year, month, day of yesterday and today;
($sec, $min, $hour, $day, $mon, $year) = localtime(time);
$mon++;
$year += 1900;
$bugun = "$year-$mon-$day\n";

($sec, $min, $hour, $day, $mon, $year) = localtime(time-24*60*60);
$mon++;
$year += 1900;
$dun = "$year-$mon-$day\n";

##### check if the date has changed ( dun and bugun)
# following lines will be executed at the first access on the day
if ($bugun ne $lastday) {
if ($dun ne $lastday) {
$hit_dun = 0; #for the first day of counting
} else {
$hit_dun = $hit_bugun;
}
$hit_bugun = 1;
$lastday = $bugun;
}
seek(FILE, 0, 0);
print FILE "$hit_total:$hit_bugun:$hit_dun:$lastday\n";
if ($use_lock) { flock(FILE, 8);}
close(FILE);

#####print HTTP header
print "Content-type: text/plain\n";
&format_cookiedate;
print "Set-Cookie: $log_file_cookie=$hit_siz; expires=$cookiedate; \n";
print "\n";
#####print count data
print "&total=$hit_total&bugun=$hit_bugun&dun=$hit_dun&siz=$hit_siz"; # send data
print "&eof=true&"; #the end of data

}

#formate cookie date
sub format_cookiedate {
($sec, $min, $hour, $day, $mon, $year, $dow ) = localtime(time + $expire_cookie*60*60*24);
(@month) = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
(@week) = qw(Sun Mon Tue Wed Thu Fri Sat);
$cookiedate = sprintf("%s, %d-%s-%04d %02d:%02d:%02d GMT", $week[$dow],$day,$month[$mon+1],$year+1900,$hour,$min,$sec);
}

# get cookie
sub get_cookie {
@pairs = split(/; /, $ENV{'HTTP_COOKIE'});
foreach $pair (@pairs) {
($key, $value) = split(/=/, $pair);
if ($key eq $log_file_cookie) {
return $value;
}
}
return '';
}

#parse argument
sub get_arg {
@pairs = split(/&/, $ARGV[0]);
foreach $pair (@pairs) {
($key, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;
$FORM{$key} = $value;
}
}


Log dosyası :

Yine bir txt dosyası açın ve alttaki rakamları kopyalayıp yapıştırın. Dosya adını shcounter.log olarak değiştirin. 2. dosyanızda hazırdır.

4547:52:64:2002-8-16
-24

Yukardaki kodları açıklayalım. 4547 rakamı total ziyaretçi sayısını, 52 bugun, 64 dün ziyaret edenlerin sayısını ifade eder.Diğer kısımlar tarih ile ilgilidir. Otomatik ayarlanır. İsterseniz tarih kısmını elle düzeltebilirsiniz.Total,dün ve bugün kısımlarını da düzenleme şansınız vardır. Server`a gönderildikten sonra işlemler verilen rakamlardan itibaren başlatılır.

Swf ve Fla dosyası :

Alttaki linkten fla dosyasını indirin.

Fla dosyasını indirin

Burada değişiklik yapacağınız tek alan vardır. Fla dosyasını açın, sahnedeki klibi tek tıklama ile seçip actionscript panelini açın. Orada göreceğiniz (6.dizinde): "/cgi-bin/shcounter.cgi" alanına kendi server`ınızın adresini yazın. En fazla hata burada yapılmaktadır. /cgi-bin kısmı cgi ve log dosyalarını server da bulunacağı alanı göstermektedir.Dizini tam bilmiyorsanız firmanızın web sayfasından araştırınız. " " işaretlerini silmemeye ve dizin sonundaki cgi dosyasının adını değiştirmemeye dikkat ediniz.Swf dosyasını fla.dan elde edin. Lütfen adını değiştirmeyin. Şayet değiştirmek isterseniz alttaki html alanı için vereceğim kodlardaki ismide düzenlemeniz gerekecektir. 3 ve 4. dosyalarda hazır.

HTML dosyası :

Bu dosya sayacı kullanacağınız html dosyasıdır. Önce siz bir web editörü ile sayacı kullanacağınız alana yerleştirin. Sonra dosyanızı kaydedin. <Object>......</Object> alanını seçip silin ve alttaki kodları kopyalayıp yapıştırın.



<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/ pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
WIDTH=130 HEIGHT=35>
<PARAM NAME=movie VALUE=shcounter.swf?interval=15000&cgilocation=/cgi-bin/shcounter.cgi"">
<PARAM NAME=quality VALUE=high>
<PARAM NAME=bgcolor VALUE=#FFFFFF>
<EMBED src=shcounter.swf?interval=15000&cgilocation=/cgi-bin/shcounter.cgi""
quality=high
bgcolor=#FFFFFF
WIDTH=130 HEIGHT=35
TYPE="application/x-shockwave-flash"
PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">
</EMBED>
</OBJECT>


Bu bölümü aslında yapmak gerekmeyebilir. Fakat olası problemlere karşı dikkatli davranmakta yarar vardır. Şu anda elimizde 5 dosya da hazır. Şimdi bunları server`a gönderme ve orada düzenleme işlerini anlatalım.

Dosyaları server`a gönderme:

Burada dikkatli olun . Cgi ve log dosyasını genelde server`larda bulunan cgi-bin klasörü içine (bu konuda yine firmanıza danışabilirsiniz) ve mutlaka ASCII modunda göndermelisiniz. Sık yapılan ikinci hata burada oluşmaktadır. Diğer dosyaları(swf ve html dosyası) auto modunda istediğiniz alana gönderebilirsiniz.

Server`da yapılacak işlemler:

Yapılan üçüncü hata bu bölümde oluşmaktadır. Chmod ayarlamaları hatalı olursa sayaç çalışmayacaktır.

Log dosyası---> Chmod 766
Cgi dosyası---> Chmod 755 olmalıdır.

Bu işlemler hatasız uygulanmışsa sayaç problemsiz çalışacaktır.

UYARI: Bu dosya sadece unix destekli serverlarda çalışmaktadır

FLASH İLE FORMMAİL HAZIRLAMA-->