Merhaba arkadaşlar,
Üye, A serverında oturum açınca aynı oturumun B serverında da güvenli bir şekilde oluşturulmasını sağlamak istiyorum.
Çoklu serverlarda oturum yönetimi konusunda deneyimli olan arkadaşlar yardımcı olurlarsa sevinirim.
Teşekkür ederim
1'den fazla serverda oturum yönetimi
7
●769
- 09-11-2009, 13:46:11Üyeliği durduruldusession_set_save_handler() ile sessionun kaydedileceği serveri belirleyebiliyorsunuz
- 09-11-2009, 15:37:13session_set_save_handler() fonksiyonunun işime nasıl yarayacağını bulamadım halen.Bulduğum kaynaklarda sessionu veritabanında tutma yönünde çalışmalar var.
mynet vb farklı serverlarda çalışan subdomainlerde oturumun oluşturulmasını sağlayan yönteme ihtiyacım var.Yukarıdaki fonksiyonla ya da diğer yöntemlerle ilgili fikirlere ihtiyacım var arkadaşlar.
Denediğim yöntemlerden arasında giris.php dosyasından diğer sunucularda bulunan bir oturum.php dosyasına parametre göndererek aynı session_id de oturum açmak ve içine uye_id değişkenini atma yöntemi var.Ama bu iş için daha iyi çözümler olduğuna eminim.
Tecrübeniz olmasa bile fikirlerinize de ihtiyacım var arkadaşlar.
Teşekkür ederim - 09-11-2009, 15:59:09Üyeliği durdurulduDaha önce yazmış oldugum bir veritabanı session sınıfı var;
/* Session tablosu şeması ------------------------------- CREATE TABLE IF NOT EXISTS `session` ( `id` int(6) NOT NULL AUTO_INCREMENT, `ad` varchar(255) NOT NULL, `veri` varchar(255) NOT NULL, `bitis` varchar(30) NOT NULL, `hash` varchar(50) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `ad` (`ad`) ) ENGINE=MEMORY DEFAULT CHARSET=latin5 AUTO_INCREMENT=1; */ class DB_Session { /** * Kaydedilecek sessionların ömrü (süresi) * * @access public * @var int */ public static $_session_bitis = NULL; /** * Session tablosu adı * * @access public * @var string */ private $_session_tablo = 'session'; /** * Session güvenlik hashi * * @access private * @var string */ private $_session_hash = NULL; /** * Session encrypt güvenlik şifresi * * @access private * @var string */ private $_session_sifre = FALSE; // }}} // {{{ Konstrüktör /** * Konstrüktör * * @access public * @param mixed $_session_bitis session bitis süresi * @param mixed $_session_sifre session encrypt sifresi (opsiyonel) * @return void */ function __construct($_session_bitis = NULL, $_session_sifre = NULL) { if ($session_bitis == NULL) { $this->_session_bitis = (60 * 5) + time(); // 5 dakika } if ($_session_sifre != NULL) { $this->_session_sifre = $_session_sifre; } $this->_session_bitis = $_session_bitis + time(); $this->_session_hash = $this->_sessionHash(); DB_Session::_tumsessionExtract(); } // }}} // {{{ set() /** * Girilen session adı ve verisi ile yeni bir oturum başlatır, * Bu oturum verilerini _write() fonksiyonu ile veritabanına kaydeder. * * @access public * @param mixed $session_ad session adi * @param mixed $session_veri session içeriği * @param int $session_bitis session süresi * @return void / boolean */ public function set($session_ad, $session_veri) { // Kontrollü session yazma işlemi //if ($this->_sessionKontrol($session_ad) == FALSE) { if ($this->_session_sifre <> NULL) { $session_veri = $this->_session_encrypt($session_veri, $this->_session_sifre); } if (!$this->_write($session_ad, $session_veri)) { return FALSE; } //} return TRUE; } // }}} // {{{ get() /** * Session çağırma fonksiyonu, veriye göre sonuç döndürür. (true / false) * * @access public * @param mixed $session_adi Çağrılacak Session adı * @return mixed */ public function get($session_adi, $alan = NULL) { // ------------------------- // Session Hash Extra Güvenlik if ($this->_session_hash == NULL) { $this->_session_hash = md5(rand(99, 999999) . "_realporn"); } // ------------------------- if ($this->_session_hash == $this->_session_[$session_adi]['hash']) { if ($this->_session_sifre <> NULL) { if ($alan <> NULL) { $session_cikti = $this->_session_[$session_adi]["{$alan}"]; } else { $session_cikti = $this->_session_decrypt($this->_session_[$session_adi]['veri'], $this->_session_sifre); } } else { if ($alan <> NULL) { $session_cikti = $this->_session_[$session_adi]["{$alan}"]; } else { $session_cikti = $this->_session_[$session_adi]['veri']; } } if ($session_cikti) { return $session_cikti; } } return FALSE; } // }}} // {{{ _write() /** * Girilen session adı ve verisini veritabanına kaydeder. * * @access private * @param mixed $session_ad session adi * @param mixed $session_veri session içeriği * @param int $session_bitis session süresi * @return void / boolean */ private function _write($session_ad, $session_veri) { if ($session_ad != NULL && $session_veri != NULL) { if ($this->_session_hash != NULL && $this->_session_bitis != NULL) { // yazma sorgusu $this->_write_sql = @mysql_query( "INSERT INTO `{$this->_session_tablo}` ( `ad`, `veri`, `bitis`, `hash` ) VALUES ( '{$session_ad}', '{$session_veri}', '{$this->_session_bitis}', '{$this->_session_hash}' ) "); if ($this->_write_sql) { return TRUE; } } } return FALSE; } // }}} // {{{ delete() /** * Adı girilen sessionu siler. * * @access private * @param mixed $session_ad session dosya adi * @return void / boolean */ public function delete($session_ad) { $this->_delete_sql = @mysql_query("DELETE FROM `{$this->_session_tablo}` WHERE `ad` = '{$session_ad}' AND `hash` = '{$this->_session_hash}'"); if (!$this->_delete_sql) { return FALSE; } return TRUE; } // }}} // {{{ _session_encrypt() /** * Session verilerini, daha önceden girilmiş key 'e göre şifreler * * @access private * @param mixed $session_veri session veri * @param mixed $session_key session key * @return void / boolean */ private function _session_encrypt($session_veri, $session_key) { for ($i = 1; $i <= strlen($session_veri); $i++) { $session_encrypt_cikti .= chr(ord(substr($session_veri, $i - 1, 1)) + ord(substr($session_key, ($i % strlen($session_key)) - 1, 1))); } return base64_encode($session_encrypt_cikti); } // }}} // {{{ _session_encrypt() /** * Session verileri şifrelenmişse daha önceden girilmiş olan key 'e göre çözer * * @access private * @param mixed $session_veri session veri * @param mixed $session_key session key * @return void / boolean */ private function _session_decrypt($_session_veri, $session_key) { $session_veri = base64_decode($_session_veri); for ($i = 1; $i <= strlen($session_veri); $i++) { $session_decrypt_cikti .= chr(ord(substr($session_veri, $i - 1, 1)) - ord(substr($session_key, ($i % strlen($session_key)) - 1, 1))); } return $session_decrypt_cikti; } // }}} // {{{ _sessionKontrol() /** * session kontrol fonksiyonu * * @access private * @return void */ private function _tumsessionExtract() { $liste_sql = mysql_query("SELECT * FROM {$this->_session_tablo}"); while ($session = $liste_sql->fetchRow()) { // session Süre kontrolü $bitis_kontrol = DB_Session::_bitisKontrol($session['bitis']); if ($bitis_kontrol === TRUE) { // session süresi bittiyse DB_Session::delete($session['ad']); unset($this->_session_[$session['ad']]); } else { $this->_session_[$session['ad']]['veri'] = trim($session['veri']); $this->_session_[$session['ad']]['bitis'] = trim($session['bitis']); $this->_session_[$session['ad']]['hash'] = trim($session['hash']); $this->_session_[$session['ad']]['ad'] = trim($session['ad']); } } } // }}} // {{{ _bitisKontrol() /** * Session suresinin bitip bitmediğini kontrol etme fonksiyonu. * * @access private * @param mixed $session_bitis Session bitiş süresi * @return boolean */ private function _bitisKontrol($session_bitis) { if ($session_bitis < time()) { return TRUE; } return FALSE; } // }}} // {{{ _sessionKontrol() /** * Girilen session adına göre Session varlığını kontrol etme fonksiyonu. * * @access private * @param mixed $session_ad Session adı * @return boolean */ private function _sessionKontrol($session_ad) { $arama_sql = mysql_query("SELECT `id` FROM `{$this->_session_tablo}` WHERE `ad` = '{$session_ad}' AND `hash` = '{$this->_session_hash}'"); if ($arama_sql->numRows() > 0) { return TRUE; } return FALSE; } // }}} // {{{ _sessionHash() /** * Her kullanıcıya ayrı session atamak, çakışma önlemek ve güvenlik için, * veritabanına yazılmak üzere, md5 formatında oturum hash 'ı uretir. * * @access private * @return void */ private function _sessionHash() { return sha1(md5($_SERVER['REMOTE_ADDR'])); } }kullanım;
$session_suresi = '7200'; // 2 saat $session_encrypt_key = 'gizlişifre'; $session = new DB_Session($session_suresi, $session_encrypt_key); // kaydetme $session->set('hede'); // çağırma $session->get('hede'); - 09-11-2009, 19:09:49Veritabanı için güzel sınıf.
session_set_save_handler("localhost:9090") şeklinde parametre aldığını gösteren bir döküman bulamadım.
Ama nasıl kullanacağımı çözdüm sanırım.ftp ya da socket bağlantılı fonksiyonlarımı yazıp bu fonksiyona ekleyeceğim sanırım.Kolları sıvayalım bakalım.
Teşekkürler devturkeli - 11-11-2009, 02:33:51server ların yönetiminin ve scriptin sana ait sende olduğunu farzediyorum.
Bildiğim bir yöntem hemde harddisk performansından tasarruf edersin
memcache kurmak ve session bilgilerini memcache ile tutmak (ram i fazla olan makinede)
kod fazlalığına gerek kalmadan ayar dosyana ekleyeceğin bir kod ile halledebilirsin.
Bunun yanında 1 den fazla makine kullanacağına göre diğer istediğin şeyler(sayfa kodlaması devamlı gözüken imaj dosyaları vb.) ram de aynı anda cache tutabilirsin.
Memcache kurma konusu hariç (aslında basit çok örneği var) ram de cache yapma ve diğer istediğin şeyleri cache te tutma konusunda yardımcı olabilirim. - 11-11-2009, 06:45:25Kimlik doğrulama veya yönetimden onay bekliyor.en iyi yöntemCrash adlı üyeden alıntı: mesajı görüntüle
++
Memcache kullanmak arkadaşın dediği gibi performansınıda arttırcaktır.
Çünkü her açılan session oturum'u için bir adet dosya oluşturulacak ,
yapılan işlemin hızı harddiskin okuma ve yazma hızı kadar olacaktır.
Fakat memecache ile bilgiler ramde tutulacağı için ,session okuma ve oluşturma dahada hızlı olacak ve çoklu sunucularda oturum sorun olmayacaktır.
Daha fazla bilgi için Storing Sessions in Memcache diye aratabilirsin.