我正在研究一个连接到外部API的项目。我已经建立了连接,并且已经实现了几个函数来检索数据,一切正常。
以下功能完全可以正常工作,只是它大大降低了我的网站速度(超过25秒)。
这是因为嵌套的foreach循环吗?我该怎么做才能重构代码?
/**
* @param $acti
*/
function getBijeenkomstenFromAct ($acti) {
$acties = array();
foreach ($acti as $act) {
$bijeenkomsten = $this->getBijeenkomstenFromID($act['id']);
if (in_array('Doorlopende activiteit', $act['type'])) {
foreach ($bijeenkomsten as $bijeenkomst) {
$acties[] = array(
'id' => $act['id'],
'Naam' => $act['titel'],
'interval' => $act['interval'],
'activiteit' => $bijeenkomst['activiteit'],
'datum' => $bijeenkomst['datum']
);
}
} else {
$acties[] = array (
'id' => $act['id'],
'type' => $act['type'],
'activiteit' => $act['titel'],
'interval' => $act['interval'],
'dag' => $act['dag'],
'starttijd' => $act['starttijd'],
'eindtijd' => $act['eindtijd']
);
}
}
return $acties;
}
函数“ getBijeenkomstenfromID”可以正常工作,并且它本身并不慢。只是要确定,这是函数:
/**
* @param $activitieitID
*
* @return mixed
*
*/
public function getBijeenkomstenFromID($activitieitID) {
$options = array(
//'datumVan' => date('Y-m-d'),
'activiteit' => array (
'activiteit' => $activitieitID
),
'limit' => 5,
'datumVan' => date(("Y-m-d"))
);
$bijeenkomsten = $this->webservice->activiteitBijeenkomstOverzicht($this->api_key, $options);
return $bijeenkomsten;
}
答案 0 :(得分:2)
似乎您是在第一个foreach循环中调用API,效率不高。
每次您这样做:
$bijeenkomsten = $this->getBijeenkomstenFromID($act['id']);
您要在脚本中添加很多“停滞”时间,因为必须忍受网络延迟,这是允许API实际完成工作并将其传输回给您的时间。即使这可能很快(比如说总共100毫秒),但是如果您的第一个foreach循环迭代了100次,则您已经累积了10秒的等待时间,而这是 getBijeenkomstenFromAct($ acti)进行任何实际操作之前处理。
此处的最佳做法是在可能的情况下将其拆分。我的建议:
使 getBijeenkomstenFromID($ activitieitID)可以针对需要在API中查找的所有ID单独异步运行。此处的关键是使其作为单独的进程运行,然后将其构造的数组传递给 getBijeenkomstenFromAct ,以便它可以快乐地循环和处理。
所以是的,基本上我建议您为提高效率而向后编排流程
答案 1 :(得分:2)
查看 curl_multi :http://php.net/manual/en/function.curl-multi-exec.php
它将使您异步调用外部API并一次处理所有返回。请注意,API通常在异步调用上有其自身的局限性,并且常识表明您可能不应该对网站进行200次单独的调用。但是,如果您的调用次数少于一两次,并且API允许,那么curl_multi会做的很好。