>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>>==>>> // // //==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<<==<<< class CCh_server extends CCh { public function run() { CSfcacheオブジェの作成 $this->setupCacheObject(); クライエントからリクエストを受け取る $requ = CJson::decode($_REQUEST["requ"]); cmdがloadの場合は特殊な処理を行う。 if ( $requ["cmd"] == "load" ) { $resp = array("result"=>"OK"); //-- find loader cid ep-moduleは、client, admin, installのどれか $mname = CEnviro::get("ep-module"); cnameを作る:例、client-loader, client-main, admin-loader, etc $cname = $mname."-"."loader"; 3番目のパラメタが"#"の場合、データを読み込まず、cidだけを返す。 $cid = $this->sfc->get($cname,"default","#"); //-- should reload? サーバー側でキャッシュするかどうかの設定を読む。 $cfg = CConfig::get("sfcache"); $mode = $cfg["mode"]; ldr_indexは何回目のloaderであるかを示す。 $ldr_index = intval($requ["ldr-index"]); $b_reload = (条件1)サーバー側でキャッシュはON ($mode == 1) && (条件2)一回目のloader ($ldr_index == 1) && (条件3)クライエント側から送られてきたloaderのcidがサーバー側のloaderの cidと違う。 ($cid != $requ["ldr-cid"]); 以上の3条件が揃った場合、loaderをリロードする if ( $b_reload ) { $resp["cmd-update-loader"] = 1; } else { リロードしない場合: $requ["cached"]にはクライエント側でキャッシュされている 項目のcidのリストが入っている。 $cached = $requ["cached"]; getServerCacheItemsはmodule別(client,admin,install)の cinameとckeyのマップを返す。 cinameはcname中の二番目のストリングである。 例えば、cnameがclient-loaderの場合、loaderがcinameである。 $item_list = $this->getServerCacheItems($mname); load_itemsにCmpExeを使って製作しなければいけないデータ項目を入れる。 $load_items = array(); $itemsはレスポンスとして返すデータ項目のArrayである $items = array(); $item_list内の項目を一つ一つ見ていく foreach( $item_list as $ciname=>$ckey ){ cnameを作成する:"client-loader" = "client" . "-" . "loader" $cname = $mname."-".$ciname; ckeyが"[url]"の場合、ホストページのURLをckeyとして使う。 $ckey = ($ckey == "[url]") ? self::getHostPageUrl() : $ckey; 3番目のパラメタが"#"の場合、データを読み込まず、cidだけを返す。 $cid = $this->sfc->get($cname,$ckey,"#"); cidがストリングであり。。。 if (( is_string($cid) ) && クライエント側から送られてきたcidが存在して。。。 (isset($cached[$ciname])) && それがサーバー側のcidと同じであれば。。。 ($cached[$ciname]==$cid)) { 「キャッシュ内容に変更無し」(イコールサイン)を返す。 $rec = "="; } else { もしそうでなければキャッシュデータを読み込む $rec = $this->sfc->get($cname,$ckey); } if ( $rec ) { サーバー側にキャッシュがあったなら、レスポンスとして返すitemに 入れておく。 $items[$ciname] = $rec; } else { サーバー側にキャッシュがなかったら、後でCmpExeに送るための load_item Arrayに入れておく。 $load_items[$ciname] = $ckey; } } load_itemをリクエストの一部にすることで、 requだけをCmpExeに送ればいいことになる。 //-- call CmpExt $requ["load-items"] = $load_items; $resp = CCmpExe::run($requ); resp["items"]にデータが返ってくるわけだが、 これをクライエント側へ直接送ることはできない。 一度SfCacheに通して、キャッシュして、データ構造を変える。 //-- put items on sfcache foreach( $resp["items"] as $ciname=>$rs ) { $items[$ciname] = $this->sfc->put( $rs["data"], $rs["cname"], $rs["ckey"] ); } 最後に$resp["items"]をアップデートする。 $resp["items"] = $items; } } else { cmdがloadでない場合は、単にCmpExeへ送る。 $resp = CCmpExe::run($requ); } jsonのフォーマットでクライエントへ返す。 self::outputJson($resp); } private function getServerCacheItems( $mname ) { $cfg = array(); include("config/config.sci.inc.php"); return $cfg[$mname]; } } ?>