Я создаю простой аукцион на Laravel. Приведенный ниже код представляет собой некоторый тестовый код извлечения, который, как предполагается, действует как аукционист.
Проблема в том, что когда он работает, он блокирует доступ к таблице Auctionbid Postgres, и пользователи не могут делать ставки во время его работы . Мое тестирование проводится на локальном хосте, на котором несколько пользователей участвуют в аукционе, а также процесс аукциона, все в одном ящике / одном IP <- может усугубить проблему (не уверен). </p>
Я читал все о проблемы с SO о sleep (), обратные стороны опроса и PHP сеансов, а также немного покопались в Websockets , чтобы увидеть, следует ли мне go там. Это также позволило бы мне заменить Pusher.
Однако проблема, которую я вижу, заключается в том, что аукцион - это только время и то, какие события НЕ происходят (если нет ставки в течение 3 секунд, скажите пользователей "Fair Warning"), а реализации Websocket, о которых я читал, похоже, касаются того, какие события происходят.
Вопросы:
- Будет ли веб-сокет реализация может быть решением? Кажется, каждая статья, которую я просматривал, посвящена происходящим событиям. Может быть, классы в отрицательном пространстве мешают мне увидеть решение: -)
- Проблема в том, что все это запускается на одном ящике / IP? И / Или sleep () - это просто плохой путь для продвижения вперед - как указано по крайней мере в 100 сообщениях SO ...
- Какие еще возможные решения позволяют мне проверить, какие события НЕ происходят?
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