从内部PHP函数保存数据
我使用PHP库从带有JSON的API中获取数据 在Rolling CURL库文档中,我尝试了以下示例,效果非常好:从内部PHP函数保存数据,php,curl,Php,Curl,我使用PHP库从带有JSON的API中获取数据 在Rolling CURL库文档中,我尝试了以下示例,效果非常好: $rollingCurl = new \RollingCurl\RollingCurl(); $rollingCurl ->get('https://www.google.com') ->get('http://www.msn.com') ->setCallback(function(\RollingCurl\Request $reques
$rollingCurl = new \RollingCurl\RollingCurl();
$rollingCurl
->get('https://www.google.com')
->get('http://www.msn.com')
->setCallback(function(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) {
// parsing html with regex is evil (http://bit.ly/3x9sQX), but this is just a demo
if (preg_match("#<title>(.*)</title>#i", $request->getResponseText(), $out)) {
$title = $out[1];
}
else {
$title = '[No Title Tag Found]';
}
echo "Fetch complete for (" . $request->getUrl() . ") $title " . PHP_EOL;
})
->setSimultaneousLimit(3)
->execute();
所以我的问题是:
我认为在回调闭包中初始化
$data
和使用它应该可以解决您的问题。如果没有此选项,$data
数组仅在闭包的范围内设置(注意声明回调函数时使用(&$data)
):
我喜欢的另一个很好的特性是闭包范围绑定,这只是一个快速且未经测试的示例(如果需要更多信息,请告诉我:):
最后但并非最不重要的一点是,直接在CurlHandler类上构造一个回调,在本例中,这可能是我最喜欢的:
class CurlHandler {
$data = array();
public function processOutput(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) {
$output = json_decode($request->getResponseText());
$this->data[] = $output;
}
public function getData() { return $this->data; }
}
$curlResponseHandler = new CurlHandler();
$rollingCurl = new \RollingCurl\RollingCurl();
$rollingCurl
->get('https://www.myapi.com')
->get('https://www.myapi2.com')
->setCallback(array($curlResponseHandler, 'processOutput'))
->setSimultaneousLimit(3)
->execute();
// Get all your outputs from your CurlHandler class now:
print_r($curlResponseHandler->getData());
最后一个选项假定setCallback()
通常接受可调用项,而不仅仅是Closure
s
希望有帮助,干杯
/** IMPORTANT **/
$data = array();
/***************/
$rollingCurl = new \RollingCurl\RollingCurl();
$rollingCurl
->get('https://www.myapi.com')
->get('https://www.myapi2.com')
->setCallback(function(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) use (&$data) {
$output = json_decode($request->getResponseText());
$data[$x++] = $output;
})
->setSimultaneousLimit(3)
->execute();
// Yes, you can!
print_r($data);
class CurlHandler {
$data = array();
public function processOutput($data) {
// Do something with the data retrieved here
$this->data[] = $data;
}
public function getData() { return $this->data; }
}
$curlResponseHandler = new CurlHandler();
// Your callback to be passed into \RollingCurl\RollingCurl::setCallback()
$closure = function(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) {
$output = json_decode($request->getResponseText());
$this->processOutput($output);
}
// Bind your callback Closure to your CurlHandler scope
// => the scope binding makes $this inside your callback Closure refer to your CurlHandler instance
$closure->bindTo($curlResponseHandler);
$rollingCurl = new \RollingCurl\RollingCurl();
$rollingCurl
->get('https://www.myapi.com')
->get('https://www.myapi2.com')
->setCallback($closure)
->setSimultaneousLimit(3)
->execute();
// Get all your outputs from your CurlHandler class now:
print_r($curlResponseHandler->getData());
class CurlHandler {
$data = array();
public function processOutput(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) {
$output = json_decode($request->getResponseText());
$this->data[] = $output;
}
public function getData() { return $this->data; }
}
$curlResponseHandler = new CurlHandler();
$rollingCurl = new \RollingCurl\RollingCurl();
$rollingCurl
->get('https://www.myapi.com')
->get('https://www.myapi2.com')
->setCallback(array($curlResponseHandler, 'processOutput'))
->setSimultaneousLimit(3)
->execute();
// Get all your outputs from your CurlHandler class now:
print_r($curlResponseHandler->getData());