2011-02-03 13 views
1

私はいくつかの問題を引き起こし、一般的に信頼性が高くない信頼できるメールシステムを構築しようとしています。大規模なリクエストにcURLを使用する

私は現在、PEAR mail_queueを使用してMySQLデータベースに送信するメールと、PEARとcronジョブを使用してメールを送信するためのメールを追加するために、いくつかのPHPスクリプトを設定した専用サーバーを用意しています。これはすべてうまくいく。

私は苦労しているビットは、ニュースレターが送られているサイトを停止せずにデータベースを埋めることです。

ニュースレターは、共有サーバーで保持されているサイトのバックエンドの管理パネルからセットアップされ送信されます。ニュースレターの送信ボタンがクリックされると、cURLリクエストが専用サーバーに送信され、データベースに入力されます。しかし、600人以上の購読者がいるニュースレターを送付すると、サイト全体が停止し、処理が完了するまで返されません。

バックグラウンドで実行するか、非同期的に実行できるcURLやその他の要求をセットアップするにはどうすればよいですか?これが実行さ

$hCurl = curl_init(); 

$curl_options = array(CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_URL => "http://DOMAIN/PATH/SCRIPT", CURLOPT_POSTFIELDS => "VARIABLE TO SEND"); 

curl_setopt_array($hCurl, $curl_options); 

$sResp = curl_exec($hCurl); 
curl_close($hCurl); 

スクリプトは、有効な電子メールをしていると、ステータスと無効なメールを返すチェックした後mail_queueに加入者を追加します。

はここにいくつかのコードです。 MySQLデータベースに600以上の電子メールを追加するのは、これが大変な作業です。

ご協力いただければ幸いです。

+0

このcURL要求は、メールを送信するリモートスクリプトを開始することになっていますか?とにかく、cURL関数はそれ自身がバックグラウンドプロセスを開始できません。あなたは無人側の仕事を開始するために 'exec(" nohup curl http:// www /& ")'のようなもので運がよいかもしれません。応答のために – mario

+0

ありがとうございます。 cURL要求はdbにメールを送信して送信することです。メールはcronジョブを使用して間隔をあけて送信され、問題の一部であったsmtpサーバーの負荷を軽減します。私はバックグラウンドプロセスに役立つかどうかを調べるためにexec()を調べる必要があります。 – andyface

答えて

0

理論上は、おそらくフォークできますが(CLI以外ではうまくいきませんが)しかし、それがうまくいっても、おそらくそれは価値があるよりも面倒で、Apacheの下で実行している場合はほとんどデバッグできないだろうと考えています。ですから、あなたが渡す必要のあるデータをシリアル化し、ファイルにダンプし、別のPHPスクリプトをexec()で呼び出すと、シリアライズされたデータが処理され、残りの部分が非同期で実行されます。もちろん、スクリプト呼び出しはバックグラウンドでプッシュする必要があり、シリアル化されたデータを含むファイルの名前を渡す必要があります。

粗製のスケルトンは次のようになります。do_the_curly.phpはbasciallyそれの前に付加シリアライズされたデータの読み取りについて少しで、あなたの元のスクリプト内のコードが含まれます

$fname=tempnam("/tmp","curl_"); 
$fp=fopen($fname,'w'); 
fputs($fp,serialize("VARIABLE TO SEND")); 
fclose($fp); 
exec("php do_the_curly.php $fname &"); 

を。

関連する問題