基于文本文件的顺序URL旋转器无法正常工作

时间:2017-09-25 09:01:30

标签: php rotation text-files

我正在尝试使用以下代码(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: ......时出现了错误。

哪里可能出错?

1 个答案:

答案 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);