Memeriksa email duplikat dalam data respons api
Saya sedang mengerjakan aplikasi internal kecil yang bekerja dengan API eksternal untuk tujuan penyediaan.
Kode pada dasarnya terdiri dari serangkaian formulir di mana pengguna memasukkan data, data ini kemudian dikirim ke API untuk mendaftarkan pelanggan baru.
Ini adalah proses yang agak linier yang akan saya coba jelaskan:
- Pembuatan Kontak: Info pelanggan dasar (email, alamat ...).
- Kreasi Pelanggan: Info lebih lanjut, untuk pelanggan yang akan dibuat harus ada
contactId
milik pelanggan ini. - Pembuatan Pelanggan: Info yang menghubungkan pelanggan ke layanan yang diperoleh. Langkah sebelumnya harus diselesaikan dan
customerId
harus ada. - Pembuatan Layanan: Menyimpan sedikit info lanjutan tentang layanan. Sekali lagi,
suscriberId
harus ada untuk menautkan layanan.
Saya telah mengatur proses yang kurang lebih cepat dengan beberapa penyesuaian di sana-sini, tetapi langkah pertama (Kontak) memiliki metode yang sepertinya tidak dapat saya tingkatkan, yang pada gilirannya menyebabkan proses ini memakan waktu hingga satu menit penuh. !
Seperti seluruh proses yang dijelaskan sebelumnya, pembuatan masing-masing ini juga sangat linier.
Dokumentasi API menyatakan bahwa hasil GET apa pun harus diberi nomor halaman menjadi maksimal 10 entri, tetapi mengikuti ini semakin meningkatkan waktu dari menit ke menit. Eksperimen manual menunjukkan bahwa rasio terbaik adalah sekitar 500 entri per halaman atau dalam beberapa kasus, bahkan seluruh jumlah entri terbukti menjadi cara tercepat daripada 10 kali 10.
Karena email kontak tidak dapat diduplikasi, salah satu hal pertama yang harus dilakukan adalah memeriksa email yang diberikan di formulir dan membandingkannya dengan semua email yang sudah ada yang disimpan.
Untuk menyediakan $page
dan $entries
ke panggilan API, pertama-tama saya harus mengambil jumlah total kontak. Nomor ini muncul saat memanggil API untuk mendapatkan kontak. Jadi metode pertama yang saya gunakan adalah:
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;
}
Sekarang $totalContacts
, saya dapat melanjutkan dan mencari apakah email telah terdaftar, dan ini adalah langkah yang saya curigai bertanggung jawab atas waktu eksekusi yang tinggi. Metode ini mencari kontak dan email mereka, jika tidak menemukan kebetulan, mulai membuat kontak dengan data yang disediakan.
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;
}
}
Seperti yang Anda lihat, ini adalah opsi tercepat yang saya temukan, keduanya membuat seluruh proses memakan waktu 40-an, yang masih terlalu banyak.
Responsnya adalah kode sukses (400, 201 ..), jadi ketika saya ingin melanjutkan ke langkah berikutnya saya perlu, sekali lagi, mencari semua kontak untuk menemukan yang baru saja saya buat dan mendapatkan id. Untungnya, di sini saya dapat langsung melompat ke 20 kontak terakhir (bukan yang terakhir secara langsung sehingga dapat digunakan secara bersamaan tanpa masalah) dan mencari di sana, ini membuatnya sangat cepat, tetapi untuk email tidak ada lompatan seperti itu, semua entri harus dianalisis.createContact($uri, $dataContact, $auth);
Saya tidak tahu bagaimana membuang waktu di sini, sisa kode terdiri dari mengambil contactId
dan menciptakan pelanggan sehingga tidak banyak yang bisa dilakukan di sana seperti sekarang.
Jika ada di antara Anda yang menganggap perlu untuk melihat sisa halaman, saya akan memperbarui posting.
Sebagai pengingat terakhir, saya telah mencoba secara manual dengan konfigurasi halaman dan entri yang berbeda dan untuk halaman ini, yang tercepat adalah 1 page - All entries
. Saya juga mencoba mengambil for / each loop di luar metode, tetapi tidak berhasil.
Jawaban
The for
loop tidak akan menjadi hambatan dalam lingkaran Anda, tetapi apa yang tampaknya jelas bagi saya adalah bahwa Anda tidak mendapatkan manfaat dari menghitung lebih tinggi dari $repeated = 1
. Ini berarti Anda tidak memerlukan variabel penghitung, Anda sebenarnya memerlukan peristiwa pemutusan pengulangan - dalam kasus ini die()
. Untuk informasi Anda, die()
akan mencetak teks di parameter pertama, jadi menggunakan echo
berlebihan.
for ($i=0; $i < $totalContacts; ++$i) { if ($contactEmail == $customer["_embedded"]["ngcp:customercontacts"][$i]["email"]) {
die('El email utilizado ya ha sido registrado en la base de datos');
}
}
return createContact($uri, $dataContact, $auth);
Atau cara lain, yang saya asumsikan akan lebih lambat (karena array_column()
akan mengumpulkan semua email) adalah desain fungsional ini:
if (in_array($contactEmail, array_column($customer["_embedded"]["ngcp:customercontacts"], "email"))) { die('El email utilizado ya ha sido registrado en la base de datos'); } return createContact($uri, $dataContact, $auth);