我是靠谱客的博主 愤怒吐司,最近开发中收集的这篇文章主要介绍PHP 高并发秒杀解决方案,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文提供 PHP 高并发秒杀解决方案(附加三个案例说明(普通流程,使用文件锁,使用redis消息队列))
 
1:(正常流程,不做任何高并发处理),代码如下:
 

<?php
$_mysqli = new mysqli('localhost','root','','secondkill');
if (mysqli_connect_errno()) {
echo mysqli_connect_error();
exit();
}
$_mysqli->set_charset('utf8');
$_sql = "select stock from goods where id=1";
$_result = $_mysqli->query($_sql);
$_assoc = $_result->fetch_assoc();
if($_assoc['stock']>0){
$_sql = "UPDATE goods SET stock=stock-1 WHERE id=1";
$_mysqli->query($_sql);
}
$_mysqli->close();
?>


2:(使用文件锁),代码如下:
 

<?php
$_mysqli = new mysqli('localhost','root','','secondkill');
if (mysqli_connect_errno()) {
echo mysqli_connect_error();
exit();
}
$_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)){
echo "系统繁忙,请稍后再试";
return;
}
if($_assoc['stock']>0){
$_sql = "UPDATE goods SET stock=stock-1 WHERE id=2";
if($_mysqli->query($_sql)){
flock($fp,LOCK_UN);//释放锁
}
}
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()) {
echo mysqli_connect_error();
exit();
}
$_mysqli->set_charset('utf8');
/*
for($i=1;$i<=100;$i++){
$redis->lpush('goods_nums',$i);
//秒杀开始前,先将库存数量存在队列,配合定时任务,暂定库存为100
}
echo $redis->llen('goods_nums');
exit();
*/
$check = $redis->lpop('goods_nums');
//echo $check;
if($check){
echo "秒杀成功";
$_sql = "UPDATE goods SET stock=stock-1 WHERE id=3";
$_mysqli->query($_sql);
return;
} else {
echo "秒杀失败";
}
?>

转载于:https://www.cnblogs.com/xingxia/p/high_concurrency.html

最后

以上就是愤怒吐司为你收集整理的PHP 高并发秒杀解决方案的全部内容,希望文章能够帮你解决PHP 高并发秒杀解决方案所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部