Как вызвать событие в Laravel, когда ничего не было добавлено в базу данных, вместо того, чтобы получать предупреждения, когда она была обновлена? - PullRequest
2 голосов
/ 05 августа 2020

Я создаю простой аукцион на Laravel. Приведенный ниже код представляет собой некоторый тестовый код извлечения, который, как предполагается, действует как аукционист.

Проблема в том, что когда он работает, он блокирует доступ к таблице Auctionbid Postgres, и пользователи не могут делать ставки во время его работы . Мое тестирование проводится на локальном хосте, на котором несколько пользователей участвуют в аукционе, а также процесс аукциона, все в одном ящике / одном IP <- может усугубить проблему (не уверен). </p>

Я читал все о проблемы с SO о sleep (), обратные стороны опроса и PHP сеансов, а также немного покопались в Websockets , чтобы увидеть, следует ли мне go там. Это также позволило бы мне заменить Pusher.

Однако проблема, которую я вижу, заключается в том, что аукцион - это только время и то, какие события НЕ происходят (если нет ставки в течение 3 секунд, скажите пользователей "Fair Warning"), а реализации Websocket, о которых я читал, похоже, касаются того, какие события происходят.

Вопросы:

  1. Будет ли веб-сокет реализация может быть решением? Кажется, каждая статья, которую я просматривал, посвящена происходящим событиям. Может быть, классы в отрицательном пространстве мешают мне увидеть решение: -)
  2. Проблема в том, что все это запускается на одном ящике / IP? И / Или sleep () - это просто плохой путь для продвижения вперед - как указано по крайней мере в 100 сообщениях SO ...
  3. Какие еще возможные решения позволяют мне проверить, какие события НЕ происходят?
   public function RunTheAuction($auction_item_id, $auction_id)
    {

        set_time_limit(300);

        $options = array(
            'cluster' => env('PUSHER_APP_CLUSTER'),
            'encrypted' => true
        );

        $pusher = new Pusher(
            env('PUSHER_APP_KEY'),
            env('PUSHER_APP_SECRET'),
            env('PUSHER_APP_ID'),
            $options
        );

        $bidIncrementResetCounter = 0;
        $lastBidderId = 0;
        $currentWinnerBidAmount = 0;
        $lastBidderBidAmount = 0;
        $count = 0;
        
        while(true){

            $auctionbid = Auctionbid::select('id', 'bid', 'bid_timestamp', 'auction_bidder_id')
                ->where('auction_item_id', '=', $auction_item_id)
                ->where('auction_id', '=', $auction_id)
                ->orderBy('bid', 'desc')
                ->orderBy('bid_timestamp', 'asc')
                ->first();

            if ($auctionbid) { //there is a bid on the item

                $currentWinnerId = $auctionbid->id;
                $currentWinnerBidAmount = $auctionbid->bid;

                if (($lastBidderId == $currentWinnerId) && ($lastBidderBidAmount == $currentWinnerBidAmount)) {  //it's the same bidder

                    if ($bidIncrementResetCounter == 1) {
                        $message = "Fair Warning!";
                        $pusher->trigger('bids_channel', 'bid-warning', $message);
                    }
                    if ($bidIncrementResetCounter == 2) {
                        $message = "Going once... Going twice...";
                        $pusher->trigger('bids_channel', 'bid-warning', $message);
                    }
                    if ($bidIncrementResetCounter == 3) {
                        $message = "We have a winner!";
                        $pusher->trigger('bids_channel', 'bid-warning', $message);
                        break;
                    }
                    $bidIncrementResetCounter++;
                } else {
                    $bidIncrementResetCounter = 0;
                }
            }
            else{
                $currentWinnerId = 0;
            }

            $lastBidderId = $currentWinnerId;
            $lastBidderBidAmount = $currentWinnerBidAmount;

            sleep(10); //<-----------------------------ISSUE
            $count++;

            if($count == 12){break;}

        } //end loop

    } //end function RunTheAuction
...