cari

Rumah  >  Soal Jawab  >  teks badan

PHP meminta API secara tidak segerak dan kembali terus selepas kegagalan

Selepas PHP mengendalikan DB, ia akan meminta antara muka API dua perkhidmatan lain. Sekarang ada soalan, jika permintaan gagal, bagaimana untuk melancarkan DB? Kaedah selain daripada melancarkan pangkalan data

淡淡烟草味淡淡烟草味2792 hari yang lalu452

membalas semua(3)saya akan balas

  • 天蓬老师

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

    Secara terang-terang, ia adalah masalah pengaturcaraan Jika ia berdasarkan transaksi, ia boleh:

    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));

    Kelemahannya ialah ia hanya boleh melancarkan semula pangkalan data

    Secara amnya, lebih baik untuk melaksanakan logik buat asal sendiri, yang boleh membuat asal kedua-dua operasi pangkalan data dan operasi API Sangat mudah untuk menggunakan pengecualian

    
    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;
    

    Boleh juga digunakan secara gabungan

    balas
    0
  • 淡淡烟草味

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

    Bukankah DB sekadar pangkalan data?
    Saya tidak pernah menemui soalan berkaitan, jadi saya akan mengambil kebebasan untuk menjawab:
    Adakah mungkin untuk menjana tanda untuk setiap operasi dan meletakkannya dalam cache (atau pelbagai media storan Ini mempunyai tempoh sah langkah tidak dilaksanakan selepas tempoh sah, ia akan digulung semula (operasi logik)

    balas
    0
  • 某草草

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

    (@ο@) Wow~, ia melibatkan masalah perkara yang diedarkan Mari kita lihat bagaimana pakar menyelesaikan pelbagai RPC

    balas
    0
  • Batalbalas