recherche

Maison  >  Questions et réponses  >  le corps du texte

PHP demande l'API de manière asynchrone et revient en arrière directement après un échec

Une fois que PHP a exploité la base de données, il demandera les interfaces API de deux autres services. Il y a maintenant une question : si la requête échoue, comment restaurer la base de données ? Méthodes autres que la restauration de la base de données

淡淡烟草味淡淡烟草味2792 Il y a quelques jours450

répondre à tous(3)je répondrai

  • 天蓬老师

    天蓬老师2017-05-16 13:15:11

    Pour parler franchement, il s'agit d'un problème de programmation. S'il est basé sur des transactions, cela peut être :

    .
    function save_if_success($transaction, $result)
    {
        if ($result) $transaction->commit();
        else $transaction->rollback();
    }
    $db_ret = db();
    save_if_success($transaction, api1($db_ret) && api2($db_ret));

    L'inconvénient est qu'il ne peut restaurer que la base de données

    Il est généralement préférable d'implémenter vous-même la logique d'annulation, qui peut annuler à la fois les opérations de base de données et les opérations de l'API. Il est très pratique d'utiliser des exceptions

    .
    
    function revoke_if_failed($do_func, $do_func_params, $revoke_callback, $revoke_params, $exception) {
        try
        {
            $do_func_ret = call_user_func_array($do_func, $do_func_params);
        }
        catch($exception $e)
        {
            call_user_func_array($revoke_callback, $revoke_params);
            throw;
        }
        return $do_func_ret;
    }
    
    try
    {
        $dbret = db();
        $api1_ret = revoke_if_failed(api1, [$dbret], revoke_db, [$dbret], OperationFailedException::class);
        revoke_if_failed(api2, [$api1_ret], revoke_api1, [$api1_ret], OperationFailedException::class);
    }
    catch (OperationFailedException $e)
    {
        return ERR;
    }
    return SUCCESS;
    

    Peut également être utilisé en combinaison

    répondre
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-16 13:15:11

    La base de données n'est-elle pas simplement une base de données ?
    Je n'ai jamais rencontré de questions connexes, je me permettrai donc de répondre :
    Est-il possible de générer une note pour chaque opération et de la mettre dans le cache (ou divers supports de stockage) Celui-ci a une durée de validité si la suivante. l'étape n'est pas exécutée après la période de validité, elle sera annulée (opération logique)

    .

    répondre
    0
  • 某草草

    某草草2017-05-16 13:15:11

    (@ο@) Wow~, cela implique un problème de choses distribuées. Voyons comment les maîtres résolvent plusieurs RPC

    .

    répondre
    0
  • Annulerrépondre