Я работаю со платежным шлюзом, который отправляет мне уведомления с помощью URL-адреса обратного вызова всякий раз, когда пользователь совершает платеж.
Дело в том, что шлюз ожидает, что вы будете обрабатывать HTTP-запросы как независимые (получая много уведомлений) должно вызывать то же самое, что и получение только одного), и иногда они отправляют 2 уведомления в одну и ту же секунду.
Я храню идентификатор уведомления в переходном процессе WordPress, чтобы знать, когда я получил дубликаты уведомлений, и игнорирую однако, им кажется, что WordPress не может сохранить переходный процесс достаточно быстро, и, поскольку 2 запроса обрабатываются параллельно 2 PHP экземплярами, иногда проверка не работает (переходный процесс не сохранен в обоих случаях), поэтому я получаю повторяющиеся результаты.
Есть ли способ кратковременно заблокировать таблицу переходных процессов? Как я могу решить это условие гонки? Я думал о том, чтобы просто добавить случайное время сна, чтобы было меньше шансов на то, что возникнет состояние гонки, но это выглядит крайне хакерским.
Пример кода
//Returns true if this notification has been recived before, else returns false
//PROBLEM:If called by 2 separate php instances at the same time with the same payment it will return false both times
function checkIfPaymentProcessed($payment){
$paymentId = $payment->id;
$paymentProcessed = get_transient($payment);
//I have seen this payment before! return true
if ($paymentProcessed === true) {
return true;
}
//This one is new!, return false!
if (paymentProcessed==false) {
set_transient($paymentId, $payment->status, 7 * DAY_IN_SECONDS);
Pago::logDePagos("payment with Id " . $paymentId . " has not been processed yet, processing...");
return false;
}
}