[英]PHP Hit Counter with DATE
我在命中計數器上使用以下代碼:
$fp = fopen("counterlog.txt", "r");
$count = fread($fp, 1024);
fclose($fp);
$count = $count + 1;
$fp = fopen("counterlog.txt", "w");
fwrite($fp, $count);
fclose($fp);
在文件中我只有一個數字,但我想以下列方式獲取文件:
18/09/2015 10
19/09/2015 11
因此,我希望按日期和日期分組的計數由選項卡分隔。
我知道我可以使用數據庫來做到這一點,但在這種特定情況下我只想使用文本文件。
有可能獲得嗎?
這應該符合您的要求。
<?php
$dateexists = false;
if(!file_exists('counterlog.txt'))
{
$fh = fopen('counterlog.txt', 'w');
fclose($fh);
}
$datecounts = file('counterlog.txt', FILE_IGNORE_NEW_LINES);
foreach($datecounts as $key => $datecount){
list($date, $count) = explode("\t", $datecount);
$count = (int) $count;
if($date == date('d/m/Y'))
{
$datecounts[$key] = $date."\t".++$count;
$dateexists = true;
}
}
if(!$dateexists)
{
$datecounts[] = date('d/m/Y')."\t1";
}
$fh = fopen('counterlog.txt', 'w');
if (flock($fh, LOCK_EX)) {
foreach($datecounts as $datecount)
{
fwrite($fh, $datecount.PHP_EOL);
}
flock($fh, LOCK_UN);
}
else
{
//couldn't lock, might want to do stuff here
}
fclose($fh);
我建議不要使用文件。 如果兩個請求幾乎同時出現,則可能會損壞您的文件。 當然,您可以通過鎖解決此問題,但數據庫可以更好地解決問題。
我會說為此使用csv格式。 這至少是一種正式的格式,它允許您更容易地讀取和寫入它。
$fp = fopen( "counter.txt", "r" );
while( !flock( $fp, LOCK_EX ) ) {
}
$csv = Array();
$currentdate = date( "d/m/Y" );
$rowavailable = FALSE;
while( ($row = fgetcsv( $fp, 100, " " )) !== FALSE ) {
if( $row[0] == $currentdate ) {
$row[1] = $row[1] + 1;
$rowavailable = TRUE;
}
$csv[] = $row;
}
fclose( $fp );
if( !$rowavailable ) {
$newrow = Array( $currentdate, 1 );
$csv[] = $newrow;
}
$fp = fopen( "counter.txt", "w" );
for( $csv as $row ) {
fputcsv( $fp, $row, " " );
}
fclose( $fp );
flock( $fp, LOCK_UN );
希望這對你有所幫助
<?php
$today = date('d/m/Y');
$dd=null;
$fp = fopen("test.txt", "r");
if ($fp) {
while (($line = fgets($fp)) !== false) {
$dd[] = explode(' ', $line);
}
} else {
}
fclose($fp);
$fw = fopen('test.txt', 'w');
if(is_array($dd) && count($dd) > 0){
foreach ($dd as $key => $value) {
$cc = $value[1];
if($today == $value[0])
{
$cc++;
}
fwrite($fw,$value[0].' '.$cc);
}
}else
{
fwrite($fw,$today.' 0');
}
fclose($fw);
exit;
?>
我正在做的是,逐行讀取文件數據並制作一個數組然后再次寫入,同一天計數將被分組
除了@ Sumurai8立即使用CSV的答案之外,還可以進一步減少代碼。 將文件讀入assoc數組的正則表達式非常簡單:
$file = file_get_contents("cnt.txt", LOCK_EX);
preg_match_all("/^ ([\d/-]+) \s+ (\d+) /mix", $file, $dc);
$date_counts = array_combine($dc[1], $dc[2]);
有一個["2015-11-11" => 22, ...]
數組然后簡化了將每日期計數器更新為:
$date = date("Y-m-d"); // proper ISO format
$date_counts[$date] += 1; // extra notice for first hit
用file_put_contents
寫回來變得相當容易,並簡化了鎖定:
array_walk(
$date_counts,
function(&$cnt, $date) {
$cnt = "$date $cnt";
}
);
$file = implode("\n", $date_counts);
// add another fopen/flock/LOCK_SH here
file_put_contents("cnt.txt", $file, LOCK_EX);
請注意,這仍然不是原子寫入。 (但不使用數據庫是你的決定和問題,而不是我的。)
fwrite($ fp,date('d / m / Y')。''。$ count);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.