2017-05-23 8 views
0

をPHPカウントされます。私は特にこれのためにクッキーを使用することを避けたいと思う。また、SQL DBを使用しないでうまく動作するソリューションがあれば、SQL DBを使用しないことをお勧めします。訪問はmultitple回だから問題がある

プリフェッチなどのブラウザの動作を処理するために、if、elseif、else関数を使用して余分なページビューを除外しようとしています。

実際には、ページビューが時々ログファイルに2回書き込まれるか、またはifステートメントと残りのコードでタイミングの問題が発生するという問題があります。 (私はするIPアドレスの一部をマスクしている)

<?php 

/*set variables for log file */ 
$useragnt = $_SERVER['HTTP_USER_AGENT']; //get user agent 
$ipaddrs = $_SERVER['REMOTE_ADDR']; //get ipaddress 
$filenameLog = "besog/" . date("Y-m-d") . "LOG.txt"; 
date_default_timezone_set('Europe/Copenhagen'); 
$infoToLog = $ipaddrs . "\t" . $useragnt . "\t" . date('H:i:s') . "\n"; 
$file_arr = file($filenameLog); 
$last_row = $file_arr[count($file_arr) - 1]; 
$arr = explode("\t", $last_row); 
$tidForSidsteLogLinje = strtotime($arr[2]); 
$tidNu = strtotime(date('H:i:s')); 

//write ip, useragent and time of page view to log file logfil, but only if the same visitor has not viewed the page within the last 10 seconds 
if ($arr[0] == $ipaddrs and $arr[1] == $useragnt and $tidNu - $tidForSidsteLogLinje > 10){ 
    //write ip and user agent to textfile 
    $file = fopen($filenameLog, "a+"); 
    fwrite($file, $infoToLog); 
    fclose($file); 

} 
elseif ($arr[0] == $ipaddrs and $arr[1] == $useragnt and $tidNu - $tidForSidsteLogLinje < 10){ 
    die; 
} 
else {      
    //Write ip and user agent to textfile 
    $file = fopen($filenameLog, "a+"); 
    fwrite($file, $infoToLog); 
    fclose($file); 
    } 
?> 

ここでは、ログに重複したエントリの例は以下のとおりです:ここ

は、私が持っているコードです

xxx.x.95.240 Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko 12:52:33 
xx.xxx.229.91 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 12:52:45 
xx.xxx.229.91 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 12:52:45 
xxx.xx.154.83 ServiceTester/4.4.64.1514 12:53:03 
xxx.xx.91.126 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/603.2.5 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.5 12:53:05 
xx.xxx.35.3 Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 12:53:09 
xxx.xxx.130.34 Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko 12:53:56 
xxx.xxx.130.34 Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko 12:53:56 
xx.xxx.211.101 Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 12:54:11 
x.xxx.54.4 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/601.6.17 (KHTML, like Gecko) Version/9.1.1 Safari/601.6.17 12:54:33 

私のif文の場合上記のようなエントリに重複した行が表示されるようにする必要があります。

これらの重複エントリを排除するコードを改善するにはどうすればよいですか?

お手数をおかけしますようお願い申し上げます。

+0

、IPはすでにログに存在するかどうかを確認:あなたは次のように行くたびにexecutetを取得するスクリプトで 。すでに存在する場合は挿入し、そうでない場合はファイルに挿入します。 – phpfresher

+0

@phpfresher if文でこれをあまりチェックしていないのですか? 'if($ arr [0] == $ ipaddrsと$ arr [1] == $ useragntと$ tidNu - $ tidForSidsteLogLinje> 10)' ? – Chrvp

答えて

0

私たちのシステムでは、複雑なウェブサイトビジタートラック/ログシステムを使用しています。 この値をデータベースに保存し、[IPアドレス]フィールドを[一意]に設定することをお勧めします。

あなたはビジターが一度だけあなたのリストの中に存在し、この道を

Cookie::set('__id', time()); 

ようCookieIDを設定し、

if (isset($_COOKIE['__id'])){ 

     //With mysql you go like 
     $db->Execute("INSERT IGNORE INTO VisitorTable(hash, ip,..) 
     VALUES($_COOKIE['__id'],$_SERVER['REMOTE_ADDR'])" // the HTTP_USER_AGENT refferer all kind of information that you wannt to store 
     } 

のように行くことができます。詳細については、insert ignoreを参照してください。

これで、ユーザーが訪れるページを保存するための他の機能を行うことができます。一度ファイルに挿入する前に

$db->Execute("INSERT INTO VisitorActivity (visitorID,page....) VALUES ($_COOKIE['__id'],$_Server['..'])"); 
+0

ちょうどクリーナーソリューション –

+0

あなたの答えをありがとう。私は特にクッキーの使用を避けたいので、質問を更新する必要があることがわかります。 – Chrvp

関連する問題