第一次问这种问题。我正在开发一个小型内部应用程序,该应用程序可与外部API配合使用以进行供应。
该代码实质上由一系列表格组成,用户在其中输入数据,然后将这些数据发送到API以注册新客户。
这是一个相当线性的过程,我将尝试解释:
contactId
属于该客户。customerId
。suscriberId
才能链接服务。我已经在这里和那里进行了一些调整,从而或多或少地设法完成了一个快速过程,但是第一步(联系)有一种我似乎无法改进的方法,这反过来导致该过程需要花费大量时间。一分钟!
正如前面所述的整个过程,每个步骤的创建也非常线性。
API文档指出,任何GET的结果最多应被分页为10个条目,但此操作将进一步增加分钟的时间。人工实验表明,最佳比例是每页500个条目,或者在某些情况下,甚至是全部条目也被证明是最快的方法,而不是10乘10。
由于无法复制联系人电子邮件,因此要做的第一件事就是检查表单中提供的电子邮件,并将其与所有已存储的现有电子邮件进行比较。
为了向API调用提供$page
和$entries
,我必须首先获取约定的总数。调用API以获得联系人时,将显示此号码。因此,我使用的第一种方法是:
function fetchTotalContacts($uri, $auth){
$ch = curl_init();
$options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_URL => $uri.'?page=1&rows=1',
CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: $auth')
);
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
$response = json_decode($response, true);
$totalContacts = $response['total_count'];
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code != 200) {
echo "Error en fetchTotalContacts() - Código: $http_code | ";
}
curl_close($ch);
return $totalContacts;
}
现在有了$totalContacts
,我可以继续搜索邮件是否已经注册,这是我怀疑这是执行时间长的步骤。此方法搜索联系人及其电子邮件,如果没有发现巧合,则继续使用提供的数据创建联系人。
function checkDuplicatedEmail($uri, $totalContacts, $contactEmailArray, $auth, $contactEmail, $dataContact){
$ch = curl_init();
$options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_URL => $uri.'?page=1&rows='.$totalContacts,
CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: $auth')
);
curl_setopt_array($ch, $options);
$customers = curl_exec($ch);
$customers = json_decode($customers, true);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code != 200) {
echo "Error en checkDuplicatedEmail() - Código: $http_code | ";
}
curl_close($ch);
/*
foreach ($customers['_embedded']['ngcp:customercontacts'] as $customer) {
$email = $customer['email'];
array_push($contactEmailArray, $email);
}
if (in_array($contactEmail, $contactEmailArray)) {
echo('El email utilizado ya ha sido registrado en la base de datos');
die();
}else{
$contactCreated = createContact($uri, $dataContact);
return $contactCreated;
}
*/
$repeated = 0;
for ($i=0; $i < $totalContacts ; $i++) {
if ($contactEmail == $customer["_embedded"]["ngcp:customercontacts"][$i]["email"]) {
$repeated += 1;
}
}
if ($repeated > 0) {
die(echo('El email utilizado ya ha sido registrado en la base de datos'));
}else{
$contactCreated = createContact($uri, $dataContact, $auth);
return $contactCreated;
}
}
如您所见,这些是我找到的最快的选项,都使整个过程花了40秒钟,这仍然太长了。
对createContact($uri, $dataContact, $auth);
的响应是成功代码(400,201 ..),因此,当我想进行下一步时,我确实需要再次搜索所有联系人以找到我刚刚联系的联系人。创建并获取ID。幸运的是,在这里我可以直接跳到最后20个联系人(不是直接跳到最后一个联系人,这样就可以同时使用而不会出现问题)并在那里搜索,这使它变得非常快捷,但是对于电子邮件,没有这样的跳过,所有条目必须进行分析。
我不知道如何在这里浪费时间,其余的代码包括获取contactId
并创建客户,因此现在没有什么可做的。
如果您认为有必要查看该页面的其余部分,我将更新该帖子。
最后提醒一下,我手动尝试了页面和条目的不同配置,对于该页面,最快的是1 page - All entries
。我也尝试过方法外的for / each循环,但无济于事。欢迎提供所有建议,
感谢您提供的帮助!