使用Imagick和Memcache来创建简易的缩略图缓存
环境
-
- CentOS 7.X
-
- Imagick
ImageMagick
Memcached
每次按照这个结构来做时,总是会因为名字混淆不清。
-
- ImageMagick是一个需要在服务器上安装的库。
-
- Imagick是使用PHP调用ImageMagick时的包装库。
-
- Memcached是一个缓存服务器。
- memcache是PHP的一个库,不过也有一个叫做memcached的库。
安装
- Memcachedインストール
# yum install memcached
# systemctl enable memcached.service
# systemctl start memcached.service
- memcacheインストール
# yum -y install php-pecl-memcache
# yum install php-pear
# yum install php-devel
- ImageMagickインストール
# yum install ImageMagick*
- Imagickインストール
# pecl install Imagick
# php -i | grep Imagick
示例代码
<?php
/**
* 画像サムネイル&キャッシュ
* @use
* http://{your_domain}/scripts/image-proxy.php?url=http://upload.wikimedia.org/wikipedia/commons/2/2a/2008_ZB_Viper_SRT-10_blue.jpg
*/
define('THUMB_WIDTH', 160);
define('THUMB_QUARITY', 80);
$url = $_GET['url'];
$imagick = new Imagick();
// URLをキーとして画像を保存
$memcached = new Memcached();
if ($memcached) {
$memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$memcached->addServer('127.0.0.1', 11211);
$blob = $memcached->get($url);
if ($blob) {
// キャッシュあり
trigger_error("Stored Cache : YES");
$imagick->readimageblob($blob);
} else {
// キャッシュなし
trigger_error("Stored Cache : NO");
$handle = fopen($url, 'rb');
$imagick->readImageFile($handle);
$imagick->resizeImage(THUMB_WIDTH, 0, 0, 0);
$imagick->setImageFormat('jpeg');
$imagick->setImageCompressionQuality(THUMB_QUARITY);
// キャッシュセット
if (!$memcached->set($url, $imagick->getimageblob())) {
trigger_error("Could not set Blob."); // サーバーが落ちている
}
}
}
// 出力
header("Content-Type: image/jpeg");
exit($imagick->getImageBlob());
?>
由于最新的环境(Laravel + GD + Intervention Image)的雰围看起来很不错,我决定把之前在Pear或Pecl全盛期时写的旧版本也放上来。