如何在将新用户名提交到.txt文件时删除旧用户名?

时间:2014-01-11 08:37:18

标签: php

我的网站上有一个名为“usernames.txt”的.txt文件。在该文件中,我的网站成员有用户名,每当新成员在我的网站上提交用户名时,它都会保存在“usernames.txt”文件中。

因为该文件每小时变大,所以我必须自己删除旧的用户名(顶部=最旧的)。这很糟糕,因为当我在学校时,我无法访问我的笔记本电脑,所以我无法删除用户名,这会导致我的服务器出现问题。 (我很难解释原因,但确实让我的网站变慢了。)

我想要的是一个脚本或PHP代码或者自动删除旧用户名的东西(比如说前面的前40个用户名)并将新的用户名保存在文件中(假设底部有30个用户名) “usernames.txt”文件。

或者,我可以使用一个脚本,每隔30分钟删除第一个用户名(在顶部)。因此,只有新用户名将保存在“usernames.txt”中。我知道这个问题听起来很奇怪,但重点是让我的服务器更快。

我网站上的文件实际上并没有被称为“usernames.txt”,但这对于文件的内容是微不足道的。我网站上的文件保存用户访问令牌(Facebook Graph thingy)但在我给它的例子中是Usernames not Access Tokens。 (因为大多数人甚至不知道Access Token是什么,但希望每个人都知道用户名是什么。)

2 个答案:

答案 0 :(得分:0)

将其存储在会话变量中,并在登录时请求它。

然后,您不必将其存储在与所有其他用户的信息混合的文本文件中,可能会导致冲突和I / O块(服务器请求正在等待读/写该文件时延迟。)

  1. 登录
  2. PHP在会话中存储访问令牌,以便于访问服务器端。
  3. 当用户关闭会话时,令牌消失。
  4. 如果您在任何给定点拥有大量用户(例如数十万 - 数百万),您可以担心RAM使用情况。

    是的,其他人都提到数据库也是一个有用的选择。对于这种特殊情况,我建议 MongoDB

答案 1 :(得分:0)

我假设每个用户都在自己的行上。

您可以将array_slice用于此目的。然后,您可以根据切片值重写文件。

$filepath = "usernames.txt";
// convert file to array
$file = file($filepath);

// get first 40 elements
$file = array_slice($file, 0, 40);

// rewrite usernames file
file_put_contents($filepath, implode("", $file));

如果你的服务器上有cron,你可以随时添加cron job来自动处理这个脚本。

编辑:

请尝试使用此脚本。

$filepath = "usernames.txt";
// reverse array to get first elements at the top; convert file to array
$file = array_reverse(file($filepath));

// get first 40 elements
$file = array_slice($file, 0, 40);

// reverse array back; rewrite usernames file
file_put_contents($filepath, implode("", array_reverse($file)));

EDIT2:

$file = file($filepath);

if(in_array($submittedUsername, $file)) {
   $i = array_search($submittedUsername, $file);
   unset($file[$i]);
}

// then save username to the file