我正在尝试通过使用以下代码(原始源)来创建基于文本文件的顺序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: ......
。
可能会出错?
我相信您的问题来自您使用的模式。当你说
测试后,我发现它在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);