curl リクエストの結果を 1 つずつ保存し、N秒 (5 秒と仮定) ごとにリクエストを実行することで取得できます。
この部分では、curl リクエストの出力をどこかに保存しています。出力を取得し、関数を呼び出してキューに保存する少し変更されたソース コードを次に示します。
//these two lines will be mostly same for all request
//so i put them out of the loop
curl_init($ch);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//these two lines will be mostly same for all request
//so i put them out of the loop
curl_init($ch);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
foreach($database['table'] as $row) {
// set URL and other appropriate options which
//vaires from request to requeste
curl_setopt($ch, CURLOPT_URL, $row['url']);
//grabbing the output in $output
$output = $curl_exec();
put_it_to_the_queue($output);
}
curl_exec($ch);
今何をput_it_to_the_queue($output)
しますか?出力をどこかに保存して、他のリソースがそこからそれらを取得できるようにします。簡単にするために、それをセッションに入れましょう。
function put_it_to_the_queue($output) {
//Or you can store in sql lite or in a file or somewhere else
array_push($_SESSION['outputs']);
}
問題は、クライアントがこの異なる状況にどのように対処するかです。
クライアントがサーバーに最初の呼び出しを行い、URL のフェッチを開始し、それを完全に忘れさせます。
$.get('start.php');
そして、出力を取得する必要があります。これを達成する方法は?pull.php
キューに何かがある場合に出力を送信する別の php ページを作成します。
echo array_shift($_SESSION['outputs']);
出力を取得するクライアント側のコードは次のとおりです。最初のリクエストをサーバーに送信した後に、このコードを配置します。
//delay is in ms
//5 is the value of N seconds
//we will retrieve the output form
var delay = 5 * 1000;
window.setInterval(function(){
$.get('pull.php',function(response){
//do something with the reponse here
alert(response);
})
}, delay);
ノート
このソリューションは絶対確実ではありません。重いウェブサイトを持っている場合は、より正確なストレージを使用して html リクエストの結果を保存する必要があり、その場合はプル アプローチではなくプッシュ アプローチを使用する必要があります。
ここで使用した関数の詳細を知るには:
- array_push
- array_shift
- window.setInterval