19 Jun

PHP ile Sayfa Yenilenmesini Algılama

Aslında garip bir yöntem, çokca ihtiyaç duyulabilecek birşey değil diye tahmin ediyorum.
Ama işte, yeri gelince ihtiyaç da olabiliyor.

Aşağıda vereceğim yöntem tek başına sağlıklı bir kontrol-ölçme biçimi değil. Eğer sayfa yenilemesinin algılanması çok önemli ise, mutlaka ekstra yöntemler de gelişitirilmeli.

1
echo '<pre>',print_r($_SERVER,true);

Bu kod ile, PHP tarafından oluşturulan, sunucuya ve ortama dair bazı bilgileri tutan, $_SERVER dizesindeki verileri ekrana yazdırıyoruz. Bunu yapmamızın sebebi, sayfaya direkt olarak girilmesi ile sayfa yenilendiği zaman ortaya çıkan farklılığı orataya koyabilmek. Bu kodun bendeki çıktısı aşağıdaki gibi :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Array
(
    [HTTP_HOST] => localhost
    [HTTP_USER_AGENT] => Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3 FirePHP/0.4
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    [HTTP_ACCEPT_LANGUAGE] => en-us,en;q=0.5
    [HTTP_ACCEPT_ENCODING] => gzip,deflate
    [HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.7
    [HTTP_KEEP_ALIVE] => 115
    [HTTP_CONNECTION] => keep-alive
    [PATH] => /usr/local/bin:/usr/bin:/bin
    [SERVER_SIGNATURE] =>
Apache/2.2.14 (Ubuntu) Server at localhost Port 80


    [SERVER_SOFTWARE] => Apache/2.2.14 (Ubuntu)
    [SERVER_NAME] => localhost
    [SERVER_ADDR] => 127.0.0.1
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => 127.0.0.1
    [DOCUMENT_ROOT] => /var/www
    [SERVER_ADMIN] => webmaster@localhost
    [SCRIPT_FILENAME] => /var/www/i.php
    [REMOTE_PORT] => 50699
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => GET
    [QUERY_STRING] =>
    [REQUEST_URI] => /i.php
    [SCRIPT_NAME] => /i.php
    [PHP_SELF] => /i.php
    [REQUEST_TIME] => 1276953783
)

Bu kodu denerken, sayfayı yenilediğinizde ek olarak şu çıktıyı görürsünüz :

1
 [HTTP_CACHE_CONTROL] => max-age=0

Bu farklılığın sebebi, tarayıcının ikinci isteği yaptığında, karşılığında önbellekten gelen bilgileri değil, sayfayı asıl kaynaktan direkt olarak almak istediğini belirtmesidir.

İşte bizde bu değişkeni takip ederek, sayfanın yenilendiğinin ya da sayfaya direkt olarak erişildiğini anlamaya çalışıyoruz :

1
2
3
if(!empty($_SERVER['HTTP_CACHE_CONTROL'])) {
  echo 'sayfa yenilendi';
}

Bu kontrol ile, sadece işi kuralına göre yapan tarayıcılar ile başarı oranımız yüksek olur. Ama bot dediğimiz siteleri gezen programcıklar için farklı yöntemler de gerekli.