[Window 7]AppServ 安裝 imageMagick

先整理當前 AppServ 環境資料可從 phpinfo 查看

並取得 PHP 版本、Architecture、Thread Safety 三個資訊,

或用 cmd 指令取得三個資訊

// Determine the PHP version:
php -i|find "PHP Version"

// Determine the thread safety
php -i|find "Thread Safety"
// You’ll have enabled for thread safe or disabled for not thread safe

// Determine the architecture
php -i|find "Architecture"
// You’ll have x86 for 32 bits and x64 for 64 bits

在下載 PHP 的 Imagic 擴充包會依照當下環境選擇不同的檔案 https://pecl.php.net/package/imagick

選擇最新的 DLL 版本(如下圖)

參照上述三個資訊選擇版本下載(如下圖)

下載後將其檔案解壓縮

CORE_RL_xxx.dll 等相關檔案放置 AppServ\Apache24\bin 目錄

php_imagick.dll 檔案放置 AppServ\php5\ext 目錄

AppServ\php5\ 開啟 php.ini 增加 extension=php_imagick.dll 配置

再次查看 phpinfo 就會顯示已安裝 imagick

若出現以下圖片狀況
ImageMagick number of supported formats 此欄位的內容資訊 0
ImageMagick supported formats 此欄位的內容資訊 null
需下載相對應的 imagick 相關套件

查看 Imagick compiled with ImageMagick version 此欄位的內容資訊 ImageMagick 6.9.3-7 Q16 x86 2016-03-27 http://www.imagemagick.org

至該網站下載相對應版本 http://ftp.icm.edu.pl/packages/ImageMagick/binaries/

安裝 Imagick 相關套件

安裝完成後重啟 Apache

若 ImageMagick number of supported formats 與 ImageMagick supported formats 還是不變

請將 ImageMagick-6.9.3-Q16\modules\coders 所有 DLL 檔,複製到 AppServ\Apache24\bin

即可完成

[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;
	}
}