如何组合PHP中parallelcurl返回的json编码数组
I am trying to implement a soluion I found at this site:
Parallel cURL execution in PHP
however, I have a problem to combine all results and send it to xmlhttprequest to process it. initially xmlhttprequest will call a php script which executes other php scripts in parallel. here is my main php script (called by xmlhttprequest):
//parallelcurl_index.php
$param1 = $_REQUEST['param1'];
$param2 = $_REQUEST['param2'];
require_once('parallelcurl.php');
$url1 = "http://example.com/script1.php?param1=" . $param1 . "¶m2=" . $param2;
$url2 = "http://example.com/script2.php?param1=" . $param1 . "¶m2=" . $param2;
$url3 = "http://example.com/script3.php?param1=" . $param1 . "¶m2=" . $param2;
$url4 = "http://example.com/script4.php?param1=" . $param1 . "¶m2=" . $param2;
$url5 = "http://example.com/script5.php?param1=" . $param1 . "¶m2=" . $param2;
$url6 = "http://example.com/script6.php?param1=" . $param1 . "¶m2=" . $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'
";
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);
}
back at the xmlhttprequest , I can check for all the data returned:
alert(xmlHttp.responseText);
alert() output like this:
{"city":"Muscat","country":"Oman"}{"company":"OTL","Department":"IT"}
I can see there is no coma separator between each json array, hence eval() will fail:
var responseArr = eval('(' + xmlHttp.responseText + ')');
if I run the script for one url only in $parallel_curl->startRequest() and comment the other five it work without any problems. any help will be appreciated.
Hm, I am NOT a fan or parallel curl request (why tie up the webserver, stuff like GearMan is better suited), but if you are going this route:
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();
I've modified the class code:
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());
}
}
now it is working fine, thanks very much for your help.