PHP 高併發秒殺解決方案

2021-10-11 01:43:05 字數 1457 閱讀 5918

本文提供 php 高併發秒殺解決方案(附加三個案例說明(普通流程,使用檔案鎖,使用redis訊息佇列))

1:(正常流程,不做任何高併發處理),**如下:

<?php

$_mysqli = new mysqli('localhost','root','','secondkill');

if (mysqli_connect_errno())

$_mysqli->set_charset('utf8');

$_sql = "select stock from goods where id=1";

$_result = $_mysqli->query($_sql);

$_assoc = $_result->fetch_assoc();

if($_assoc['stock']>0)

$_mysqli->close();

?>

2:(使用檔案鎖),**如下:

<?php

$_mysqli = new mysqli('localhost','root','','secondkill');

if (mysqli_connect_errno())

$_mysqli->set_charset('utf8');

$_sql = "select stock from goods where id=2";

$_result = $_mysqli->query($_sql);

$_assoc = $_result->fetch_assoc();

$fp = fopen("lock.txt", "w+");

if(!flock($fp,lock_ex | lock_nb))

if($_assoc['stock']>0)

}fclose($fp);

$_mysqli->close();

?>

3:使用redis 訊息佇列,**如下:

<?php

$redis=new redis();

$result=$redis->connect('127.0.0.1',6379);

$_mysqli = new mysqli('localhost','root','','secondkill');

if (mysqli_connect_errno())

$_mysqli->set_charset('utf8');

/*for($i=1;$i<=100;$i++)

echo $redis->llen('goods_nums');

exit();

*/$check = $redis->lpop('goods_nums');

//echo $check;

if($check) else

?>

php高併發秒殺解決方案

在秒殺 搶火車票等地方,我們通常用遇到這樣高併發的問題,下面提供了四種解決方案 1 使用檔案鎖 php view plain copy fp fopen order.lock r if flock fp,lock ex fclose fp 2 使用訊息佇列 我們常用到memcacheq radis。...

php高併發解決方案

最近在做乙個 專案,遇到個問題,就是在搶購 秒殺 等活動時,庫存數量有限,但是同時下單人數超過了庫存數量,就會導致商品超售問題。那麼我們怎麼來解決這個問題呢,我的思路如下 sql1 查詢商品庫存 if 庫存數量 0 當沒有併發時,上面的流程看起來是如此完美,假設同時兩個人下單,而庫存只有1個了,在s...

php 高併發解決方案

最近在做乙個 專案,遇到個問題,就是在搶購 秒殺 等活動時,庫存數量有限,但是同時下單人數超過了庫存數量,就會導致商品超售問題。那麼我們怎麼來解決這個問題呢,我的思路如下 sql1 查詢商品庫存 if 庫存數量 0 當沒有併發時,上面的流程看起來是如此完美,假設同時兩個人下單,而庫存只有1個了,在s...