0

背景:

我已经在我的实时服务器上安装了 PHP Memcached 扩展。尽管付出了很多努力,但我似乎无法在我的 XAMPP 开发框中安装 Memcached,因此我依靠以下代码仅在 Live 服务器上实例化 Memcached:

我的连接文件包含在每个页面中:

// MySQL connection here

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

目前我正在实例化每种方法,我不禁想到有更好的方法来实现我的目标并想知道是否有人有任何想法?

我的班级文件:

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
4

1 回答 1

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);

顺便提一句。当涉及到 mysqli_query 时,您实际上有同样的问题,您使您的代码依赖于 Mysql 数据库和 mysqli 扩展。所有对 mysqli_query 的调用也应该移到它自己的类中,代表数据库层。

于 2013-02-15T09:32:28.477 回答