我最近将我的laravel应用程序与salesforce API链接。我的测试销售人员账户中大约有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;
}
Wireshark
我记录了加载时间,加载页面大约需要25秒,这只是简单的数据。
cURL信息
这是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
]
为了改进这一点,我应该研究什么?
我现在愿意接受任何建议。
问题不在于curl,而在于您正在为要检索的每个资源(患者)发出单独的HTTP请求。在评论中,您表示无法索引或列出所有患者。我觉得这很奇怪,因为这是一个标准的REST操作,Salesforce是一个非常流行的软件。您应该进一步查看文档,或者联系Salesforce以确保情况确实如此。
如果你确实无法为所有患者编制索引,并且需要提出单独的请求,那么你就无法加快API的使用速度,因此你必须研究其他方法。您可以做的一件事是使用Scheduled Tasks在后台每x
分钟/小时/天更新一次数据库,本质上是创建Salesforce患者的本地缓存。这样,当您的用户访问您的应用程序时就不会有延迟,并且您可以在后台更新数据库,无论您需要多么频繁。
只需将患者的额外字段添加到原始查询中,例如SELECT Id,Name,foo__c FROM Patients__c
,就可以放弃所有循环和卷曲。