mk14141
@mk14141

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

CakePHP3 の Cell を利用してアクセスカウンターを実装

Q&A

Closed

はじめに

私が運営しているブログ (駆け出しです) にサイトへの訪問者を表示させたかったので、アクセスカウンターを実装してみました。
CakePHP3 にはCell という機能があるので、こちらの機能を使ってみました。
※ブログ『CerisierAvantech FC-スリジエ・アバンテック FC』
URL:https://avantech-fc.com/

環境

  • OS: Windows10
  • PHP: 7.4.1

仕様

  • リロードしてもカウントされない
  • 自宅からのアクセスは対象外

Cellのファイルを作成 (コントローラーの役割)

  • display()では実行するための条件文、内部関数のgetCount()ではカウント処理を行なう。
  • カウントを行う際は $counter_file で指定したファイルに書き込む。
  • ○○○.○○○.○○.○○○ には自宅のIPアドレスが入ります。
site\src\View\Cell/CountsCell.php
<?php
namespace SiteApp\View\Cell;

use Cake\View\Cell;

/**
 * Counts cell
 */
class CountsCell extends Cell
{
    /**
     * count method
     * @return void
     */
    public function display()
    {
        session_start();
        $countTarget = false;

        if(@$_SESSION['access'] === 1) { // セッションが存在しているときはカウント対象外
            $countVal = $this->getCount($countTarget);

        } else { // セッションが存在していないとき
            if($_SERVER['REMOTE_ADDR'] !== '○○○.○○○.○○.○○○') { // 管理者のIPアドレス以外の時のみカウント処理を実行
                $countTarget = true;
                $_SESSION['access'] = 1;
            }
            $countVal = $this->getCount($countTarget);
        }
        $this->set('countVal', $countVal);
    }

    // *********************************************************
    // * User-defined functions
    // *********************************************************
    /**
     * Get Count Number
     * @param boolean
     * @return integer
     */
    private function getCount($countTarget) {
        $counter_file = 'avantech/counter.txt';
        $fp = fopen($counter_file, 'r+'); // ファイルがないときはエラーを返す
        $counter_length = 7;
        $countVal = fgets($fp, $counter_length);

        if ($fp && $countTarget) {
            if (flock($fp, LOCK_EX)) {// 排他ロック。読み取り/書き込みともに不可。
                $countVal++;
                rewind($fp); // ファイルポインタの位置を先頭に戻す

                if (fwrite($fp, $countVal) === FALSE) {
                    echo ('<p>'.'入場者数のカウントに失敗しました'.'</p>');
                }
                flock ($fp, LOCK_UN); // ファイルロックを解放。
            }
        }
        return $countVal;
    }
}

テンプレート

site/src/Template/avantech/Cell/Counts/display.ctp
<section class="access-counter">
    <p>ご来場ありがとうございます。<br>
    あなたは<span><?= $countVal ?>人目</span>のサポーターです。</p>
</section>

Cell の呼び出し (サイドメニューで表示)

CountsCell.php から変数を受け取り表示させる。

site/src/Template/avantech/Layout/default.ctp
    <aside class="sidebar">
      <?= $this->cell('Counts'); ?>
    <aside>

さいごに

下記参考サイトを参考になんとか実装して、本番環境にアップはしてみたものの、正確にカウントされていない(Googleアナリティクスの訪問数よりもはるかに多い)ので、何かがおかしい状態だと思われます。。

改善点等がありましたら、ご指摘いただけますと幸いです。

参考

0

1Answer

カウントの仕様がGoogleアナリティクスと違う、ということではないでしょうか?
例えばクローラー(ボット、スパイダー)を除外しているとすればカウントに差が出てくると思います。

0Like

Comments

  1. @mk14141

    Questioner

    @blue32a さん

    ご回答ありがとうございます。
    Googleアナリティクス側でのアクセスのカウント対象の条件でも変わってきますよね。
    参考にさせていただきます。

Your answer might help someone💌