2011-01-02 13 views
3

処理のために別のスクリプトにデータを渡すログインスクリプトがあります。処理はログインスクリプトとは無関係ですが、内部分析のためのデータチェックとロギングは少しあります。cURL応答を無視しますか?

私はこのデータを渡すのにcURLを使用していますが、cURLは応答を待っています。回答が完了する前にユーザーがログインする前に待つ必要があるため、応答を待つ必要はありません。

私はリクエストが失敗する可能性はあるが、あまり心配していないことを認識しています。

私は基本的に、cURLがプロセスをフォークするために使用されているマルチスレッドアプリケーションのように機能するようにします。これを行う方法はありますか?

私のコードは以下の通りです:それがないすべてのthats

// Log user in 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,'http://site.com/userdata.php?e=' . $email); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$html = curl_exec($ch); 
curl_close($ch); 

// Redirect user to their home page 

。しかし、現時点では、cURLリクエストが応答を待つ必要があります。

リクエストを送信して応答を待つ方法はありますか?

+1

これにカールを使用する必要がありますか? 'userdata.php'は同じサーバで動作していますか?そうであれば、代わりにPHPのコマンドラインでバックグラウンドのPHPプロセスを呼び出す方がよいでしょうか? –

+1

私のホスティングプロバイダはexec()を許可していません。 –

答えて

4

これにはカールは必要ありません。ソケットを開いて手動のHTTPリクエストを起動し、ソケットを閉じるだけです。これは、カスタムユーザエージェントを使用してロギングを歪ませないためにも便利です。

たとえば、this answerを参照してください。

明らかに、それは「真の」非同期/フォークではありませんが、十分速くなければなりません。

2

私はあなたが A)だけで大幅に高速であるヘッド要求(CURLOPT_NOBODYが)(無応答体) または b)はちょうどたrequesttime限度を下に設定してください可能性があなたの要求をスピードアップするために、マットの考えに一番好きしかし、私はあなたがリクエストの中絶がほんのちょうど見出しよりも速いかどうかテストしなければならないと思います。

0

別の可能性:すぐに分析を行う必要はないと思われます。あなたのプロバイダがcronジョブを許可している場合は、curlコールを実行するスクリプトに、渡されたデータをデータベースまたはファイルにすばやく保存させ、cronジョブで1分または1時間または1日に1回処理スクリプトを実行させます。または、それができない場合は、自分のローカルマシンを設定して、格納されたデータを処理するリモートスクリプトを呼び出すスクリプトを定期的に実行します。

0

あなたが描いているのはキューです。あなたはオフライン処理ジョブの束を開始し、ユーザーのやりとりとは独立して処理したいと考えています。私は特にbeanstalkdをPHPでpheanstalkを使用してお勧めしますが、そのためのシステムはたくさんあります。 cronジョブよりもはるかに信頼性が高く制御可能(例えば、失敗の場合の再試行を管理する)であり、複数のサーバに処理を分散することも非常に簡単です。

あなたの呼び出し元のURLと同じで、応答を無視すると、 'チューブ'で新しいジョブが作成されます。それはあなたの特定の問題を解決します。なぜなら、それは多かれ少なかれ瞬時に戻り、話すべき応答主体がないからです。

処理終了時に、キューからジョブを要求して処理する無限ループでCLIスクリプトをexec実行する必要はありません。

また、ZeroMQを見ることもできます。

は全体的にこれはそれだけでこの動作モードのために特別に設計されていますシステムを使っている、GZippが示唆するものとは異なるではありません。

あなたは他のソフトウェアを実行させません、新しいISPを見つけるために時間がかかるかもしれない制限ISPを持っている場合 - アマゾンAWSは、あなたの年のための無料EC2マイクロインスタンスを提供します。

関連する問題