top


総投稿数 本 
no_

スポンサーサイト

 --------
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
カテゴリ :スポンサー広告 トラックバック(-) コメント(-)
no_611

Flex:◇(とりあえず)出来た!phpと連携させたオンラインカウンター。ver.0.1 だな・・・ 【Flex:11日目】

 2009-01-11
 先回、FLex側まで作り終えた
 ・オンラインカウンター
 本日、PHP側も実装し、基礎テストも完了。(3台のPCだけど・・・)
 一応の報告と
 (すみません)貼っちゃいました。(右上「ようこそ」)

   ・(前回はこちら

始めます・・・
 ◎Flex3とphpの連携「オンラインカウンター」その2

 追記に ▼

※この連載は、はじめて「Flex」に取り組んだmetaboyが、
 60日間体験版を利用して、ゆっくりと学んでゆく、詳細な記録です。
                      (昨日・本日の作業時間:3.0時間
【Flex:11日目】


FC2ブログランキングにほんブログ村 IT技術ブログ Webサイト構築へブログ王ランキング人気ブログランキング人気ホームページランキングへ


more**************************************************
Flex3とphpの連携「オンラインカウンター」その2
**************************************************
   ・(前回はこちら

 ■前回
 /*------------------------------------------*/
  ・まずは、
   ・Flex3 による、
    ・表示する部分
    ・一定時間ごとにサーバーにアクセスし
     ・値を得て、それをラベルコントロールに表示
   するところまでを終えた。

   その後、
   ・crossdomain.xml などの処理を行い
    iframe を利用して表示させるところまで
   だ。


 ■今回行うこと
 /*------------------------------------------*/
  □PHP側の実装
   ・アクセス利用者ごとにIDを発行し
   ・アクセス時間と利用者IDをログファイルに記録
   ・特定の時間を過ぎていない利用者をカウントし
   ・合計利用者数を 返す

  □iframe ではなく
   JavaScript による
   (ブログパーツなどでよく利用されている)方法で
   頁に実装

  □Flex側
   ・多少なりとも、テキストベースで、見てくれを考慮

 それでは、実現の詳細・・・


 ■開発の実際
 /*------------------------------------------*/
  ・今回はたいした動きではなかったので、
   PHP側も、クラスを利用した書き方ではなく
   1ファイルで構成
  (ほんとは、エラートラップなども確実に行う
   必要があるんだろうけど)

 【PHP 側】

 ■システムで利用する 共有変数値を設定

  ・特に initファイルなどは用意せず直接記述
//
// ** 定数変数 ** //
//
$SYS_VALS['tar_file'] = ".log_access"; // 記録するログファイル
$SYS_VALS['cktime'] = 5; // オンライン中か調べる間隔(分)
$SYS_DATA['user_id'] = ""; // 利用者ID(初期化)

 ・システムで定数的に利用する値を $SYS_VALS
  としている(個人的にあまり、define は利用していない)

 ■まず、アクセスしてきた利用者
  クッキーを調べる

//
// ** Cookieチェック ** //
//
if(
isset($_COOKIE['onlinecnt_mb'])){
// 取得
$SYS_DATA['user_id'] = $_COOKIE['onlinecnt_mb'];
}else{
// 新規生成
$SYS_DATA['user_id'] = md5(uniqid(mt_rand()));
setcookie('onlinecnt_mb',$SYS_DATA['user_id'], 0); // 保存
}

 ・クッキー名を「onlinecnt_mb」とし
  値を取得
  ・あれば、作業用の変数に格納し
  ・なければ、新規作成する
   ・「平均的な libc の rand()よりも
     4 倍以上高速に乱数を生成」と謳われている
    mt_rand を利用し
   ・uniqid で、
    「マイクロ秒単位の現在時刻にもとづいた、
     接頭辞つきの一意な ID」を発生させ
   ・md5 で、
    「文字列のmd5ハッシュ値を計算」し
    より予測困難な
    32 文字の ID(128 ビット十六進数) を作成
   ・生成したIDは、クッキーで保存する

 ■アクセスを記録するログファイルをチェック
  ※ログ といっても、累積的なものではなく
   利用者ID-時刻 の組み合わせの
   一時記録
  ※「ログ」という言い方は個人的な好みでしかない

//
// ** ログファイルチェック ** //
//
if (!file_exists($SYS_VALS['tar_file'])) {
// なきゃ大変、あること前提
}else{

// ログファイル読込
$buf = mb_convert_encoding(file_get_contents($SYS_VALS['tar_file']), 'UTF-8', 'auto');

$now_time = time(); // 現在の時刻を取得
if($buf!=''){
// あれば
// 配列変数に格納
$temp_arrays = unserialize($buf); // unserialize する

if (
is_array($temp_arrays)
&& count($temp_arrays)
){
// 配列分(登録されている分)廻して
foreach ($temp_arrays as $key => $value) {
// 現在の時間と、ログに(最終)登録されている時間を比べ

if ($key != $SYS_DATA['user_id']) { // 自分以外の記録
if (($now_time - $value) > ( $SYS_VALS['cktime'] * 60)) {
// チェック間隔時間を越えていれば
unset($temp_arrays[$key]); // 配列リストからはずす
}
}
}
// 自分自身の記録を最新の時刻に
$temp_arrays[$SYS_DATA['user_id']] = time(); // 最新の時刻
}
}else{
// なければ 新規作成
$temp_arrays = array($SYS_DATA['user_id'] => time()); // 最新の時刻
}
// 配列オブジェクトをシリアライズして
$temp_log = serialize($temp_arrays);

// ログファイルを開き
$fp = fopen($SYS_VALS['tar_file'], 'w');
if (!$fp) { // 開けなかった
}else{
fwrite($fp, $temp_log); // 書き込み
fclose($fp);
}

// 人数を返す
echo count($temp_arrays);
}

 ・まずファイルの存在を調べ
 ・あれば
  file_get_contents で読み込んだものを utf-8 にして
  配列変数に読み込む
 ・この状態は
  ・値が「serialize」されていることを想定しているので
   それを元に戻して 作業用変数 $temp_arrays
   に入れておく
 ・配列をループでチェック
  自分以外の値について
  ・記録されている時刻が、チェック間隔を過ぎている
   古いものは、「ログアウト」したと判断し
   (まぁ、とりあえずこれで)
   配列から削除する
 ・その後、自分自身の記録(があれば)を
  新しい時刻で更新し
 ・最終的に「serialize」化したデータとして
 ・ログファイルを開き、上書き保存する

 ・配列をカウントし、件数を人数として
  echo で返す

 と、まぁいたってシンプルなプログラム だけれど
 実は、懸念・課題はたくさんあるのだ。
 (それはまた)

続いて
 【Flex3(FLASH) 側】

 ■MXMLファイル

  ・ラベルが少し増えて、次のようになった
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" borderColor="#F0F8FF" color="#353D44"
backgroundAlpha="0.0"
creationComplete="initApp()" width="100" height="50">

<mx:Script>
<![CDATA[
include "Script.as";
]]>
</mx:Script>

<mx:HTTPService id="getOnlineCnt"
url="(アクセスするURL)"
resultFormat="text"
fault="getFault(event)"
result="getResult(event)" />
<mx:Label x="12" y="14" id="lbl_view"
fontFamily="Verdana"
fontSize="12"
enabled="true" width="71" height="21" fontWeight="bold" textAlign="right" color="#040FF5" text=" --- "/>
<mx:Label x="3" y="30" text="オンライン中" id="lbl_ga" enabled="true" fontFamily="MS ゴシック" width="94" height="17" textAlign="right"/>
<mx:Label x="81" y="16" text="名" id="lbl_ga0" enabled="true" fontFamily="MS ゴシック" width="18" height="18"/>
<mx:Label x="3" y="2" text="ようこそ! ただ今" id="lbl_ga1" enabled="true" fontFamily="MS ゴシック" width="94" height="17" textAlign="left"/>

</mx:Application>


 ■前回からの修正

  ・今回
   Flex側からアクセスする際に、TIMER
   使っているが、ここが前回違っていた。
   ・現在 Flex側から 30秒ごとに
    アクセスし(オンライン中だよ!)
    と伝えているのだが

    これでは、一番最初のアクセスが
    30秒後になってしまう。
    ・まず最初に一度アクセスし
     それから、30秒ごとなのだ。
// *********************************************************
// タイマーイベント
// *********************************************************
private function goAccessCheck(event:TimerEvent):void {
goCheckCnt();
}

// 実際のサイトへのアクセス
public function goCheckCnt():void{
var param:Object = new Object(); //APIに送るパラメータ
param.test = "dummy"; //今はダミー
getOnlineCnt.send(param); // 実行
}

 ・実際のサイトへのアクセス 部分を独立させ

 最初に実行する
private function initApp():void {

goCheckCnt();
ticker.addEventListener(TimerEvent.TIMER, goAccessCheck);
ticker.start();
}

 で組み込んでおく。

 これ以外は基本的に前回のままだ。

そして
 【頁への組込み方法】

 ■swfobject.js の利用
deconcept
deconcept deconceptスで配布されている
 ・SWFObject
 を利用させていただき
 ライセンスは「MIT License



 ・禁煙カウンタ でも利用している方法だが

<!--
var so = new SWFObject("http://www.metaboy.net/apl/onlinecnt/oncnts.swf", "onlinecnt", "100", "50", "9", "#ffffff");
so.addParam("FlashVars", "");
so.addParam("quality", "high");
so.addParam("play", "true");
so.addParam("loop", "true");
so.addParam("menu", "false");
so.addParam("wmode", "transparent");
so.addParam("scale", "NoBorder");
so.addParam("salign", "TL");
so.write("onlinecnt");
//-->

 という、javascript ファイルを用意

 ■表示させる頁で
<script type="text/javascript" src="http://www.metaboy.net/js/swfobject.js"></script>
<div id="onlinecnt"><a href="http://www.metaboy.net/" target="_blank">創ったmetaboy<br />オンラインカウンタ<br />http://www.metaboy.net/</a></div>
<script type="text/javascript" src="http://www.metaboy.net/apl/onlinecnt/onlinecnt.js"></script>

 とするわけだ。

 ははは、これブログパーツでよく見かけますよね。
 一応この「オンラインカウンタ」も今後いろいろ充実させて
 ブログパーツ化を狙っているのだ。
 (現在はまだ 程遠い)

 と、いうわけで
 お恥かしい数字ではありますが、

 ・右肩上に貼っております。


 ●PHP の重要点●
  今回利用したメソッド類のマニュアルに
  下記、リンクを用意しておく。

  これらは近日
  (滞っている)
   ・制作リファレンス
    にまとめる予定です。

  □mt_rand - よりよい乱数値を生成する
  □uniqid - 一意な ID を生成する
  □md5 - 文字列のmd5ハッシュ値を計算する
  □file_get_contents - ファイルの内容を全て文字列に読み込む
  □serialize - 値の保存可能な表現を生成する



 ●問題があるのだ●
  これをいづれ「ブログパーツ」化するには
  まだまだ
  次のような 懸念・問題があるのだ。

  □ちと重い
  □貼っていただくサイト・ブログごと
   ログファイルを用意するか、その振り分けを
   ログファイル内でする必要がある
  □何よりもこのままじゃ面白くない
  □エラートラップがない
  □セキュリティ的にもっと考えなくては
  □うちはよくても
   大量にアクセスするところに
   耐えられるか?

  は~。道は遠い。
  (でも、続いているのだ)
commentsコメント
comment_post












管理者にだけ表示を許可する
commentトラックバック
トラックバックURL:
http://metaboy.blog23.fc2.com/tb.php/611-582980cd
ようこそ
Add to Google 創るmetaboy:RSSフィード
My Yahoo!に追加
最新記事のRSS | 問い合わせ

仕事検索、アルバイト検索、依頼仕事の検索ポータル - 仕事検索.COM - www.jobkensaku.com ツクルン

創るmetaboy - WEB創る、サイト創る、何創る - 創ったmetaboy

 

リンク集

 

最近の記事

 

ブロとも申請フォーム
Sponserd by

さくらのレンタルサーバ さくらのレンタルサーバ
大容量・高機能レンタルサーバー heteml 大容量・高機能レンタルサーバー heteml
XREA (ValueDomain)
お名前.com お名前.com
名づけてねっと名づけてねっと
ムームードメインムームードメイン

 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。