0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

はじめに

私が運営しているブログ (駆け出しです) にサイトへの訪問者を表示させたかったので、アクセスカウンターを実装してみました。
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
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?