我正在尝试使用以下代码(original source)创建基于文本文件的顺序URL旋转器:
<?php
$linksfile ="urlrotator.txt";
$posfile = "pos.txt";
$links = file($linksfile);
$numlinks = count($linksfile);
$fp = fopen($posfile, 'r+') or die("Failed to open posfile");
flock($fp, LOCK_EX);
$num = fread($fp, 1024);
if($num<$numlinks-1) {
fwrite($fp, $num+1);
} else {
fwrite($fp, 0);
}
flock($fp, LOCK_UN);
fclose($fp);
header("Location: {$links[$num]}");
?>
在我测试之后,我发现它会在pos.txt的现有内容之后继续将新位置编号作为字符串附加,因此脚本只能在第一次工作。
我尝试在if else
语句之前添加以下代码行,以便在更新之前清除pos.txt的现有内容。
file_put_contents($posfile, "");
但是在重定向行Undefined index: ......
时出现了错误。
哪里可能出错?
答案 0 :(得分:1)
我相信您的问题来自您使用的模式。当你说
在我测试之后,我发现它会在pos.txt的现有内容之后继续将新位置编号作为字符串附加,因此脚本只能在第一次工作。
它指出了fopen的模式用法。
您应该使用的模式是w
,因为它会“替换”pos.txt
内的内容。
$fp = fopen($posfile, 'w') or die("Failed to open posfile");
这样做会阻止您访问pos.txt
中的内容。所以你需要这样的东西:
$num = file_get_contents($posfile);
$fp = fopen($posfile, 'w') or die("Failed to open posfile");
flock($fp, LOCK_EX);
if($num<$numlinks-1) {
fwrite($fp, $num+1);
} else {
fwrite($fp, 0);
}
flock($fp, LOCK_UN);
fclose($fp);