我正在开发一个新的验证码脚本,它几乎完成了,除了我想要一个单词列表,例如,假设我有一个 300 个 5 个字母的单词列表,我想用于验证码图像文本。
在高流量站点上处理此列表的最佳性能方法是什么?
每次加载时从文本文件中读取单词
存储在数组中
吗?
使用固定的单词列表可能会使您的验证码变弱,因为它将变体的数量限制在n!/ ( n - k )! 选项。每个验证码n = 300 个单词和k = 2 个不同的单词,无论单词有多长,它都只有 89700 个选项。
如果您使用四个随机字母 (az) 的序列,您将获得更多选项(确切地说是n ^ k = 26^4 = 456976)。
如果你只想选择 30000 个单词,我只需将它们全部放在一个数组中,直接用 php 代码,然后随机抽取一个。那将是最好的表现。
最好将随机数列表放入内存(APC 或 Memcache => google/stackoverflow 搜索 APC 或 Memcache)以获得最佳性能,因为磁盘 IO 会导致您的网站大部分时间变慢。为此,您应该有一个具有足够内存(>= 128MB)的盒子,并且可以安装软件(APC/Memcache)。如果您想在高流量网站上获得良好的性能,您应该愿意为此付费!!!
如果您在共享主机提供商上(但您不会获得最佳性能),那么最好将单词放在同一个文件中的数组中,因为每个 require 语句都会从磁盘中获取文件。
就像幸运说的那样,您可以通过简单的 rand 函数调用来获取随机数
return ($words[rand(0, count($words)-1);
其中 $words 是包含所有单词的数组。
这些是我使用 google 发现的一些便宜的 VPS 托管,但我认为您应该做更多的研究,为您的高性能网站找到最好的 VPS 托管。
您可以简单地生成一个随机数并显示它,而不是 300 个单词。无需列表,无需加载列表,无需管理列表,......
您需要每秒处理多少次登录?这似乎不是花时间进行优化的正确地方。几乎任何找到随机单词的方式都应该没问题,特别是如果您的单词列表只有 300 个单词。
我会从一个简单的文本文件开始,每行一个单词,然后做一些简单的事情,比如
$words = file("wordlist.txt");
return ($words[rand(0, count($word)-1);
只有当它真的被证明是一个瓶颈时,我才会将它更改为随机 fseek() 或其他一些“高性能”技巧。