/** * 画像を端末の解像度に合わせて変換する * output buffering 用コールバック関数 * * @param string 入力 * @return string 出力 */ public static function handler($buffer) { // 端末情報を取得する $carrier = SC_MobileUserAgent_Ex::getCarrier(); $model = SC_MobileUserAgent_Ex::getModel(); // 携帯電話の場合のみ処理を行う if ($carrier !== FALSE) { // HTML中のIMGタグを取得する $images = array(); $pattern = '/<img\\s+[^<>]*src=[\'"]?([^>"\'\\s]+)[\'"]?[^>]*>/i'; $result = preg_match_all($pattern, $buffer, $images); // 端末の情報を取得する $fp = fopen(MOBILE_IMAGE_INC_REALDIR . "mobile_image_map_{$carrier}.csv", 'r'); // 取得できない場合は, 入力内容をそのまま返す if ($fp === false) { return $buffer; } while (($data = fgetcsv($fp, 1000, ',')) !== FALSE) { if ($data[1] == $model || $data[1] == '*') { $cacheSize = $data[2]; $imageFileSize = $data[7]; $imageType = $data[6]; $imageWidth = $data[5]; $imageHeight = $data[4]; break; } } fclose($fp); // docomoとsoftbankの場合は画像ファイル一つに利用可能なサイズの上限を計算する // auはHTMLのbyte数上限に画像ファイルサイズが含まれないのでimageFileSizeのまま。 if ($carrier == 'docomo' or $carrier == 'softbank') { if ($result != false && $result > 0) { // 計算式:(利用端末で表示可能なcacheサイズ - HTMLのバイト数 - 変換後の画像名のバイト数(目安値)) / HTML中の画像数 $temp_imagefilesize = ($cacheSize - strlen($buffer) - 140 * $result) / $result; } else { // 計算式:(利用端末で表示可能なcacheサイズ - HTMLのバイト数) $temp_imagefilesize = $cacheSize - strlen($buffer); } // 計算結果が端末の表示可能ファイルサイズ上限より小さい場合は計算結果の値を有効にする if ($temp_imagefilesize < $imageFileSize) { $imageFileSize = $temp_imagefilesize; } } // 画像変換の情報をセットする $imageConverter = new ImageConverter(); $imageConverter->setOutputDir(MOBILE_IMAGE_REALDIR); $imageConverter->setImageType($imageType); $imageConverter->setImageWidth($imageWidth); $imageConverter->setImageHeight($imageHeight); $imageConverter->setFileSize($imageFileSize); // HTML中のIMGタグを変換後のファイルパスに置換する foreach ($images[1] as $key => $path) { // resize_image.phpは除外 if (stripos($path, ROOT_URLPATH . 'resize_image.php') !== FALSE) { continue; } $realpath = html_entity_decode($path, ENT_QUOTES); $realpath = substr_replace($realpath, HTML_REALDIR, 0, strlen(ROOT_URLPATH)); $converted = $imageConverter->execute($realpath); if (isset($converted['outputImageName'])) { $buffer = str_replace($path, MOBILE_IMAGE_URLPATH . $converted['outputImageName'], $buffer); } else { $buffer = str_replace($images[0][$key], '<!--No image-->', $buffer); } } } return $buffer; }
/** * セッションデータが有効かどうかをチェックする。 * * FIXME '@' でエラーを抑制するのは良くない * * @return boolean セッションデータが有効な場合は true、無効な場合は false を返す。 */ function lfMobileValidateSession() { // 配列 mobile が登録されているかどうかをチェックする。 if (!is_array(@$_SESSION['mobile'])) { return false; } // 有効期限を過ぎていないかどうかをチェックする。 if (intval(@$_SESSION['mobile']['expires']) < time()) { $msg = 'Session expired at ' . date('Y/m/d H:i:s', @$_SESSION['mobile']['expires']) . ' : sid=' . session_id(); GC_Utils_Ex::gfPrintLog($msg); return false; } // 携帯端末の機種が一致するかどうかをチェックする。 $model = SC_MobileUserAgent_Ex::getModel(); if (@$_SESSION['mobile']['model'] != $model) { $msg = 'User agent model mismatch : ' . '"$model" != "' . @$_SESSION['mobile']['model'] . '" (expected), sid=' . session_id(); GC_Utils_Ex::gfPrintLog($msg); return false; } return true; }
/** * セッション中の携帯機種名と、アクセスしてきたブラウザの機種名が同じかどうかを判定する * * @return boolean */ function validateModel() { $modelInSession = $this->getModel(); $model = SC_MobileUserAgent_Ex::getModel(); if (!empty($model) && $model === $modelInSession) { return true; } return false; }
/** * モバイルサイト用のセッション関連の初期処理を行う。 * * @return void */ function lfMobileInitSession() { // セッションIDの受け渡しにクッキーを使用しない。 ini_set('session.use_cookies', '0'); ini_set('session.use_only_cookies', '0'); // パラメーターから有効なセッションIDを取得する。 $sessionId = $this->lfMobileGetSessionId(); session_start(); // セッションIDまたはセッションデータが無効な場合は、セッションIDを再生成 // し、セッションデータを初期化する。 if ($sessionId === false || !$this->lfMobileValidateSession()) { session_regenerate_id(); $_SESSION = array('mobile' => array('model' => SC_MobileUserAgent_Ex::getModel(), 'phone_id' => SC_MobileUserAgent_Ex::getId(), 'expires' => time() + MOBILE_SESSION_LIFETIME)); // 新しいセッションIDを付加してリダイレクトする。 if ($_SERVER['REQUEST_METHOD'] == 'GET') { // GET の場合は同じページにリダイレクトする。 header('Location: ' . $this->gfAddSessionId()); } else { // GET 以外の場合はトップページへリダイレクトする。 header('Location: ' . TOP_URLPATH . '?' . SID); } exit; } // 携帯端末IDを取得できた場合はセッションデータに保存する。 $phoneId = SC_MobileUserAgent_Ex::getId(); if ($phoneId !== false) { $_SESSION['mobile']['phone_id'] = $phoneId; } // セッションの有効期限を更新する。 $_SESSION['mobile']['expires'] = time() + MOBILE_SESSION_LIFETIME; }