RSS

TCMB Döviz Kurları Sınıfı

Şubat 26

Önemli: TCMB Döviz Kurlarını çekmek geliştirdiğimiz yeni Açık Kaynak PHP Kütüphanesine buradan ulaşabilirsiniz.

Uzun zaman önce yazmış olduğum Php ile Döviz Kuru Script’ini, güncelliğini yitirdiğinden ve php.ini’ye eklenen allow_url_fopen parametresi yüzünden file ve file_get_contents fonksiyonları uzak sunuculardaki dosyalara ulaşamadığı için tekrardan yazma ihtiyacı duydum.

Aşağıda sınıfın bulunacağı doviz.php ve kullanım örneklerinin olduğu test.php dosyalarının kaynak kodlarını bulabilirsiniz.

doviz.php dosyasının içeriği

<?

/**
 * TCMB Döviz Kurları Sınıfı.
 * TCMB sunucularındaki Döviz Kurlarını işler.
 * Daha sonraki kullanımlar için sunucu üzerinde cache_dosyası degiskeninde belirtilen isimle yedekler.
 * Günde bir defa yeni kur değerlerini sunucudan çeker.
 *
 * @author Göktuğ ÖZTÜRK goktug.ozturk@gmail.com
 * @www http://www.goktugozturk.com.tr
 */
class doviz {

 private $cache_dosyasi = "doviz_kurlari";
 private $kurlar = array();
 private $aktif_kur = "USD";

 /**
 * Constructor
 *
 * @param bool $CacheEnabled
 * @param int $CacheTime
 * @param string $Encoding
 *
 * @return \doviz
 */
 function __construct( $CacheEnabled = TRUE, $CacheTime = 60, $Encoding = "ISO-8859-9" ) {
 if ( $CacheEnabled ) {
 $CacheSuresi = time() - $CacheTime * 60;
 if ( file_exists($this->cache_dosyasi . ".db") AND is_readable($this->cache_dosyasi . ".db") AND filemtime($this->cache_dosyasi . ".db") > $CacheSuresi ) {
 $FileContent = $this->rFile($this->cache_dosyasi . ".db");
 if ( trim($FileContent) != "" ) {
 $this->kurlar = unserialize(base64_decode($FileContent));
 return;
 }
 }
 }
 $xmlalanlari = array(
 "Isim" => "Isim",
 "ForexBuying" => "Alis",
 "ForexSelling" => "Satis",
 "BanknoteBuying" => "EfektifAlis",
 "BanknoteSelling" => "EfektifSatis",
 );
 $FileContent = $this->rFile("http://www.tcmb.gov.tr/kurlar/today.xml");
 if ( $Encoding != "ISO-8859-9" AND function_exists("iconv") ) {
 $FileContent = iconv("ISO-8859-9", $Encoding, $FileContent);
 }
 preg_match_all('@<Currency Kod="([A-Z]{3})" CurrencyCode="[A-Z]{3}">(.*)<\/Currency>@iU', $FileContent, $Matches, PREG_SET_ORDER);
 foreach ( $Matches as $value ) {
 if ( !in_array($value[1], array( "USD", "EUR", "CAD", "DKK", "SEK", "CHF", "NOK", "JPY", "SAR", "KWD", "AUD", "GBP" )) ) {
 continue;
 }
 preg_match_all('@<([a-z]+)>(.*)<\/\\1>@iU', $value[2], $SubMatches, PREG_SET_ORDER);
 foreach ( $SubMatches as $value2 ) {
 if ( !isset( $xmlalanlari[$value2[1]] ) ) {
 continue;
 }
 $this->kurlar[$value[1]][$xmlalanlari[$value2[1]]] = $value2[2];
 }
 }
 if ( $CacheEnabled ) {
 $this->wFile($this->cache_dosyasi . ".db", base64_encode(serialize($this->kurlar)));
 }
 }

 /**
 * Aktif kuru belirler.
 * Geçerli Kurlar:
 * USD, EUR, CAD, DKK, SEK, CHF, NOK, JPY, SAR, KWD, AUD, GBP
 *
 * @param string $Currency
 *
 * @return string
 */
 function KurBelirle( $Currency ) {
 $Currency = strtoupper($Currency);
 if ( isset( $this->kurlar[$Currency] ) ) {
 $this->aktif_kur = $Currency;
 return TRUE;
 }
 return FALSE;
 }

 /**
 * Aktif Kur için Alış değerini getirir.
 *
 * @param string $Currency
 *
 * @return string
 */
 function AlisGetir( $Currency = NULL ) {
 if ( is_null($Currency) ) {
 $Currency = $this->aktif_kur;
 } else {
 $Currency = strtoupper($Currency);
 }
 return $this->kurlar[$Currency]["Alis"];
 }

 /**
 * Aktif Kur için Satış değerini getirir.
 *
 * @param string $Currency
 *
 * @return string
 */
 function SatisGetir( $Currency = NULL ) {
 if ( is_null($Currency) ) {
 $Currency = $this->aktif_kur;
 } else {
 $Currency = strtoupper($Currency);
 }
 return $this->kurlar[$Currency]["Satis"];
 }

 /**
 * Belirtilen yoldaki dosya içeriğini getirir.
 *
 * @param string $FileName
 *
 * @return string
 */
 function rFile( $FileName ) {
 if ( !preg_match('@^https?:@', $FileName) OR ini_get('allow_url_fopen') == '1' ) {
 if ( function_exists('file_get_contents') ) {
 $Content = file_get_contents($FileName);
 } else {
 if ( !$Handle = fopen($FileName, "r") ) {
 return "Dosya Açılamıyor ($FileName)";
 }
 $Content = fread($Handle, filesize($FileName));
 fclose($Handle);
 }
 } else if ( function_exists('curl_init') ) {
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $FileName);
 curl_setopt($ch, CURLOPT_HEADER, 0);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 $Content = curl_exec($ch);
 curl_close($ch);
 } else {
 return "";
 }
 return $Content;
 }

 /**
 * Verilen içeriği dosyaya yazar.
 *
 * @param string $FileName
 * @param string $Content
 *
 * @return bool
 */
 function wFile( $FileName, $Content ) {
 if ( function_exists('file_put_contents') ) {
 if ( !file_put_contents($FileName, $Content) ) {
 return FALSE;
 }
 } else {
 if ( !$Handle = @fopen($FileName, "w") ) {
 return FALSE;
 }
 if ( @fwrite($Handle, $Content) === FALSE ) {
 return FALSE;
 }
 @fclose($Handle);
 }
 @chmod($FileName, 0644);
 return TRUE;
 }
}

test.php dosyasının içeriği

<?
include( 'doviz.php' );
/**
 * DovizKuru Sınıfı
 * Eğer önbellek dosyası kullanmak istemiyorsanız 1. paremetre olarak false verebilirsiniz.
 * Örnek: $TCMB = new DovizKuru( false );
 * Varsayılan olarak önbellek süresi 60 dakikadır. Bunu değiştirmek için 2. paremetre olarak dakika cinsinden bir değer girebilirsiniz.
 * Örnekler:
 * $TCMB = new doviz( true, 1440 ); // 1 günlük önbellek
 * $TCMB = new doviz( true, 0 ); // Her çağrıldığında yenile
 * $TCMB = new doviz( true, 60, "UTF-8" ); // Türkçe karakterleri UTF-8 kodlamasına göre düzeltir
 */
$TCMB = new doviz( TRUE, 60, "UTF-8" );

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="tr-TR">
<head>
 <title>Test</title>
</head>
<body>
 <table style="border: 1px solid #999; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="4">
 <tbody>
 <tr>
 <td></td>
 <td>ALIŞ</td>
 <td>SATIŞ</td>
 </tr>
 <tr>
 <td>USD</td>
 <td><?= $TCMB->AlisGetir("USD") ?></td>
 <td><?= $TCMB->SatisGetir("USD") ?></td>
 </tr>
 <?
 /**
 * Kur Belirle fonksiyonu ile sayfa içinde kullanacağınız kuru tek seferde belirleyebilirsiniz.
 * Bu sayede daha sonra kullanacağınız AlisGetir() ve SatisGetir() fonksiyonlarında ayrıca kur belirtmeniz gerekmez.
 */
 $TCMB->KurBelirle("EUR");
 ?>
 <tr>
 <td>EURO</td>
 <td><?= $TCMB->AlisGetir() ?></td>
 <td><?= $TCMB->SatisGetir() ?></td>
 </tr>
 </tbody>
 </table>
</body>
</html>

Bu kütüphane yerine TCMB Döviz Kurlarını çekmek geliştirdiğimiz yeni Açık Kaynak PHP Kütüphanesine buradan ulaşabilirsiniz.

İyi günlerde kullanmanız dileğiyle.

 

Posted by on 26 Şubat 2010 in PHP

8 Comments

8 responses to “TCMB Döviz Kurları Sınıfı

  1. fatih t.

    26 Şubat 2011 at 20:17

    merhabalar ben bir türlü yapamadım oldugu gibi dosyaları attım ama calısmadı

     
    • Göktuğ ÖZTÜRK

      27 Şubat 2011 at 19:48

      Tekrardan test ettim fakat sorunsuz olarak çalışıyor.
      test.php dosyasının en üstüne aşağıdaki satırları ekleyerek tekrar dener misiniz. Hata mesajına göre ne yapmanız gerektiğini söyleyebilirim.

      ini_set( “display_errors”, 1 );
      error_reporting( E_ALL ^ E_NOTICE );

       
  2. ferit a.

    25 Mayıs 2011 at 13:18

    merhaba,

    tüm kurları yazdırmaktansa sadece örneğin $TCMB->KurBelirle( “EUR” ); ve AlisGetir()?> ile istediğimiz değeri alamaz mıyız ? Test.php de alttaki tablonun hemen üzerinde tüm data gösteriliyor…

    şimdiden teşekkürler.

     
    • Göktuğ ÖZTÜRK

      12 Haziran 2011 at 21:40

      Kodda fazladan bir satır bırakmışım. Şu anda düzelttim. Dediğiniz şekilde kullanabilirsiniz.

       
  3. Mustafa

    26 Haziran 2014 at 01:56

    Merhaba, Aramam yaparken buldum konuyu ancak bir sorun var gibi geldi. İncelediğimde cache süresi dikkate alınarak okunduğunu ancak dikkate alınmadan dosyaya yazma işleminin yapıldığını gördüm şöyle bir değişklikle yazma işlemide cache süresine göre yapılabiliyor. tabi burda dikkat edilmesi gereken konu cache süresinin ilk çalıştırmada Sıfır yapılamsı gerektiği daha sonra istenilen süreye ayarlanması gerektiği

    if ( $CacheEnabled )
    {

    $simdikisaat=time();
    $dosyasaati=filemtime( $this->cache_dosyasi . “.db” );
    $fark=$simdikisaat-$dosyasaati;
    $cekimzamani=$CacheTime * 60;
    if($fark>$cekimzamani) $this->wFile( $this->cache_dosyasi . “.db”, base64_encode( serialize( $this->kurlar ) ) );
    }
    }

     
    • Göktuğ Öztürk

      30 Haziran 2014 at 18:06

      Teşekkürler. Kodda dediğiniz hata varmış. Cache okuma kodundan sonra “return” eklemeyi unutmuşum. Düzgün çalışan hali yayında.

       
  4. Çağlar CAYVARLI

    01 Aralık 2014 at 05:45

    kodlarla ılgılı sıkıntı var galıba. olmadı

     

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir