【特別企画】 トラフィックエクスチェンジを作ってみよう! > 6、サーフ完了でポイントを獲得できるようにしてみる

6、サーフ完了でポイントを獲得できるようにしてみる

前回までで既に「ほったらかしでアクセス(数)激増ぉ!」というところまではできています。 ならばあと一歩。「ほったらかしでポイント稼ぎぃ!」に向けて邁進するのみ。我ワクワクせざるを得ぬぅ!

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

前回、サーフ完了時に一度サーバー側へ処理を戻すためにファイルを一枚追加して次のように書いておいたのでした。

surfCompleted.php
<?php
    
    // サーフページへ戻る
    header('Location: http://xxxxxxxxxxxx/surf.php');

?>

これだけだと単にページをリロードしても同じじゃないの? って世界ですが、 ここにポイント獲得の処理を書いていきます。

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

例によって処理本体は functions.php に書くことにして、ここで先に夢を描いておきます。 叶えたい夢は何か? ズバリ、「自分(のURL)にポイント追加」です。 自分のURLはログイン情報としてセッションに入っています。 したがって session_start して $_SESSION から取得しています。 そして「このURLにポイントを追加して!」という願いを込めて AddPoint ( このURL, 追加するポイント数 ) にいたしましょう。

では functions.php に AddPoint を具現化していきます。
こんな感じです。

functions.php
//=========================================================
// ポイント追加
//=========================================================
function AddPoint ( $url, $point ) {

    $urlMd5 = md5($url);
    $userDataDir = "userdata/";
    
    // ポイントを追加
    $f = fopen( $userDataDir . $urlMd5, "a+");
    fwrite($f, $point . "\n");
    
    // 閉じる
    fclose($f);
    
}

すでにあなたは百戦錬磨ですから、説明不要で大体見たまんまですよね?  ともに戦ってきた仲間を信じてるんだぜ? 説明を書くのが面倒くさいわけじゃないんだぜ? 

1つだけポイントを言っておくと、fopen のパラメータの中にある "a+" です。 これが「ファイルの末尾に追記していくよ」という意味です。 こうしておけばファイルがまるごと上書きされてしまうという心配はありません。 つまり前々回だったか前々々回だったか忘れましたが排他制御という頭痛のタネを考えずに済ませるための必殺技というわけです。 なーんて言うとエライ人に怒られそうな気もしますが、 エライ人が怖くてトラフィックエクスチェンジ道を歩けるかってんだコンニャロメってなもんです。

さて、ポイントを獲得するという処理だけで言うとこれでOKっぽいのですが、1つ心配なことがあります。
それは何か?

「この時点で自分のレコードがなかったらどうしましょう?」

つまり userdata フォルダに 自分のURLをMD5化した名前のファイルが存在しなかったらどうするかってことです。 そんなことが果たしてありえるんでしょうか?  さっきは威勢のいいことを言ってたクセに、エライ人が怖くてビビってんじゃねぇのかぁ? あぁん?

エライ人はさておき、今回の仕様ではポイントはファイルにどんどん追記していく一方ということなのでした。 で、そのままではファイルサイズが肥大化する一方ですから、合計値がゼロになったらファイルごと削除してしまう、 という荒っぽい仕様にしていたのでした(その部分は次回の「ポイント消費」の段にて実装します)。

つまりここでポイントを追加しようとした時点で、 同時にサーフ中の別の誰かがあなたのポイントを消費して → ゼロになって → あなたのファイルが削除されている、 という可能性があるということです。

ではどうするか?
ファイルがなければ作りましょう。

functions.php の中のどこかに
//=========================================================
// ポイント追加
//=========================================================
function AddPoint ( $url, $point ) {

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

    // ファイルが存在しないなら作る
    if ( !file_exists( $userDataDir . $urlMd5  ) ) {
        
        $f = fopen( $userDataDir . $urlMd5, "w");
        
        // パーミッションを適当に設定しておく
        chmod ( $userDataDir . $urlMd5 , 0666 );

        // URLを書き込む
        fwrite($f, $url . "\n");
        
        // 閉じる
        fclose($f);
    }
    
    
    // ポイントを追加
    $f = fopen( $userDataDir . $urlMd5, "a+");
    fwrite($f, $point . "\n");
    
    // 閉じる
    fclose($f);
    
}

やっていることはレコードを登録するときの処理(RegisterIfNecessary)とほんとんど同じですね。 違いと言えば初期ポイントをつけているかどうかというぐらいのもの。 むしろあっちを廃止して代わりにこっちを使うように統一しても結果的には同じだったりします。 ここでは手抜きというか話のわかりやすさを優先して行き当たりばったりに書いてますが、 似たような処理をあっちこっちに書くなどワシのプログラマー魂が許さんのじゃ! という勇ましいお友達は 適当に整えておいてください。

さて、では夢が叶っているかどうか確かめてみようではありませんか。

ログインして……

サーフ画面へ。タイマーがカウントダウン。そして……

ポイントが増えたぜ! ヒャッハー!
もちろん同時に画面も切り替わってPV発生ですがそんなことはこの際どうでもいいんだぜヒャッハー!

今回のまとめ

今回はわりと簡単でしたね。
変更を加えたのは surfCompleted.php と functions.php の2枚のみです。

surfCompleted.php
<?php
    require_once("functions.php");
    
    session_start();
    
    $url = GetValue($_SESSION, "url");
    
    
    // 自分のページにポイントを追加
    AddPoint ( $url, 1 );
    
    // サーフページへ戻る
    header('Location: http://xxxxxxxxxxx/surf.php');
?>
functions.php 追加部分のみ
//=========================================================
// ポイント追加
//=========================================================
function AddPoint ( $url, $point ) {

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

    // ファイルが存在しないなら作る
    if ( !file_exists( $userDataDir . $urlMd5  ) ) {
        
        $f = fopen( $userDataDir . $urlMd5, "w");
        
        // パーミッションを適当に設定しておく
        chmod ( $userDataDir . $urlMd5 , 0666 );

        // URLを書き込む
        fwrite($f, $url . "\n");
        
        // 閉じる
        fclose($f);
    }
    
    
    // ポイントを追加
    $f = fopen( $userDataDir . $urlMd5, "a+");
    fwrite($f, $point . "\n");
    
    // 閉じる
    fclose($f);
    
}

次回予告

これで既に寝ててもアクセス大量アップップぅ! ポイント大量アップっぷぅ!  笑いもサーフも止まらぬワイ。なぁ兄弟? ガハハのハ。ってなもんです。
が、まだ足りないものがある。決定的に足りないものがある。それは何か? 
決まってます。
自分がトクをするだけで満足してはイケない。その分、他人にはソンをさせなければならない。

もう一度言いましょう。

自分にはプラスを! 他人にはマイナスを!

そう。他のやつらはマジメに画面を眺めてポイントを貯めているのに オートだから実際には画面を見なくていいということにこの世でただ一人だけ気付いたアタマのイイ俺様は パソコンを放置して楽しくお出かけなんだぜ? イヒヒのヒ。

そのドリーミィなヨロコビは他人のポイントが減るという事実に裏打ちされてこそ深みが増すというもの。 お互いに同じなどという軟弱な発想はここには存在しない!  というわけで次回はサーフ完了時に相手のポイントを消費する処理を追加していきますよ。お楽しみに!

サイトTOPへ戻る
目次へ戻る
前のページ
次のページ