为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
交互式爱情 2021-11-13 16:17:55
我想要一个我的网站被访问次数的计数器,但不是唯一的,因此即使用户已经访问过它也可以计数,我希望它在我的 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<?phpsession_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 oneif(!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 memoryheader('Content-Type: image/png');echo imagepng($im);imagedestroy($im);?>
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

一个包含访客计数器的简单文本文件可以做到这一点,


<?php


function visitor_counter():int{

    static $cache=null;

    if($cache!==null){

        return $cache;

    }

    $fp=fopen("index.visitor_counter.txt","c+b");

    flock($fp,LOCK_EX);

    $cache=(int)stream_get_contents($fp);

    ++$cache;

    rewind($fp);

    fwrite($fp,(string)$cache);

    flock($fp,LOCK_UN);

    fclose($fp);

    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{

    $visitors=(int)file_get_contents("index.visitor_counter.txt");

    ++$visitors;

    file_put_contents("index.visitor_counter.txt",(string)$vistors);

    return $vistors;

}

(不要使用最后一个实现,它被窃听了。)


查看完整回答
反对 回复 2021-11-13
  • 1 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信