0

私はこのサイトで見つけたソリューションを実装しようとしています:

PHPでのcURLの並列実行

ただし、すべての結果を組み合わせてxmlhttprequestに送信して処理するのに問題があります。最初に、xmlhttprequestは他のphpスクリプトを並行して実行するphpスクリプトを呼び出します。これが私のメインのphpスクリプト(xmlhttprequestによって呼び出されます)です:

//parallelcurl_index.php

$param1 = $_REQUEST['param1'];
$param2 = $_REQUEST['param2'];


require_once('parallelcurl.php');

$url1 = "http://example.com/script1.php?param1=" . $param1 . "&param2=" . $param2;
$url2 = "http://example.com/script2.php?param1=" . $param1 . "&param2=" . $param2;
$url3 = "http://example.com/script3.php?param1=" . $param1 . "&param2=" . $param2;
$url4 = "http://example.com/script4.php?param1=" . $param1 . "&param2=" . $param2;
$url5 = "http://example.com/script5.php?param1=" . $param1 . "&param2=" . $param2;
$url6 = "http://example.com/script6.php?param1=" . $param1 . "&param2=" . $param2;
/* 
 each of the above urls will execute one or more oracle sql queries and procedures and store the results in array which 
 will be sent to this script.
 example $url1 will send results like this:

$url1_response = array('city' => $city, 'country' => $country);
echo json_encode($url1_response); 

*/

$max_requests = 10;

$curl_options = array(
    CURLOPT_SSL_VERIFYPEER => FALSE,
    CURLOPT_SSL_VERIFYHOST => FALSE
);

$parallel_curl = new ParallelCurl($max_requests, $curl_options);

// Start 6 parallel requests. All three will be started simultaneously.
$parallel_curl->startRequest($url1, 'on_request_done');
$parallel_curl->startRequest($url2, 'on_request_done');
$parallel_curl->startRequest($url3, 'on_request_done');
$parallel_curl->startRequest($url4, 'on_request_done');
$parallel_curl->startRequest($url5, 'on_request_done');
$parallel_curl->startRequest($url6, 'on_request_done');

$parallel_curl->finishAllRequests();


// This function gets called back for each request that completes
function on_request_done($content, $url, $ch, $search) {
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if ($httpcode !== 200) {
        print "Fetch error $httpcode for '$url'\n";
        return;
    }

    $responseobject = json_decode($content, true);

     // I tried this, to combine the arrays but did not work:
     //$segments = array();
     //$segments = array_merge($responseobject, $segments);
     //echo json_encode($segments);


    // send results from all above scripts to xmlhttprequest 
    echo json_encode($responseobject); 

}

xmlhttprequestに戻ると、返されたすべてのデータを確認できます。

alert(xmlHttp.responseText);                  

次のようなalert()出力:

{"city":"Muscat","country":"Oman"}{"company":"OTL","Department":"IT"}

各json配列の間にコマ区切り文字がないことがわかります。したがって、eval()は失敗します。

 var  responseArr = eval('(' + xmlHttp.responseText + ')');

$ parallel_curl-> startRequest()で1つのURLに対してのみスクリプトを実行し、他の5つにコメントを付けると、問題なく機能します。どんな助けでもありがたいです。

4

2 に答える 2

2

うーん、私はファンやパラレルカールリクエストではありません(なぜウェブサーバーを拘束するのか、GearManのようなものがより適しています)が、このルートを使用する場合:

class ReturnCollector {
   private $data = array();
   function addData($content){
      $this->data[] = json_decode($content, true);
   }
   function getData(){
      return $this->data);
   }
   function outputData(){
      echo json_encode($this->getData());
   }
}


$collector = new ReturnCollector();
$parallel_curl->startRequest($url1, array($collector,'addData'));
$parallel_curl->startRequest($url2, array($collector,'addData'));
$parallel_curl->startRequest($url3, array($collector,'addData'));
//etc...
$parallel_curl->finishAllRequests();
$collector->outputData();
于 2012-06-11T21:31:29.487 に答える
0

クラスコードを変更しました:

class ReturnCollector {
    private $data     = array();
    private $tmpArr   = array();
    function addData($content){
        $this->tmpArr   = json_decode($content, true);
        $this->data = array_merge($this->tmpArr, $this->data);
    }
    function getData(){
        return $this->data;
    }
    function outputData(){
        echo json_encode($this->getData());
    }
}

今では正常に動作しています。ご協力いただきありがとうございます。

于 2012-06-12T08:16:45.370 に答える