我正在尝试大批量创建促销代码(使用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时,我一直遇到问题。我可以做出任何明显的性能调整,或者我可以采用不同的方式吗?
答案 0 :(得分:4)
您可能不需要在一个巨大的字符串中将所有30,000个代码加载到内存中。只需在数据库中创建一个表,添加code
唯一字段(主键或唯一索引)并插入随机代码,直到成功插入30,000个。
答案 1 :(得分:2)
具体是什么类型的问题?
我的建议是:不要将代码存储为CSV格式,而是创建一个新的索引列并将每个代码存储在自己的行中 - 同样,使用准备好的查询。
在~250 KB字符串上执行60,000 strpos()
可能不是最好的想法......
答案 2 :(得分:1)
如果你不想在循环中插入(它们也很昂贵),请使用数组和方法in_array来检查字符串。查看in_array函数的注释,有人说使用array_flip可以获得更好的性能,然后检查数组键