Geçenlerde bir web sitesi için döviz kurlarını çekmem gerekti. Sağdan soldan aranmak yerine oturup kendim bir php sınıf yazdım. Yazdığım php sınıfı çok basit bir şekilde çalışmaktadır. Kendi cache özelliği mevcut yani doviz bilgilerini bu betik sizin belirttiğiniz dakika içinde yeniden çeker. Böylece oluşabilecek ( tcmb sitesine erişememe gibi ) sorunları da ortadan kaldırmış bulunmaktayım.

Ufak bir hatırlatma yapmam gerekiyor. Kendi makinemdeki denemelerimde doviz.xml adlı cache dosyamızı betik kendisi oluşturmakta. Ama bu değil ki her sunucu da kendisi oluşturacaktır. Eğer oluşturamazsanız kendiniz el ile doviz.xml dosyasını oluşturup betik ile aynı dizine atın ve Chmod ( Yazma İzinleri ) ayarlarını 777 olarak ayarlayınız…

Dosyamız aşağıdadır…

< ?php
 
/*
 
 
 
TCMB Döviz Kurları.
 
Author: Yusuf KOÇ ( Raiden ) < yusufkoc [at] ayva.net >
 
 
 
Bu Betik TCMB Sitesi Baz Alınarak Kodlanmıştır.
 
 
 
Kullanım:
 
 
 
< ?php
 
$doviz = new TCMB();
 
$doviz->cacheTime = 5;
 
$doviz->tcmbStart();
 
$doviz->getALIS('usd');
 
echo '<br />';
 
$doviz->getSATIS('usd');
 
?>
 
 
 
Diğer Döviz Kur Bilgileri İse Aşağıdadır.
 
 
 
* USD  1 ABD DOLARI                 
 
* AUD  1 AVUSTRALYA DOLARI              
 
* DKK  1 DANİMARKA KRONU               
 
* EUR  1 EURO                          
 
* GBP  1 İNGİLİZ STERLİNİ             
 
* CHF  1 İSVİÇRE FRANGI                 
 
* SEK  1 İSVEÇ KRONU                   
 
* CAD  1 KANADA DOLARI                 
 
* KWD  1 KUVEYT DİNARI                
 
* NOK  1 NORVEÇ KRONU                  
 
* SAR  1 SUUD� ARABİSTAN RİYALİ       
 
* JPY  100 JAPON YENİ
 
 
 
Yukarıdaki Bilgiler Doğrultusunda EURO yu Çekmek İstersek Aşağıdaki Şekilde Yazmamız Gerekir.
 
 
 
$doviz->getALIS('eur'); 
 
 
 
 
 
*/
 
 
 
class TCMB
 
{
 
	# Class İçin Gerekli Değişkenlerimizi Oluşturduk
 
	# ---------------------------------------------------
 
	private $adres = 'http://www.tcmb.gov.tr/kurlar/today.html';
 
	private $sonuc = array();
 
	private $cacheDosya = 'doviz.xml';
 
	public  $cacheTime;
 
	private $cacheCalc;
 
	private $ac;
 
	private $say;
 
	private $dizin = '/home/yusuf/www/';
 
 
 
	# Kur Bilgilerini Çekip Cache Dosyasımıza XML Formatında Yazdıracağız.
 
	# ------------------------------------------------------------------------
 
	private function getKUR()
 
	{
 
		return file_get_contents($this->adres);
 
	}
 
 
 
	# Çekilen Bilgiler İçinde Sadece Bizim Regex Pattern imize Uyan Bölümleri Parseledik
 
	# Yani bu Pattern'e göre 1,123456789 gibi olan bilgiler gelcek. Daha Sonra Bunları da 
 
	# Yeniden Düzenleyeceğiz.
 
	# ---------------------------------------------------------------------------------------
 
	private function parseKUR() 
 
	{
 
		preg_match_all("#[0-9]\\.[0-9]{1,9}#is",$this->getKUR(),$this->sonuc);
 
		return $this->sonuc;
 
	}
 
 
 
	# Parselediğimiz Bilgilerden Sadece Almak İstediğimiz Kısımları Alıp Cache Dosyamıza 
 
	# Yazdıracağız. Böylece TCMB nin sitesine Ulaşılamadığı Durumlarda cache Dosyamızdan 
 
	# Okuyacaktır.
 
	# ---------------------------------------------------------------------------------------
 
	private function cacheDOSYA()
 
	{
 
		$this->sonuc = $this->parseKUR();
 
 
 
		$this->cacheCalc = (time() + ($this->cacheTime*60)); // cache zamanımızı ayarladık.
 
 
 
		$this->ac = fopen($this->dizin."/".$this->cacheDosya,"w");
 
 
 
		if ($this->ac !== false)
 
		{
 
 
 
			fwrite($this->ac,"< ?xml version='1.0' encoding='ISO-8859-9'?>\r\n<tcmb>\r\n<time>".$this->cacheCalc."</time>\r\n");
 
 
 
			$this->say = count($this->sonuc[0]);
 
 
 
			for ($i=$j=0; $i< $this->say; $i += 4)
 
			{
 
				$j++;
 
				switch ($j) 
 
				{
 
                            case "1": fwrite($this->ac,"<usd>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</usd>\r\n"); break;
 
                            case "2": fwrite($this->ac,"<aud>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</aud>\r\n"); break;
 
                            case "3": fwrite($this->ac,"<dkk>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</dkk>\r\n"); break;
 
                            case "4": fwrite($this->ac,"<eur>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</eur>\r\n"); break;
 
                            case "5": fwrite($this->ac,"<gbp>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</gbp>\r\n"); break;
 
                            case "6": fwrite($this->ac,"<chf>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</chf>\r\n"); break;
 
                            case "7": fwrite($this->ac,"<sek>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</sek>\r\n"); break;
 
                            case "8": fwrite($this->ac,"<cad>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</cad>\r\n"); break;
 
                            case "9": fwrite($this->ac,"<kwd>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</kwd>\r\n"); break;
 
                            case "10": fwrite($this->ac,"<nok>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</nok>\r\n");break;
 
                            case "11": fwrite($this->ac,"<sar>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</sar>\r\n"); break;
 
                            case "12": fwrite($this->ac,"<jpy>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</jpy>\r\n"); break;
 
				}
 
 
 
				if ($j == 12 ) break; // Döngüyü Durdurduk Çünkü Bize Gerekli Olan Bilgiler 12. de Son Buluyor.
 
			}
 
 
 
			fwrite($this->ac,"</tcmb>");
 
            fclose($this->ac);
 
		}
 
		else
 
		{
 
			exit('Cache Dosyasına Yazılamıyor. Yazma Yetkisinin Olup Olmadığını Kontrol Ediniz.');
 
		}
 
	}
 
 
 
	# Oluşturduğumuz XML Dosyasındaki Beyaz Karakterleri Silmek İçin Gerekli Fonksiyon
 
	# -----------------------------------------------------------------------------------
 
	private function beyazCharsil()
 
	{
 
		return @preg_replace("/\s/","",file_get_contents($this->cacheDosya));
 
	}
 
 
 
	# XML Dosyasına Yazdırdığımız Bilgilerden Döviz Cinslerinin ALIŞ Fiyatını Çekeceğiz.
 
	# --------------------------------------------------------------------------------------
 
	public function getALIS($tip)
 
	{
 
        preg_match("#< ".$tip."><alis>(.*?)< \\/alis>.+< \\/".$tip.">#i",$this->beyazCharsil(),$this->sonuc);
 
        echo $this->sonuc[1];		
 
	}
 
 
 
	# XML Dosyasına Yazdırdığımız Bilgilerden Döviz Cinslerinin SATIŞ Fiyatını Çekeceğiz.
 
	# --------------------------------------------------------------------------------------
 
    public function getSATIS($tip)
 
    {
 
        preg_match("#< ".$tip.">.+<satis>(.*?)< \\/satis>< \\/".$tip.">#i",$this->beyazCharsil(),$this->sonuc);
 
        echo $this->sonuc[1];
 
    }    	
 
 
 
    # Artık Tüm Sınıfımızı Tetikleyecek Start Fonksiyonumuzu Yazıyoruz
 
    # ---------------------------------------------------------------------
 
    public function tcmbStart()
 
    {
 
    	preg_match("#<time>(.*?)< \\/time>#i",$this->beyazCharsil(),$this->sonuc); // Cache Dosyamızdan Cache Zamanını Aldık.
 
 
 
    	if ($this->sonuc[1]  < time())
 
    	{
 
    		$this->cacheDOSYA();
 
    	}
 
    	else 
 
    	{
 
    		echo 'Döviz Bilgileri Cache\'den Okunuyor...<br />';
 
    	}
 
    }
 
}
 
 
 
?>
</time></satis></alis>

Kullanmak için örnek bir a.php içeriği aşağıdadır.

< ?php
include ('doviz.php');
$tcmb = new TCMB;
$tcmb->cacheTime=5;  // Kaç dakikada bir yeni bilgileri çeksin
$tcmb->tcmbStart(); // Kur bilgileri Çekilip doviz.xml e yazdırıldır.
?>
< !DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="content-type">
  <title></title>
</meta></head>
<body>
<table style="text-align: left; width: 302px; height: 85px;"
 border="1" cellpadding="2" cellspacing="2">
  <tbody>
    <tr>
      <td></td>
      <td>ALIŞ</td>
      <td>SATIŞ</td>
    </tr>
    <tr>
      <td>USD</td>
      <td>< ?php $tcmb->getALIS('usd'); ?></td>
      <td>< ?php $tcmb->getSATIS('usd'); ?></td>
    </tr>
    <tr>
      <td>EURO</td>
      <td>< ?php $tcmb->getALIS('eur'); ?></td>
      <td>< ?php $tcmb->getSATIS('eur'); ?></td>
    </tr>
  </tbody>
</table>
<br />
</body>
</html>

Gibi Kullanabilirsiniz…

Örneği buradan indirebilirsiniz