我最近将我的laravel应用与salesforce API相关联。 我的测试salesforce帐户中有大约146名患者。我注意到卷曲是永远的。我不确定是因为我的卷发做错了什么。
public static function patients(){
try {
$records = Salesforce::query('SELECT Id FROM Patients__c')->records;
if(is_array($records)){
$data = [];
$session_id = Salesforce::getSessionID();
foreach ($records as $i=>$record) {
$id = $record->Id;
$url = 'https://na3.salesforce.com/services/data/v37.0/sobjects/Patients__c/'.$id;
$ch = curl_init();
$timeout = 1;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Authorization: Bearer ".$session_id));
$result = curl_exec($ch);
curl_close($ch);
$result = json_decode($result, true);
$data[$i] = $result;
}
}else{
return $data;
}
} catch (Exception $e) {
Log::error($e->getMessage());
die($e->getMessage() . $e->getTraceAsString());
}
return $data;
}
我捕获加载时间,加载页面大约需要25秒,而这只是简单的数据。
这是我的foreach循环的第一个对象的结果。
array:26 [▼
"url" => "https://na3.salesforce.com/services/data/v36.0/sobjects/Patients__c/a005000000f0M3YAAU -H "Authorization: Bearer ******""
"content_type" => null
"http_code" => 400
"header_size" => 47
"request_size" => 256
"filetime" => -1
"ssl_verify_result" => 0
"redirect_count" => 0
"total_time" => 0.569035
"namelookup_time" => 0.001719
"connect_time" => 0.085617
"pretransfer_time" => 0.26601
"size_upload" => 0.0
"size_download" => 10.0
"speed_download" => 17.0
"speed_upload" => 0.0
"download_content_length" => -1.0
"upload_content_length" => -1.0
"starttransfer_time" => 0.568458
"redirect_time" => 0.0
"redirect_url" => ""
"primary_ip" => "136.147.43.333"
"certinfo" => []
"primary_port" => 443
"local_ip" => "10.20.100.333"
"local_port" => 59777
]
为了改善这一点,我应该考虑什么?
我现在正在接受任何建议。
答案 0 :(得分:1)
问题不在于卷曲,而在于您要为要检索的每个资源(患者)制作单独的 HTTP请求。在评论中,您声明无法索引或列出所有患者。我觉得这很奇怪,因为它是一个标准的REST操作,Salesforce是非常受欢迎的软件。您应该进一步查看文档,或者联系Salesforce以确保是这种情况。
如果您确实无法为所有患者编制索引并且需要提出个别请求,那么您无法做很多事情来加快API的使用,因此您必须研究其他方法。您可以做的一件事是使用Scheduled Tasks每隔x
分钟/小时/天在后台更新您的数据库,从根本上创建Salesforce患者的本地缓存。这样,当您的用户访问您的应用程序时,就没有延迟,您可以在后台更新数据库,但需要经常更新。
答案 1 :(得分:1)
只需将患者需要的额外字段添加到原始查询中,例如SELECT Id,Name,foo__c FROM Patients__c
然后你可以放弃所有的循环和卷曲。