【特別企画】 トラフィックエクスチェンジを作ってみよう! > 7、サーフされたときにポイントが減るようにしてみる

7、サーフされたときにポイントが減るようにしてみる

ん? タイトルが間違ってるんじゃないですか?  サーフされたときにポイントが減る?  その言い方はちょっと違うんじゃないですか? 誤解を招くんじゃないですか? 
正しくはこうです。

サーフしたときに相手のポイントを減らす。

そうです。何事も相手あってのこと。自分のことだけ考えてちゃいけないって幼稚園で習ったでしょ?  相手のポイントを減らせ! トクをするのは俺様だけだ! その分オマエがソンをしろ!  それがトラフィックエクスチェンジという修羅の国の掟だ!  お互いに幸せになろうなどと甘っチョロイことを言うやつは消え失せろ! 

サーフ完了時の処理の中身をさらに埋める

はい、というわけで要領は前回と同じです。
前回はサーフ完了時の処理である surfCompleted.php に(自分の)ポイントを増やす処理を追加しました。 今回はここにサーフした相手のページのポイントを減らす処理を追加します。

surfCompleted.php
<?php
    require_once("functions.php");
    
    session_start();
    
    $url        = GetValue($_SESSION, "url");
    $pageToSurf = GetValue($_SESSION, "pageToSurf");
    
    
    // 自分のページにポイントを追加
    AddPoint ( $url, 1 );
    
    // 相手のページのポイントを消費
    ConsumePoint ( $pageToSurf, -1 );
    
    // サーフページへ戻る
    header('Location: http://xxxxxxxxx/surf.php');
?>

処理の本体は例によって functions.php 側に書くこととして、ここで必要な処理は2つ。

・今サーフしていたページ(のURL)を取得
・そのページのポイントを消費する処理

> ・今サーフしていたページ(のURL)を取得
surf.php の側で持っていた値をここでどうやって取得するか?  方法はいろいろありそうですが、ここではセッションから取得することとします。 と言っても今はセッションにそんな値を入れていません。後で surf.php の側にその処理を追加しましょう。

> ・そのページのポイントを消費する処理
ポイント獲得の逆の処理ですから、符号を逆にしてAddPointを使ってもよさそうです。 よーし、じゃあそれを使い回せば楽勝だぜ!  とも思ったのですが、ポイントを減らしてゼロになったらファイルを削除、という処理も追加するんでしたよね。 結局なんやかんやと追加しなければいけない手間は同じかもしれません。 というわけで追加は追加、消費は消費で処理を分けることにします。その方がわかりやすいっすよね?  AddPointと同じようなパラメータでConsumePoint。これで突っ走ります。

ところで上のソースだと「-1ポイントを消費」だから、国語と算数の得意なお友達は「それってつまり 1ポイント増えるってこと?」と言いたくなるところでしょう。 そういうお友達はここには正の数字を書いて、ConsumePointの中に符号を逆にする処理を書いてね。ここでは面倒なのでそれは省略するよ。

では functions.php に AddPoint をコピペする勢いで ConsumePoint を…… の前にサーフ画面側で相手ページのURLをセッションに入れる処理を書いておきましょう。

surf.php のPHP部分
<?php
    
    ~ 中略 ~    
    
    // 登録されてないなら登録する
    RegisterIfNecessary ( $url );
    
    // 自分の情報を取得
    $info = ReadUserDataFile ( md5($url) );
    $myPoint = $info['point'];

    // サーフ対象ページ取得
    $pageToSurf = GetPageToSurf ( $url );
    
    // サーフ完了処理の側で参照できるようにサーフ対象ページをセッションに入れておく
    $_SESSION['pageToSurf'] = $pageToSurf;
?>

たったの1行追加するだけ。楽勝ですね。
これで surfCompleted.php の側で pageToSurf が取得できるようになります。

では立ち止まらずに functions.php だ。

functions.php の空いているところに
//=========================================================
// ポイント消費
//=========================================================
function ConsumePoint ( $url, $point ) {

    $urlMd5 = md5($url);
    $userDataDir = "userdata/";

    // ファイルが存在しないなら何もしないこととする
    if ( !file_exists( $userDataDir . $urlMd5  ) ) {
        
        // ここで終了(以降の処理には進まず、ここで終わる)。
        return;
    }
    
    // ポイントを減らす(「減る」かどうかは $point の中身次第ですがこのサンプルでは符号を気にしないことにします)
    $f = fopen( $userDataDir . $urlMd5, "a+");
    fwrite($f, $point . "\n");
    
    // 閉じる
    fclose($f);

    // ポイントを確認
    $info = ReadUserDataFile ( $urlMd5 );
    $currentPoint = GetValue ($info, "point");
    
    // 0 になっていたらファイルを削除
    if ( $currentPoint <= 0 ) {
        
        unlink ( $userDataDir . $urlMd5 );
    }
    
}

前半はポイント獲得の処理と大体同じですね。 ここでも念のためにファイルの存在を確認しています。 が、存在しないとしても作成はせず、単に処理を中止するだけにしています。 なぜかと言うとポイントを減らすだけですからね。「ファイルがない=ポイントゼロ」ですから、 わざわざファイルを作成してマイナスにする必要はありません。

なお、排他処理の観点で厳密に言うと、ここでファイルが「存在する」と判定されたとしても、 その直後には削除されているかもしれません。これだから排他処理は心が病んできますね。 まさに吐いた処理って感じですよ。IMEさんもたまにはいいことを言う。歯痛でも可。 こういう場合PHP的に警告が出たりします。が処理が停止してしまうというわけではありません。ゆえに無視して突貫します。 いっそ冒頭でのファイルの存在確認も「そのような軟弱なことはせんのじゃ!」ぐらいの勇ましさがあってもよかったかもしれません。 ワシとしたことが日和ってしもうたワイ。

末尾付近にて、ポイントを確認して0(or以下)になっていたら削除しているところにも注目です。
このようにしておく目的は2つ。

・ポイント追記によるファイルの肥大化を防ぐ(用済みなら削除)
・表示の際に残りポイントを確認しなくて済む(ファイルが存在する=ポイントが残っている)

注目です、などと言いましたが冷静に考えてみるとトラ以下略の本質とはあんまり関係ないような気がしてきました。 DBを使わずにファイルで済ませていますので、そのための小細工ということですね。 素直にDBを使っていればこういうことをする必要はないのでした。

後は上記ソース内のコメントの通りです。
「ポイントを確認」のところで使っている ReadUserDataFile ってのは以前、ログインのときに自分の登録データを取得するために作ったやつですね。 自分のデータだけじゃなく、こうして他の人のデータだって取得できるってわけです。 ちなみにこのフローだと「ポイントを減らす」の後にファイルを閉じた後、 ReadUserDataFile の中でも再び同じファイルを開いて閉じることになるので処理としては無駄があります。 おぅよ、無駄があるのぅ。だから何なんじゃ? この軟弱者めが!

さて、これで奪い奪われる修羅の国が完成しているはず。
実際に動かして確認してみましょう。

サーフ画面でカウントダウン。


ポイントゲット! ヒャッハー!
では、さっき表示されていたURLのレコードファイルを見てみましょう。


マイナスが書き込まれているぜ! ヒャッハー!


そのままオートでずっと続けていると やがて自分以外のユーザーのポイントを吸い付くしてデフォルトページが出てきます。まさに一人勝ち。 幼稚園で習った通りですね。自分のことだけ考えてちゃいけない。 他人がいるからこそ、こうして踏みつけるヨロコビを味わえるってわけです。ギヒヒ。

今回のまとめ

これにて完成です。完成というほど完成度が高いというわけでもないですが、 一応はトラフィックエクスチェンジとして動作する状態になっているはずです。

最後ですから全ファイルのソース全文を以下に掲載……と思いましたが今回は載せないことにしました。 順番に試しながら進めてくれば、この段階で手元に完成品が出来上がっているはずですからね。 というか途中のページを読まずにここだけコピペして完成品が手に入ってしまうようでは面白くないというものです。 途中を読んでないお友達はぜひ最初のページから試してみてね〜。

次回予告

おっと、次回はないんだった。お約束お約束。

サイトTOPへ戻る
目次へ戻る
前のページ
おわりに