在之前的文章《PHP高并发情形下怎么防止商品库存超卖》中,我们讲到了关于在高并发情况下防止商品库存超卖的相关问题,下面我们一起来看一下防止库存超卖之并发测试的相关内容,希望对大家有帮助。
千万级数据并发如何处理?进入学习
本文是基于《PHP高并发情形下怎么防止商品库存超卖》的测试案例。推荐学习:《PHP学习教程》
一、 普通下单
并发测试时 product 表 id =1 name = 稻花香大米 store = 15
请求总数30 每次10个并发
ab -n 30 -c 10 http://xxxxx.top/code/the_limit/add_order.php
结果:
有 15 次库存减少成功 store 库存出现了负数 -7 8 次判断为库存不够 (库存负数是不正确的 不允许的)
二、unsigned 模式
调整回 product 表 id =1 name = 稻花香大米 store = 15
请求总数30 每次10个并发
ab -n 30 -c 10 http://xxxxx.top/code/the_limit/unsigned.php
结果:
有 15 次库存减少成功 store 库存出现了负数 -6 9 次判断为库存不够 (库存负数是不正确的 不允许的)
仅在查询语句上 加 for update 加锁效果不大
三、mysql 的事务,锁住操作的行
调整回 product 表 id =1 name = 稻花香大米 store = 15
请求总数30 每次10个并发
ab -n 30 -c 10 http://xxxxx.top/code/the_limit/ACID.php
结果:
有 15 次库存减少成功 store 库存未出现负数 15 次判断为库存不够 (库存负数是不正确的 不允许的)
加事务 效果不错 ab -n 3000 -c 1000 并发也能扛住
四、 非阻塞的文件排他锁
-
阻塞形式
-
非阻塞形式
效果也没有出现负数 但性能上:事务 > 阻塞 > 非阻塞
五、 redis 队列
代码与之前 略有调整 乐观锁版
<?php
$redis =new Redis();
$redis->connect(;127.0.0.1;, 6379);
$redis->auth(;PASSWORD;);
$redis->watch(;sales;);//乐观锁 监视作用 set() 初始值0
$sales = $redis->get(;sales;);
//var_dump($sales); exit;
db();
global $con;
// 查询商品信息
//$product_id = 1;
//$sql = ;select * from products where id={$product_id};;
//$result = mysqli_query($con, $sql);
//$row = mysqli_fetch_assoc($result);
//$store = $row[;store;];
// 库存
$n = 15;
if ($sales >= $n) {
insertLog(;库存为0 秒杀失败;);
exit(;秒杀结束;);
}
//redis开启事务
$redis->multi();
$redis->incr(;sales;); //将 key 中储存的数字值增一 ,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
$res = $redis->exec(); //成功1 失败0
if ($res) {
//秒杀成功
$con = new mysqli(;localhost;,;root;,;PASSWORD;,;dev;);
if (!$con) {
echo ;数据库连接失败;;
}
$product_id = 1;// 商品ID
$buy_num = 1;// 购买数量
sleep(1);
$sql = ;update products set store=store-{$buy_num} where id={$product_id};;
if (mysqli_query($con, $sql)) {
echo ;秒杀完成;;
insertLog(;恭喜 秒杀成功;);
}
} else {
insertLog(;抱歉 秒杀失败;);
exit(;抢购失败;);
}
function db()
{
global $con;
$con = new mysqli(;localhost;,;root;,;WOrd1234.*;,;dev;);
if (!$con) {
echo ;数据库连接失败;;
}
}
/**
* 记录日志
*/
function insertLog($content)
{
global $con;
$sql = ;INSERT INTO `order_log` (content) values(;$content;);;
mysqli_query($con, $sql);
}ab -n 30 -c 10 http://xxxxxx.top/code/the_limit/optimistic\ _redis_lock.php
最终结论 并发挑战 优先 redis 性能好
PHP中mysql_connect()函数不支持怎么办
原创2022-04-06 15:36:031218 + php学习QQ群:609135716
方法:1、打开“php.ini”文件;2、搜索“pdo_mysql”和“curl”,将“;extension=php_curl.dll”和“;extension=pdo_mysql.dll”前面的“;”删除;3、重启apache服务器即可。
千万级数据并发如何处理?进入学习
本教程操作环境:windows10系统、mysql8.0.22版本、Dell G3电脑。
PHP中mysql_connect()函数不支持怎么办
mysql_connect()函数是一个php与mysql数据库连接函数,如果你的php不支持mysql_connect()函数就是你的数据库不能与mysql连接了,下面我来总结一下解决mysql_connect()不能使用的方法。
mysql_connect()不支持的原因是php的扩展没有配置好
mysql_connect()不支持的解决方法:
1、打开php.ini文件:
2、搜索pdo_mysql和curl
;extension=php_curl.dll
;extension=pdo_mysql.dll
然后把2者前面的;去掉;
在系统的 system32(C:/windows/system32)目录下缺少libmysql.dll文件,解决方法是找到php目录下的libmysql.dll,并将libmysql.dll复制到C:/ windows/system32目录中,然后重新启动Web服务。
在C:/windows目录下的php.ini文件中,没有将“;extension=php_mysql.dll”中的前面一个“;”去掉,所以不能使用相应功能,解决方法是打开php.ini文件找到;extension=php_mysql.dll 改成
extension=php_mysql.dll //去掉前面的;使之生效
3、再重启iis或者apache服务器。
推荐学习:mysql视频教程
以上就是PHP中mysql_connect()函数不支持怎么办的详细内容,更多请关注钦钦技术栈其它相关文章!
转载至:php中文网【www.php.cn】
版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/24414/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。