Belgelere geç
PHP

Yeniden denemeler ve idempotency

Neler yeniden denenir, neler bilerek denenmez ve yeniden denenen bir gönderim neden kopya oluşturamaz.

Gönderimler

İstemci her gönderime (emails->send, emails->sendBatch, templates->send ve broadcasts->send) bir Idempotency-Key ekler; bu anahtar çağrı başına bir kez oe- ve rastgele bir UUID olarak üretilir ve o çağrının yeniden denemelerinde yeniden kullanılır. API, herhangi bir şeyi sevk etmeden önce bu anahtarı sahiplenir; böylece bir yeniden deneme ikinci bir ileti göndermek yerine asıl iletiyi yeniden oynatır, bilerek yapılan iki send çağrısı ise yine iki kez gönderir. Bunlar farklı niyetlerdir ve farklı kalırlar.

Bu garantiyi süreçler arasına yaymak için kendi idempotencyKey: değerinizi geçirin; böylece çöküp yeniden çalışan bir iş, gönderimlerini tekrarlamak yerine yeniden oynatır. Bir yeniden oynatma, replayed değeri true olarak ve saklanan iletinin şu anki hâliyle yanıt verir.

idempotency.php
$invoiceId = 'inv_2026_09_4192'; $sent = $client->emails->send([    'from' => '[email protected]',    'to' => '[email protected]',    'subject' => 'Your September invoice',    'text' => 'Invoice attached.',], idempotencyKey: 'invoice:' . $invoiceId); echo $sent['id'], ' ', ($sent['replayed'] ?? false) ? 'replayed' : 'sent', PHP_EOL;

Anahtarı, gönderimi gerekli kılan şeyden türetin. Asla bir saatten değil. Bir anahtarı farklı bir gövdeyle yeniden kullanmak sessizce yeniden oynatılmaz, 422 idempotency_key_reuse ile reddedilir. Bir anahtar harf, rakam, _, ., : ya da - karakterlerinden oluşan 1 ile 255 karakter arasındadır; başka her şey 400 invalid_idempotency_key verir.

Diğer her şey

Her GET yeniden denenir. Bir yazma işlemi yalnızca ikinci bir özdeş isteğin ilkinden farklı bir anlam taşıyamayacağı durumlarda yeniden denenir; bir gönderim de bu koşulu sağlar, çünkü idempotency anahtarı bir tekrarı yeniden oynatmaya dönüştürür.

ÇağrıYeniden denenirNeden
Her GETEvetHiçbir şey değişmez.
emails->send, emails->sendBatch, templates->send, broadcasts->sendEvetBir idempotency anahtarı, tekrarı yeniden oynatmaya dönüştürür.
emails->cancel, emails->reschedule, broadcasts->cancel, forms->pause, forms->resume, threads->restoreEvetAdlandırılmış bir durumun saf biçimde atanması.
threads->update, threads->trashEvetBir etiket ataması. İki kez uygulamak, bir kez uygulamakla aynıdır.
threads->snooze, threads->unsnoozeEvetUyanma anı gövdenin içindedir; varış zamanından türetilmez.
emails->update, labels->update, webhooks->update, settings->update, roles->update, members->update, domains->update, domains->updateAddress, domains->updateAddressForward, contacts->update, audiences->update, keys->update, forms->update, branding->update, threads->updateNote, chats->rename, account->setEmailNotification, account->setPushMuted, appHost->set, workspaces->setActiveEvetAdlandırılmış alanların saf biçimde atanması.
members->grantAddress, members->grantDomain, rules->reorder, threads->reorderNotesEvetBir yetki verme işlemi upsert'tür ve bir sıralama her zaman eksiksiz belirtilir.
templates->publish, forms->publish, imports->startEvetZaten yayımlanmış olanı yayımlamak ya da zaten başlamış bir içe aktarmayı başlatmak onu değiştirmeden döndürür.
templates->preview, templates->render, broadcasts->preview, rules->testEvetYalnızca işler, sayar ya da değerlendirirler; hiçbir şey yazmazlar.
domains->verify, appHost->verify, senders->researchEvetTekrarlanan bir denetim, yapıldığı zaman dışında hiçbir şeyi değiştirmez.
contacts->save, contacts->setAudiences, contacts->removePhoto, contacts->block, contacts->unblock, contacts->deleteMany, keys->revoke, files->revokeLink, files->revokeAllLinks, appHost->delete, account->removePhoto, branding->removeImage, domains->removeLogo, domains->removeLogoCertificate, domains->removeAddressPhoto, account->acceptInvitation, account->declineInvitation, forms->approveSubmission, subscriptions->moveEvetHer biri nihai sonucu belirtir; bu yüzden ikinci bir çağrı, ilkinin bıraktığını bırakır.
audiences->addContact, audiences->addContacts, audiences->removeContacts, audiences->importContacts, suppressions->add, domains->createAddressEvetBir tekrar, ilk çağrının işini zaten yapılmış bulur ve iki kez yapmak yerine bunu bildirir.
contacts->setPhoto, account->setPhoto, branding->uploadImage, domains->setLogo, domains->setLogoCertificate, domains->setAddressPhoto, imports->uploadChunkEvetYeniden gönderilen baytlar, ilk denemenin sakladığının yerini alır.
drafts->create, labels->create, webhooks->create, templates->create, rules->create, roles->create, tempMail->create, files->uploadHayırBir yeniden deneme geriye iki nesne bırakır.
drafts->updateHayırGönderdiğiniz id'yi yeniden kullanmak yerine, her yazmanın sonucundaki id'yi okuyun.
drafts->delete, labels->delete, webhooks->delete, templates->delete, rules->delete, roles->delete, members->remove, members->revokeAddress, tempMail->delete, tempMail->deleteMessageHayırKaybolan bir yanıtın ardından yapılan yeniden deneme, başarılı olmuş bir iş için başarısızlık bildirir.
webhooks->rotateSecretHayırİkinci bir döndürme, ilk denemenin döndürdüğü gizli anahtarı geçersiz kılar.
webhooks->testHayırİkinci bir yapay teslimat gönderirdi.
webhooks->replayDeliveryHayırOlayı alıcınıza ikinci kez gönderirdi.
emails->translate, emails->compose, emails->rewrite, emails->suggestSubjectHayırHer biri model çağrıları harcar; bu yüzden yanıtlanmamış bir istekten sonraki yeniden deneme aynı yanıt için iki kez ödeme yapar.
security->beginStepUp, security->verifyStepUpHayırBir yeniden deneme ikinci bir e-posta gönderebilir ya da kod için ikinci bir denemeyi harcayabilir.
GET olmayan diğer her çağrıHayırBir kez gönderilir; başarısızlık tekrarlanmak yerine bildirilir.

Geri çekilme

  • İstemcideki maxRetries: ile sınırlıdır; varsayılan olarak iki ek denemedir. maxRetries: 0 yeniden denemeleri kapatır.
  • Yalnızca bir ağ hatasının ya da 408, 500, 502, 503 veya 504 yanıtının ardından. Bir 429 yalnızca Retry-After taşıdığında yeniden denenir; bu API böyle bir başlık göndermediğinden, hız sınırı doğrudan hata fırlatır. Diğer tüm durum kodları anında hata fırlatır.
  • Yarım saniyeden sekiz saniyeye kadar üstel, rastgele sapma (jitter) ile: her bekleme, o üst sınırın yarısı ile tamamı arasında rastgele bir noktadır; böylece bir istemci filosu toparlanma anında yeniden senkronize olmaz.
  • Her iki biçimiyle de, delay-seconds ve HTTP-date, Retry-After tarafından ayarlanır. Sunucu bir bekleme süresi belirttiğinde istemci geri çekilme uygulamak yerine tam olarak o kadar bekler.
  • Bir dakikadan uzun bekleme isteyen bir sunucu, istemciye beklemesini değil durmasını söylüyor kabul edilir; bu yüzden istisna, üzerinde retryAfterSeconds ile fırlatılır. Sunucunun istediğinden daha erken geri dönmek bu isteğe uymamak olurdu.
  • Zaman aşımı da diğerleri gibi bir ağ hatasıdır; bu yüzden tekrarlanması güvenli bir çağrı bir zaman aşımından sonra yeniden denenir ve timeout: her denemeye baştan uygulanır.
  • Beklemeler çağrının içindeki sleep ve usleep çağrılarıdır; bu yüzden betik de bekler ve çağrı yalnızca son denemesi bittiğinde döner ya da istisna fırlatır. Bir kişinin beklediği bir web isteğinde timeout: ve maxRetries: değerlerini düşük tutun.