2

基本的に、私のアイデアは、各リクエストが実行されたときにライブ結果を生成する「ライブ cURL 結果」システムを何らかの形で実行することです。たとえば、cURL リクエストを介してアクセスする必要がある Web サイトのリストを含むテーブルを作成します各cURL応答の結果で、AJAX関数を使用してデータをページに送り返す必要があります。最初に、この要求のループを実行するファイルを呼び出しました

<?
    foreach($database['table'] as $row) {
       curl_init($row['url']);
       //the rest of the cURL request etc...

       //SEND cURL RESPONSE BACK TO AJAX AFTER EACH ROW!!!
    }
<?

次に、すべてのスクリプトを一度に返す前に完全なスクリプトが完了するのを待つのではなく、発生したcURL応答ごとに結果を返すようにします。

これは可能ですか?もしそうなら、私はまだ通常のAJAXリクエストを使用しますか?

4

8 に答える 8

5

これはどう?

全体のプロセスを 3 つに分解します

工程1

データベースにアクセスする php ページに ajax リクエストを送信し、URL のリストをブラウザ ページに送り返します。[単に URL をエコーする] [セパレータ '|' を使用する 結果の URL を分離します。]

工程2

上記のプロセスの ajax 成功ハンドラー関数は、以下を実行する新しい JavaScript 関数を呼び出すようになりました。

URLリストを配列に分割します。

プロセス 3 別の ajax 関数を使用して、URL リストを 1 つずつサーバーに送信します。

この方法では、一度に 1 つの URL のみが処理され、処理されるとすぐに結果が返されます。

以下は、JavaScript での関数呼び出しのプロトタイプです。コードは実際のものではありませんが、どのように機能するかについての全体的なアイデアを得ることができます。

function ajaxCall_1()
{
    // get url lsit from server
    .onSuccess{
        process_url(data);
    }
}


function process_url(data){
    var url_array = data.split('|')

    fetch_urls(url_array,0); // sends the first url for processing
}

function fetch_urls(url_array,position){

  if(position < url_array.lenght){ // not exceeding the array count 
    ajax_call2(url_array[position],url_array,position); 
  }
}

function ajaxCall_2(url,url_array,position)
{
    // get url acced by  curl and send back the result
    .onSuccess{
        // do whatever with the data you want
        fetch_urls(url_array,position++) // or position+1 // to fetch the next url
    }
}
于 2013-11-10T05:58:31.587 に答える
1

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 リクエストの結果を保存する必要があり、その場合はプル アプローチではなくプッシュ アプローチを使用する必要があります。

ここで使用した関数の詳細を知るには:

  1. array_push
  2. array_shift
  3. window.setInterval
于 2013-11-12T08:37:07.333 に答える
1

ソケットに書き込んでいる場合を除き、書き込んだメッセージを返すことはできません。PHP スクリプトへの通常の AJAX 呼び出しでは、これは不可能であり、一度だけ応答を記述して返すことができます。

于 2013-11-08T11:51:33.533 に答える
1

あなたの場合、flushまたはを使用できますob_flush。このコマンドは、出力されたデータをブラウザーに強制的に送信しますが、場合によっては中間ソフトウェア (nginx など) で停止できます。

そして、別の問題があります。スクリプトがデータを送信するまで、ページはロードされたイベントを発生させません。非常に多くの js スクリプトが機能しません。

あなたの場合、私は別のシステムを作ります。

  1. crontab から短時間で実行される curl を使用したスクリプト。
  2. curl からのすべての結果はデー​​タベースに保存されます。
  3. Ajax スクリプトは、最後の結果を出力してデータベースから削除する php バックエンドを呼び出します。

これは(ほとんどの場合)どのような場合でも機能します:)

于 2013-11-09T20:59:52.923 に答える
0

PHP スクリプトへの Ajax リクエストの概念は、Ajax 呼び出しを行うと、要求された PHP スクリプトと Ajax によって送信される応答全体が実行されます。

要件に応じて、PHP スクリプトは Ajax 呼び出しへの応答の一部を送信しません。代わりに、PHP スクリプトは cUrl 応答のコレクションを一度に送信できます。

この問題を解決するには、次の手順を実行できます

  1. PHP と Two Ajax 呼び出しで 2 つのアクションを作成します。

  2. テーブルからすべての URl を最初の Ajax 呼び出しに送信する 1 つのアクション。

  3. 最初の応答 (URL のリスト) を取得した後、一連の Ajax 呼び出しを実行できます (フェッチされた URL ごとにループします)。

  4. この Ajax 呼び出しは、cUrl を実行して応答をフェッチする 2 番目の PHP スクリプトを要求します。

  5. 次に、この応答を、開始された Ajax 呼び出しに送り返します。次に、その cUrl 応答でやりたいことを行います。

それがあなたを助けることを願っています。

于 2013-11-08T06:37:56.707 に答える