2011-04-03 25 views
13

私は約50,000の携帯電話番号を持っています。私は、第三者APIを使用してバルクSMSを処理し、これらの番号に送信しようとしていますが、ブラウザは数分間停止します。私はより良い選択肢を探しています。データのブラウザのタイムアウトなしに大量のデータをPHPで処理する

処理は、私がデータをキューイングと考えるなど、ネットワーク/国独自の料金をチェック、

を、携帯電話番号のタイプ(例えばCDMA)をチェックさらなる参照のためにすべての番号にユニークなIDを割り当てる必要データベースとcronを使用して毎分バッチで約5kを送信しますが、多くのメッセージがある場合は時間がかかります。私の他の選択肢は何ですか?

XAMPPサーバーでCodeigniter 2を使用しています。

答えて

36

私は2つのスクリプト記述します。あなたが追加する必要がありそうならば、私は、これらの数字は、データベース内にあると仮定してい

set_time_limit(0);     // ignore php timeout 
ignore_user_abort(true);    // keep on going even if user pulls the plug* 
while(ob_get_level())ob_end_clean(); // remove output buffers 
ob_implicit_flush(true);    // output stuff directly 
// * This absolutely depends on whether you want the user to stop the process 
// or not. For example: You might create a stop button in index.php like so: 
//  <a href="javascript:window.frames[0].location='';">Stop!</a> 
//  <a href="javascript:window.frames[0].location='job.php';">Start</a> 
// But of course, you will need that line of code commented out for this feature to work. 

function progress($percent){ 
    echo '<script type="text/javascript">parent.progress('.$percent.');</script>'; 
} 

$total=count($mobiles); 
echo '<!DOCTYPE html><html><head></head><body>'; // webkit hotfix 
foreach($mobiles as $i=>$mobile){ 
    // send sms 
    progress($i/$total*100); 
} 
progress(100); 
echo '</body></html>'; // webkit hotfix 
+2

素晴らしい答えは、ありがとうございました。 //ユーザーがプラグをプルしても続行する(非常に面白い) – elf1984

+0

@ChristianこのソリューションはFireFoxとIEではうまく機能するが、Chromeはフリーズしている。 – elf1984

+1

Safari Webkit(din Chromeも使用)は、PHPの進捗機能に問題があります。私は修正を見つけた、私はあなたとそれに戻ってくるだろう... **編集:**固定。 – Christian

1

ファイルindex.php

<iframe src="job.php" frameborder="0" scrolling="no" width="1" height="1"></iframe> 
<script type="text/javascript"> 
    function progress(percent){ 
     document.getElementById('done').innerHTML=percent+'%'; 
    } 
</script><div id="done">0%</div> 

ファイルjob.phpを新しい列はisSent(またはあなたが気に入っているもの)です。

入力した次の段落は、キューに入れられ、必要に応じていつでも夜間/週単位で実行する必要があります。特定の理由がある場合を除き、必要に応じて大量に行うべきではありません。 dbに列を追加して最後にチェックされた日時を確認することもできます。したがって、少なくともX日後に番号がチェックされていない場合は、必要に応じてその番号のチェックを実行できます。

データの処理はまだ、携帯電話番号のタイプ(例えばCDMA)をチェックさらなる参照のためにすべての番号に固有のIDを割り当て、ネットワーク/国独自の料金のチェックなど

しかし、その関係一度に50,000の数字に対してこれを行う方法の同じ問題に戻ります。あなたはcronジョブについて言及して以来、私はあなたがあなたのサーバーへのSSHアクセスを持っていると仮定しています。つまり、ブラウザは必要ありません。

私の推薦は毎回1,000の数字を処理することである/home/username/example.com/myscript.php

は/ usr/bin/php:これらのcronジョブは、次のようなコマンドラインを介して実行することができますcronを使用して10分後にこれにかかる時間を計測し、それをDBに保存します。あなたはcronジョブを使用しているので、時間が敏感なSMSメッセージのように見えないので、それらを広げることができます。このスクリプトが50回(50 * 1000 = 50k)実行されるのにどれくらいの時間がかかるか分かったら、cronジョブを更新してより頻繁に/より少なく実行することができます。

$time_start = microtime(true); 
set_time_limit(0); 

function doSendSMS($phoneNum, $msg, $blah); 

$time_end = microtime(true); 
$time = $time_end - $time_start; 
saveTimeRequiredToSendMessagesInDB($time); 

また、あなたはをset_time_limit(0)、これはデフォルトの30秒後にタイムアウトしないようにPHPを教えてくれます気づいたかもしれません。 PHP.iniファイルを変更できる場合は、このコード行を入力する必要はありません。 PHP.iniファイルを編集することができたとしても、他のページのタイムアウトが発生する可能性があるので、この機能を変更しないことをお勧めします。

http://php.net/manual/en/function.set-time-limit.php

0

cronジョブが最善の策だろう現時点で、あなたの唯一の問題は、ブラウザのタイムアウトであれば、それはもはやブラウザでそれを行うよりもかかるだろう、なぜ、私は表示されません。

もしあなたがブラウザを介してそれをすることを強くお勧めするならば、他の解決策は、例えば1000というバッチでそれを行い、同じスクリプトにリダイレクトしますが、$ _GET変数で最後に何が起きたかを参照します。

1

これが一度限りの状況でない場合は、エンジニアリングをより良いソリューションと考えてください。

基本的には、ブラウザにバインドされたプロセスが書き込むことができるキューがあり、1-Nワーカープロセスが読み書きできるキューがあります。

キューに作業を置くことは、かなり安価でなければなりません。おそらくSQL RDBMSへの簡単なINSERT文の束です。

次に、キューから読み込んで処理するデーモンまたは複数のサーバーに分散された2つの(または100個の、複数のサーバーに分散された)ここでは注意して、同じ作業をしている2人の労働者を避けたいと思いますが、それはコード化するのが難しくありません。

あなたのブラウザに依存するワークフローは次のとおりです:いくつかのボタンをクリックすると、キューに追加された一連の「待ち行列ステータス」インターフェースにリダイレクトされます。 。

このようなシステムは、水平方向に非常に簡単にスケール調整することができます。

EDIT:ブラウザが両側を駆動終わる以外クリスチャンSciberras'答えは、この方向で起こっている(それがキューに追加し、その後、ワーカープロセスを駆動する)

関連する問題