什么是生成大量独特促销代码的最佳方式?

时间:2011-01-19 15:48:06

标签: php mysql performance

我正在尝试大批量创建促销代码(使用php / mysql)。

目前我的代码看起来像这样:

$CurrentCodesInMyDB = "asdfasdf,asdfsdfx"; // this is a giant comma delimited string of the current promo codes in the database.
$PromoCodes = "";
for($i=0;$i<=30000;$i++)
{
    $NewCode = GetNewCode($PromoCodes, $CurrentCodesInMyDB );
    $PromoCodes .= $NewCode . ","; //this string gets used to allow them to download a txt file
    //insert $newcode into database here
}

function GetNewCode($CurrentList, $ExistingList)
{
    $NewPromo = GetRandomString();
     if(strpos($CurrentList, $NewPromo) === false && strpos($ExistingList, $NewPromo) === false)
     {
          return $NewPromo; 
     }  
     else
     {
          return GetNewCode($CurrentList, $ExistingList);   
     }
}

function GetRandomString()
{
     return "xc34cv87"; //some random 8 character alphanumeric string
}

当我以10k批量生产时,似乎没问题。但客户希望能够一次产生30k。当我将环路撞到30k时,我一直遇到问题。我可以做出任何明显的性能调整,或者我可以采用不同的方式吗?

3 个答案:

答案 0 :(得分:4)

您可能不需要在一个巨大的字符串中将所有30,000个代码加载到内存中。只需在数据库中创建一个表,添加code唯一字段(主键或唯一索引)并插入随机代码,直到成功插入30,000个。

答案 1 :(得分:2)

具体是什么类型的问题?

我的建议是:不要将代码存储为CSV格式,而是创建一个新的索引列并将每个代码存储在自己的行中 - 同样,使用准备好的查询。

在~250 KB字符串上执行60,000 strpos()可能不是最好的想法......

答案 2 :(得分:1)

如果你不想在循环中插入(它们也很昂贵),请使用数组和方法in_array来检查字符串。查看in_array函数的注释,有人说使用array_flip可以获得更好的性能,然后检查数组键

http://www.php.net/manual/en/function.in-array.php#96198