首页 > 解决方案 > 处理大型请求时 PHP 失败

问题描述

我正在使用 PHP 建立一个在线商店,它一次可以处理超过 200,000 个请求,但我的数据库中也有重复的值和负值。

在此处输入图像描述

上面的屏幕截图是检查用户帐户中是否有足够资金的唯一条件。但我在下面得到以下结果

数据库模拟结果

我在这里附上了代码

<?php

require 'db.php';
use Illuminate\Database\Capsule\Manager as DB;

index();

function index()
{
    ini_set('max_execution_time', 3000);
    $members = DB::table("tempcurrentamount")->get();

    $products = DB::table('product')->get();

    $tmp_items = [];

    foreach ($products as $product) {
        array_push($tmp_items, $product->id);
    }

    foreach ($members as $member) {
        // GENERATE RANDOM ITEMS AND QUANTITY
        $items = [];
        $qty = [];

        for ($i=0; $i < 5; $i++) {
            array_push($qty, rand(1,20));
        }

        for ($i=0; $i < 5; $i++) {
            array_push($items, array_rand(array_flip($tmp_items), 1));
        }

        submitRequest($member->id, $qty, $items);
    }
}

function submitRequest($id, $qty, $items)
{
    $user_id = $id;

    $account = DB::table('tempcurrentamount')->where('id', $user_id)->first();

    $date_created= date('Y-m-d');
    $product_id = $items;
    $quantity = $qty;
    $total_amount = 0.0;
    $amount = [];

    // if($user_stage == 0){
    //     return json_encode("SORRY, You can not order for any product in Stage 0.");
    // }

    // Get Amount of each products
    for ($i=0; $i < count($product_id); $i++) { 

            $product_price = DB::table('product')->where('id', $product_id[$i])->first()->price;
            $total_amount += $product_price * $quantity[$i];

        //Store product prices in an array
        array_push($amount, ($product_price / 200));
    }

    // BEGIN TRANSACTION
    echo $id . "Total Amount: " . $total_amount ." Account Balance: ". (($account->foodcash + $account->payoutcash) * 200) . "<br>";

    if ($total_amount < (($account->foodcash + $account->payoutcash) * 200)) {

        processPayment($total_amount, $account, $user_id, $product_id, $date_created, $quantity, $amount);

        echo $id . " Successful<br><br>";     
        return;
    }else{
        echo $id . " Failed Insufficient Balance<br><br>";     
        return;
    }
}

function processPayment($total_amount, $account, $user_id, $product_id, $date_created, $quantity, $amount)
{

    DB::beginTransaction();

    try {

        //Convert Total Amount To The MLM System rate
        $order_amount_in_system_rate = $total_amount / 200;

        //Deduct Amount From table tempcurrentamount
        #===================================================================================
      //Check If Amount is greater than foodcash
        $deductFromPayCash = 0;

        if($order_amount_in_system_rate > $account->foodcash){
            $deductFromPayCash = $order_amount_in_system_rate - $account->foodcash;
        }

      //Perform Deduction
        if($deductFromPayCash > 0 && $account->payoutcash > 0){

            DB::table('tempcurrentamount')
            ->where('id', '=', $user_id)
            ->decrement('foodcash', $account->foodcash);

            DB::table('tempcurrentamount')
            ->where('id', '=', $user_id)
            ->decrement('payoutcash', $deductFromPayCash);
        }else{
            DB::table('tempcurrentamount')
            ->where('id', '=', $user_id)
            ->decrement('foodcash', $order_amount_in_system_rate);
        }
        #===================================================================================

        //If Decrement Fails, ROLLBACK TRANSACTION

        //Add Items to table mlm_foodcollection
        for ($i=0; $i < count($product_id); $i++) {

            //Check if Product is empty  
            if($product_id[$i] == 0){
                continue;
            }

            //Insert Info into mlm_foodcollection table
            DB::table('itemsordered')->insert([
                'user_id' => $user_id,
                'group_leader_id' => rand(1,10),
                'product_id' => $product_id[$i],
                'quantity' => $quantity[$i],
                'amount' => $amount[$i],
                'date_created' => $date_created,
                ]);
        }

        //Log collected item To table mlm_goodscollectionlog
        DB::table('log')->insert([
            'user_id' => $user_id,
            'prev_amount' => $account->foodcash + $account->payoutcash,
            'amount_deducted' => $order_amount_in_system_rate,
            'trans_date' => date('Y-m-d h:i:s'),
            ]);

        // IF NOT QUERY FAILS, COMMIT TRANSACTION
        DB::commit();

        echo $user_id . " Successful<br>";     
        return;

        // all good
    } catch (\Exception $e) {
        DB::rollback();
        echo $user_id . "Something went wrong<br>";     
        return;
    }
}

多谢你们

标签: phpmysqlqueue

解决方案


推荐阅读