我的文件里面有~10,000行。我希望每次用户访问我的网站时,它会自动随机选择10行 我目前使用的代码:
$filelog = 'items.txt';
$random_lines = (file_exists($filelog))? file($filelog) : array();
$random_count = count($random_lines);
$random_file_html = '';
if ($random_count > 10)
{
$random_file_html = '<div><ul>';
for ($i = 0; $i < 10; $i++)
{
$random_number = rand(0, $random_count - 1); // Duplicate are accepted
$random_file_html .= '<li>'.$random_lines[$random_number]."</li>\r\n";
}
$random_file_html .= '</ul>
</div>';
}
当我有&lt; 1000行,每件事都可以。但现在,1000线。它使我的网站显着减慢 我正在考虑其他方法,例如:
将文件分割为50个文件,随机选择它们,然后在所选文件中选择10行randoms
- 或 -
我知道总线(项目)。随机制作10个数字,然后阅读文件使用
$file = new SplFileObject('items.txt');
$file->seek($ranđom_number);
echo $file->current();
(我的服务器不支持任何类型的SQL)
也许你有其他方法最适合我。什么是我的问题的最佳方法?非常感谢你!
答案 0 :(得分:0)
最快的方式显然是不从每个用户请求内部〜10.000行的文件中随机挑选10行。
由于我们不知道这个“XY问题”的细节,所以不可能回答更多问题。
答案 1 :(得分:0)
如果可以调整文件的内容,则只需填充每一行,使它们具有相同的长度。然后,您可以使用随机访问访问文件中的行。
$lineLength = 50; // this is the assumed length of each line
$total = filesize($filename);
$numLines = $total/$lineLength;
// get ten random numbers
$fp = fopen($filename, "r");
for ($x = 0; $x < 10; $x++){
fseek($fp, (rand(1, $numLines)-1)*$lineLength, SEEK_SET);
echo fgets($fp, 50);
}
fclose($fp);
答案 2 :(得分:-1)
尝试:
$lines = file('YOUR_TXT_FILE.txt');
$rand = array_rand($lines);
echo $lines[$rand];
其中10个只是把它放在一个循环中:
$lines = file('YOUR_TXT_FILE.txt');
for ($i = 0; $i < 10; $i++) {
$rand = array_rand($lines);
echo $lines[$rand];
}
注意:**上述代码不保证** 2 相同的行不会被选中。为了保证唯一性,你需要添加额外的while循环和一个包含所有随机生成的索引的数组,所以下次生成它并且它已经存在于数组中时,生成另一个直到它不在数组中。
上述解决方案可能不是最快但可能满足您的需求。由于您的服务器不支持任何类型的SQL,可能切换到不同的服务器?因为我想知道你如何存储用户数据?那些也存储在文件中吗?