验证100万个+;在线表单上使用PHP和客户端编程语言的值

验证100万个+;在线表单上使用PHP和客户端编程语言的值,php,arrays,Php,Arrays,我一直在尝试使用PHP和在线表单上的客户端编程语言验证100多万个随机生成的值(字符串),但我面临一些挑战: PHP 链接到(可编辑)PHP代码: PHP代码: <?php function generateRandomString($length = 10) { $characters = '0123456789abcdefghijklmnopqrstuvwxyz-_.'; $charactersLength = strlen($characters); $ran

我一直在尝试使用PHP和在线表单上的客户端编程语言验证100多万个随机生成的值(字符串),但我面临一些挑战:

PHP 链接到(可编辑)PHP代码:
PHP代码:

<?php
function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyz-_.';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

$unique = array();
for ($i = 0; $i < 9000000; $i++)
{
    $u=$i+1;
    $random = generateRandomString(5);
    if(!in_array($random, $unique)){
                echo $u.".m".$random."@[server]\n";
                $unique[] = $random;
                gc_collect_cycles();
    }else{
        echo "duplicate detected";
        $i--;
    }

}
echo memory_get_peak_usage();

假设您能够编辑php.ini:

按如下所述增加内存限制:

有关“内存限制”,请参阅

对于“执行时间超时”,添加:

set_time_limit(0);

在PHP文件的顶部。

有趣的问题,首先,每当你想到这样的解决方案时,你首先需要考虑的一件事就是<强>它可以是异步?< /强>如果你的答案是“是”,那么你的实现可能会很简单,否则,您可能需要支付巨大的服务器成本或呈现随机缓存的结果

注意:删除
gc\u收集\u循环
。它的作用与您想要的相反,您几乎不需要手动调用它

话虽如此,我建议你的做法如下:

  • 使用在客户端浏览器上只打开一次的websocket,然后将结果从服务器实时转发到浏览器。当然,这段代码本身可以通过javascript完全在客户端运行,因此如果它不仅仅是一个PoC,您可以将php代码转换为javascript

  • 一旦生成的代码被确认为唯一的,更改代码以生成项目或通过websocket转发结果


  • 但是,如果您真的只是按照PHP代码所说的去做,那么您可以完全用javascript来做,并节省您的服务器资源

    您尝试过使用集合吗

    当您希望确保值不会出现两次时,集合非常有效

    检查set-it方式中是否存在值比在数组中的所有项上循环更快

    我不是PHP方面的专家,但在Ruby中它看起来会像这样

    require'set'
    字符='0123456789abcdefghijklmnopqrstuvwxyz-.'.'分割('');
    unique=Set.new()
    def GeneratorDomainString(l=10)
    Array.new(l){CHARS.sample}.join
    结束
    而唯一。长度<1_000_000
    random_string=GeneratorDomainString
    如果!唯一。包括?(随机字符串)
    唯一。添加(随机_字符串)
    结束
    结束
    

    希望有帮助

    尝试了此操作,但for循环太长。即使有无限限制(-1),服务器也会停止脚本运行。我对我的问题进行了编辑以反映他的想法。我尝试将其作为内存限制,但for循环太大,即使限制为-1也不够。为了释放一些内存,我不得不将for循环分成大块,我也这么认为。因此,您建议使用Ajax将所有值发送到服务器端,以便在客户端创建.txt文件?@EliseeKamanzi不是Ajax,这也很昂贵,因为您必须使用Ajax进行轮询,而不是使用。谢谢!我将切换到javascript,打开一个套接字将值传递给服务器端的PHP脚本。一个小问题:如果我必须将1个值与100万个现有值进行比较,那么客户端的RAM使用情况如何?我知道使用PHP时,当数组增长超过10000个项目时,内存使用会受到严重影响。@EliseeKamanzi实际上没有那么多。一个5个字符的字符串大约有5个字节,500万字节大约只有5mb。每个字符串的处理和测试都需要计算时间。