[CentOS 7] 安裝 PHP 5.6 Memcached 結合 Codeigniter 2.2

memcached 是一套分散式的快取系統,由 LiveJournal 的 Brad Fitzpatrick 開發,但目前被許多網站使用。這是一套開放原始碼軟體,以 BSD license 授權釋出。

memcached 缺乏認證以及安全管制,這代表應該將 memcached 伺服器放置在防火牆後。

memcached 的API使用三十二位元的循環冗餘校驗(CRC-32)計算鍵值後,將資料分散在不同的機器上。當表格滿了以後,接下來新增的資料會以 LRU 機制替換掉。由於 memcached 通常只是當作快取系統使用,所以使用 memcached 的應用程式在寫回較慢的系統時(像是後端的資料庫)需要額外的程式碼更新 memcached 內的資料。

1. 安裝 Memcached

在 CentOS 7 直接使用 yum 直接安裝

# yum install memcached -y

2. 設定 Memcached

開啟 Memcached 設定檔

# vi /etc/sysconfig/memcached

Memcached 預設埠號 11211, 記憶體為 512M

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="512"
OPTIONS=""

3. 啟動 Memcached 且開機後自動啟動

Memcached 預設埠號 11211, 記憶體為 512M

# systemctl enable memcached
# systemctl start memcached

4. 開啟防火牆埠號

將防火牆 11211 埠號對外開啟

# firewall-cmd --zone=public --add-port=11211/tcp --permanent
# firewall-cmd --reload

5. 安裝 Memcached 的 PHP 模組

安裝相關 PHP 模組, 才可以使用 Memcached 功能

# yum install php56w-pecl-memcache -y

安裝後請重新啟動 memcached 及 httpd

# systemctl restart memcached
# systemctl restart httpd

安裝成功後查看 phpinfo 會出現如下資訊

6. 設定 Codeigniter 2.2

在 /application/config/ 新增一隻檔案 memcached.php, 內容如下:

if (! defined ( 'BASEPATH' )) exit ( 'No direct script access allowed' );

$config['memcached'] = array(
	'hostname' => '127.0.0.1',	//主機位置
	'port' => 11211,			//主機埠號
	'weight' => 1
);

修改 /system/libraries/Cache/drivers/Cache_memcached.php

原始如下:

$this->_memcached = new Memcached();

調整如下:

if (class_exists("Memcached")) {
  $this->_memcached = new Memcached();
} else {
  $this->_memcached = new Memcache();
}

因此檔案宣告變數是錯誤故而調整

原始如下:

foreach ($this->_memcache_conf as $name => $cache_server)
{
	if ( ! array_key_exists('hostname', $cache_server))
	{
		$cache_server['hostname'] = $this->_default_options['default_host'];
	}

	if ( ! array_key_exists('port', $cache_server))
	{
		$cache_server['port'] = $this->_default_options['default_port'];
	}

	if ( ! array_key_exists('weight', $cache_server))
	{
		$cache_server['weight'] = $this->_default_options['default_weight'];
	}

	$this->_memcached->addServer(
			$cache_server['hostname'], $cache_server['port'], $cache_server['weight']
	);
}

調整如下:

foreach ($this->_memcache_conf as $name => $cache_server)
{
	if ( ! array_key_exists('hostname', $cache_server))
	{
		$cache_server['hostname'] = $this->_memcache_conf['default_host'];
	}

	if ( ! array_key_exists('port', $cache_server))
	{
		$cache_server['port'] = $this->_memcache_conf['default_port'];
	}

	if ( ! array_key_exists('weight', $cache_server))
	{
		$cache_server['weight'] = $this->_memcache_conf['default_weight'];
	}

	$this->_memcached->addServer(
			$cache_server['hostname'], $cache_server['port'], $cache_server['weight']
	);
}

原始如下:

if ( ! extension_loaded('memcached'))

調整如下:

if (!extension_loaded('memcached') && !extension_loaded('memcache'))

7. 使用範例

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Test_model extends MY_Model {
	public function __construct(){
		parent::__construct();
		$this->from = 'test';
		$this->id = 'test_id';
		$this->listSelect = 'test_id, test_name';
		$this->rowSelect = '*';
		$this->abrv = 'test_';
		$this->orderBy = 'created_date';
	}

	public function getList($queryData=array()) {
        $this->load->driver('cache');
        $result = $this->cache->memcached->get('key');				//key
        if (!$result) {
			$this->db->select($this->listSelect)
					 ->from($this->from)
					 ->where($this->abrv.$this->is_del, 0)
					 ->order_by($this->abrv.$this->orderBy, $this->orderType);

			if( isset($queryData['keyword']) && $queryData['keyword'] ){
				$this->db->where("( `test_name` LIKE '%" . $queryData['keyword'] . "%')", NULL, FALSE);
			}

			$result = $this->db->get();
			$result = $result->result_array();
			$this->cache->memcached->save('key', $result, 60);		//key, value, time(s)
		}
		return $result;
	}
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *