2011-01-19 8 views
3

大量のバッチ(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でバッチを実行すると、OKのようです:

現在、私のコードは次のようになります。しかし、クライアントは一度に30kを生成できるようにしたいと考えています。ループを30kまで上げると、私は問題を抱えています。私が作ることができる明らかなパフォーマンス調整や、これを行うことができる別の方法がありますか?

+0

あなたが抱えている「問題」はどのようなキー配列をチェックされますか? – thetaiko

+3

なぜコードを配列ではなく巨大な文字列に格納していますか? – Jens

+0

コードはインデックス付きのテーブルに格納されます。テキストファイルにコンマ区切りのリストを書くことができるように、リストをメモリに保持していました。 – Jason

答えて

2

特にどのような問題がありますか?

私のアドバイスは、コードをCSV形式で保存せず、代わりに新しいインデックス付き列を作成し、各コードを独自の行に格納します。また、準備済みクエリを使用します。史上最高のアイデアではないかもしれません〜250キロバイト列に60,000 strpos()を行う

...

+0

スクリプトが実行されていたときに私のコンピュータが凍結したのは正直ではありません。 2回目は30kの22kのように終了し、ページはレンダリングを停止しました。私は記憶の中のそれらの文字列を取り出すと思う。 – Jason

+0

@salietata:わからない...? 'set_time_limit(0);'と 'ignore_user_abort(true);'を使ってみてください。 –

4

あなたはおそらく、単一の巨大な文字列にメモリにロードされたすべての3万コードを持っている必要はありません。データベースにテーブルを作成し、code一意のフィールド(主キーまたは一意のインデックス)を追加し、30,000回の挿入が成功するまでランダムコードを挿入します。

+0

私はこれを試します、ありがとう。 – Jason

+0

30000のインサートは高価ですし、フロー制御のための挿入に頼らえないことは言うまでもありません。 – Luis

+0

これは私の最初の懸念でした。私は両方の方法を試みるつもりです。ありがとう – Jason

1

ループ内に挿入したくない場合(高価です)、配列とin_arrayメソッドを使用して文字列をチェックしてください。 in_array関数のコメントで見てそこに誰かがあなたがarray_flip使用して、より良い性能を達成できることを言った後、

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

+0

'array_flip()'は必要ありません。単純に値とキー(または単にキー)を同じ値を持つものとして定義し、 'isset($ arr [$ code])'を使用します。コードが一意であるか、上書きされないかを確認すること。 –

+0

キーを設定すると、配列を格納するために必要なメモリの量が倍増していませんか? – Luis

+0

だからこそ、私は「またはただの鍵」と言いました。 =) –

関連する問題