API создает условия гонки в WordPress - PullRequest
0 голосов
/ 14 января 2020

Я работаю со платежным шлюзом, который отправляет мне уведомления с помощью 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;
    }

}
...