Calender
Sun Mon Tue Wed Thu Fri Sat
 123456
78910111213
14151617181920
21222324252627
28293031   
<< July 2019 >>
広告
SEARCH

SELECTED ENTRIES
RECENT COMMENTS
RECENT TRACKBACK
CATEGORIES
ARCHIVES
LINKS
PROFILE
OTHERS
SKYPE
PC: skype.jojo.jp
chat
iPad: iphone.jojo.jp
chat call
THANKS



本日:
昨日:
多言語
広告
 ▼▲ 作業日報 ▼△
    What's under the hood?
<< 【drush】htmlspecialchars(): Invalid multibyte sequence in argument | main | Ubuntu ファイル共有(samba)の閲覧 >>
【drupal】page callback で画像を返す方法
Drupalで画像をコンテンツ単位と扱いたい(検索・タグ付け等)が、直接<img src="xxx"/>などのタグで埋め込みもしたかったのでDrupalに画像をルーティングしてもらう方法を検討しました
hook_menu(){
  $items['someone_module/image/%'] = array(
    'page callback' => 'someone_module_return_image',
    'page arguments' => array(2),  //第二パラメタがファイル識別子
    'access callback' => 'user_access',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
}


function someone_module_return_image($imgid){  //ここではファイルを読み込んでいるだけ  $img = file_get_contents("/some/where/image/{$imgid}");  image_style_deliver('image/jpeg',$img); echo $img; }
※但し"sites/defautl/files/xxxx/abcd.jpg" 等のように直接アクセスする場合のレスポンスは100msec以内ですがこの方法方だと、400〜800msかかり非常に遅いです。
(画像サイズは35kb程度、APCなし)
画像が多いと速度的にこの方法で画像を参照するのは問題があると思われます。
解決方法としては、
1.キャッシュ(cache_get())を行う
2.本来の場所へ転送を行う

1.キャッシュを行う
function someone_module_return_image($imgid){
 $obj = cache_get(__FUNCTION__);
 if (!$obj) {
  $img = file_get_contents("/some/where/image/{$imgid}");
  cache_set(__FUNCTION__,$img);
  } else {
  $img = $obj->data;
  }
 drupal_send_headers(array('Content-type'=>'image/jpeg'));
 echo $img;
}
※キャッシュのライフサイクルを考えていません

2.転送
function someone_module_return_image($imgid){
 drupal_send_headers(array("Location'=>'http://xxx/xxx/sites/default/files/img/{$imgid}"));
}
自分的には1キャッシュの方を採用したかったのですが、それほど高速化には繋がらずキャッシュが効いた状態でも200ms程度しか速くならないようでした。
2の転送の場合は転送速度のみのオーバーヘッドになりますので高速ですが、1画像に付き毎回2回のアクセスが発生する為効率的には悪い(tcpのオーバーヘッド等)とは思います。

| - | 22:42 | comments(0) | trackbacks(0) |









http://blog.jojo.jp/trackback/1424918