如何仅使用文本制作网站(非唯一)访客计数器

我想要一个我的网站被访问次数的计数器,但不是唯一的,因此即使用户已经访问过它也可以计数,我希望它在我的 index.html 页面中显示为文本或字符串


希望它出现在下面的 html 代码中,我已经有一个使用 php 的 counter.txt 文件来完成这项工作,但它将它显示为图像,我只想要简单的文本


//html


<div>

<p> <center> Number of visitors:</center> </p>

<center><img alt="Visitor counter" src="counter.php" /></center>

</div>

//php


<?php

session_start();

$counter_name = "counter.txt";


// Check if a text file exists.

//If not create one and initialize it to zero.

if (!file_exists($counter_name)) {

    $f = fopen($counter_name, "w");

    fwrite($f,"0");

    fclose($f);

}

// Read the current value of our counter file

$f = fopen($counter_name,"r");

$counterVal = fread($f, filesize($counter_name));

fclose($f);


// Has visitor been counted in this session?

// If not, increase counter value by one

if(!isset($_SESSION['hasVisited'])){

    $_SESSION['hasVisited']="yes";

    $counterVal++;

    $f = fopen($counter_name, "w");

    fwrite($f, $counterVal);

    fclose($f);

}


$counterVal = str_pad($counterVal, 5, "0", STR_PAD_LEFT);

$chars = preg_split('//', $counterVal);

$im = imagecreatefrompng("canvas.png");


$src1 = imagecreatefrompng ("digits/$chars[1].png");

$src2 = imagecreatefrompng ("digits/$chars[2].png");

$src3 = imagecreatefrompng ("digits/$chars[3].png");

$src4 = imagecreatefrompng ("digits/$chars[4].png");

$src5 = imagecreatefrompng ("digits/$chars[5].png");


imagecopymerge($im, $src1, 0, 0, 0, 0, 56, 76, 100);

imagecopymerge($im, $src2, 60, 0, 0, 0, 56, 76, 100);

imagecopymerge($im, $src3, 120, 0, 0, 0, 56, 76, 100);

imagecopymerge($im, $src4, 180, 0, 0, 0, 56, 76, 100);

imagecopymerge($im, $src5, 240, 0, 0, 0, 56, 76, 100);


// Output and free from memory

header('Content-Type: image/png');

echo imagepng($im);

imagedestroy($im);

?>


交互式爱情
浏览 138回答 1
1回答

翻过高山走不出你

一个包含访客计数器的简单文本文件可以做到这一点,<?phpfunction visitor_counter():int{&nbsp; &nbsp; static $cache=null;&nbsp; &nbsp; if($cache!==null){&nbsp; &nbsp; &nbsp; &nbsp; return $cache;&nbsp; &nbsp; }&nbsp; &nbsp; $fp=fopen("index.visitor_counter.txt","c+b");&nbsp; &nbsp; flock($fp,LOCK_EX);&nbsp; &nbsp; $cache=(int)stream_get_contents($fp);&nbsp; &nbsp; ++$cache;&nbsp; &nbsp; rewind($fp);&nbsp; &nbsp; fwrite($fp,(string)$cache);&nbsp; &nbsp; flock($fp,LOCK_UN);&nbsp; &nbsp; fclose($fp);&nbsp; &nbsp; return $cache;}然后只需在您的索引文件中调用visitor_counter()。如果您想知道为什么我要使用 flock() 而不是简单的 file_get_contents(),那是因为如果有几个人同时访问您的网站,例如如果计数器为 100 并且有 2 人访问,则可能会发生竞争条件同时,2 个不同的 php 实例100从文件中读取,并将其增加到101,然后写101回硬盘两次,在这种情况下,文本文件将包含不正确的数字101而不是正确的数字102,但是 flock() 在这里使确保不会发生这种情况,通过让 php 实例 #2 等到实例 #1 读取并更新文件(#2 将等待 #1 执行 LOCK_EX 到 #1 执行 LOCK_UN,然后 #2 执行完全相同的操作~)。这是一个易于理解但存在漏洞(容易出现上述竞争条件)的实现:function visitor_counter():int{&nbsp; &nbsp; $visitors=(int)file_get_contents("index.visitor_counter.txt");&nbsp; &nbsp; ++$visitors;&nbsp; &nbsp; file_put_contents("index.visitor_counter.txt",(string)$vistors);&nbsp; &nbsp; return $vistors;}(不要使用最后一个实现,它被窃听了。)
打开App,查看更多内容
随时随地看视频慕课网APP