はじめに
私が運営しているブログ (駆け出しです) にサイトへの訪問者を表示させたかったので、アクセスカウンターを実装してみました。
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アナリティクスの訪問数よりもはるかに多い)ので、何かがおかしい状態だと思われます。。
まずは備忘録として残しておきます。
改善点等がありましたら、ご指摘いただけますと幸いです。