環境
- CentOS 7.X
- Imagick
- ImageMagick
- Memcached
この構成でやるときに、いつも名前で混乱する。
- ImageMagickは、サーバーにインストールするライブラリ
- Imagickは、ImageMagickをPHPから使うときのラッパーライブラリ
- Memcachedは、キャッシュサーバー
- memcacheは、PHPのライブラリだけど、memcachedというライブラリもある……
インストール
- Memcachedインストール
Memcached
# yum install memcached
# systemctl enable memcached.service
# systemctl start memcached.service
- memcacheインストール
memcache
# yum -y install php-pecl-memcache
# yum install php-pear
# yum install php-devel
- ImageMagickインストール
ImageMagick
# yum install ImageMagick*
- Imagickインストール
Imagick
# pecl install Imagick
# php -i | grep Imagick
サンプルコード
image-proxy.php
<?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の全盛期に書いた旧版を載せてみる。