如何实现每次点击链接时,新旧用户均跳转至不同页面?
解决方案:实现全局轮询跳转
原代码依赖session存储跳转索引,仅能在单个用户会话内轮询链接。要实现所有用户(无论新老)每次点击都按顺序跳转不同页面,需要改用全局共享的存储方式记录当前跳转位置,文件、数据库或缓存服务都是可行选项。下面提供基于文件存储的最简实现方案:
修改后的代码
<?php $links = [ 'https://www.javatpoint.com/array-in-java', 'https://seomagnifier.com/backlinks-maker' ]; $counterFile = 'link_counter.txt'; // 初始化计数器文件(不存在则创建) if (!file_exists($counterFile)) { file_put_contents($counterFile, '0'); } // 加锁避免并发冲突 $fileHandle = fopen($counterFile, 'r+'); flock($fileHandle, LOCK_EX); // 读取当前计数器值 $currentLink = (int)fread($fileHandle, filesize($counterFile)); // 计数器超出链接总数时重置 if ($currentLink >= count($links)) { $currentLink = 0; } // 获取目标跳转链接 $targetLink = $links[$currentLink]; // 更新计数器 $currentLink++; fseek($fileHandle, 0); fwrite($fileHandle, (string)$currentLink); ftruncate($fileHandle, ftell($fileHandle)); // 释放锁并关闭文件 flock($fileHandle, LOCK_UN); fclose($fileHandle); // 执行跳转 header("Location: $targetLink"); exit; ?>
核心逻辑说明
- 替换
session为全局文件计数器:所有用户共享同一计数器文件,确保每次点击都按全局顺序轮询链接。 - 文件锁机制:用
flock添加排他锁,避免多用户同时操作计数器时出现数值错乱,这是高并发场景下的必要处理。 - 自动初始化:计数器文件不存在时会自动创建并初始化为0,无需手动配置。
可选优化方案
如果服务器支持更高性能的存储服务,也可以替换为以下方案:
- Redis:使用
INCR原子命令更新计数器,性能优于文件存储,适合高并发场景。 - 数据库:创建单表存储计数器值,通过事务或原子更新语句保证计数准确性。
内容的提问来源于stack exchange,提问作者Sahil Sharma
相关产品推荐
相关产品推荐

