2013-02-15 167 views
0

背景:PHP Memcached擴展OOP實例

我在我的活服務器上安裝了PHP Memcached擴展。 儘管多方努力,我似乎​​無法到我的XAMPP發展框內安裝Memcached的,所以我依靠下面的代碼就可以只實例Memcached的只有Live服務器上:

連接包含在文件每一頁:

// MySQL connection here 

// Memcached 
if($_SERVER['HTTP_HOST'] != 'test.mytestserver') { 
    $memcache = new Memcached(); 
    $memcache->addServer('localhost', 11211); 
} 

在我實例化每種方法的那一刻,我不禁想,有一個更好的方式來acheive我的目標,並想知道如果任何人有任何想法?

文件:

class instrument_info { 


    // Mysqli connection 
    function __construct($link) { 
     $this->link = $link;  
    } 

function execute_query($query, $server) { 

    $memcache = new Memcached(); 
    $memcache->addServer('localhost', 11211); 

    $result = mysqli_query($this->link, $query) or die(mysqli_error($link)); 
    $row = mysqli_fetch_array($result); 

    if($server == 'live') 
    $memcache->set($key, $row, 86400); 

} // Close function 


function check_something() { 

    $memcache = new Memcached(); 
    $memcache->addServer('localhost', 11211); 

    $query = "SELECT something from somewhere"; 

    if($_SERVER['HTTP_HOST'] != 'test.mytestserver') { // Live server 

     $key = md5($query); 
     $get_result = $memcache->get($key); 

     if($get_result) {  
      $row = $memcache->get($key);  
     } else { 
      $this->execute_query($query, 'live');   
     } 

    } else { // Test Server 
     $this->execute_query($query, 'prod'); 
    } 

} // Close function 

} // Close Class 

回答

0

我建議您在基於接口的編程和依賴注入閱讀起來。以下是一些示例代碼,可以讓您瞭解應該如何去做。

interface CacheInterface { 
    function set($name, $val, $ttl); 
    function get($name); 
} 

class MemCacheImpl implements CacheInterface { 
    /* todo: implement interface */ 
} 

class OtherCacheImpl implements CacheInterface { 
/* todo: implement interface */ 
} 

class InstrumentInfo { 
    private $cache; 
    private $link; 

    function __construct($link, $cache) { 
    $this->link = $link; 
    $this->cache = $cache; 
    } 

    function someFunc() { 
    $content = $this->cache->get('some-id'); 
    if(!$content) { 
     // collect content somehow 
     $this->cache->set('some-id', $content, 3600); 
    } 
    return $content 
    } 
} 

define('IS_PRODUCTION_ENV', $_SERVER['HTTP_HOST'] == 'www.my-real-website.com'); 

if(IS_PRODUCTION_ENV) { 
    $cache = new MemCacheImpl(); 
} else { 
    $cache = new OtherCacheImpl(); 
} 

$instrumentInfo = new InstrumentInfo($link, $cache); 

BTW。當涉及到mysqli_query時,你實際上遇到了同樣的問題,你的代碼依賴於Mysql數據庫和mysqli擴展。所有對mysqli_query的調用也應該移出到它自己的類中,代表數據庫層。

+0

感謝您的代碼,並在正確的方向「推」。我瞭解這種面向對象方法的必要性,一旦我開始瞭解它,我將以這種方式開始編碼。 – monkey64 2013-02-16 07:33:46