thinkphp5实现高并发处理
本文最后更新于 1511 天前,其中的信息可能已经有所发展或是发生改变。

什么是并发?

并发,计算机网络术语,是指同时访问服务器站点的连接数。

由于虚拟主机是建立在每台服务器多用户的基础上的,也就是多个用户共同使用一台服务器。为了避免同一台服务器上的某一个用户的IIS链接人数过多或占用服务器资源过多而影响其它用户的正常使用。

所以,目前所有虚拟空间提供商都对单个用户的IIS链接数,流量及服务器进程占用CPU的比率进行了相应的限制。 当某一个用户的站点超出了服务器上的设制后,访问站点时就会出现服务器忙,或目前访问该站点的人数过多,超出了WEB的处理能力等相关错误提示。

简单说

就是在同一秒内,500个用户同时进行操作,服务器执行不过来,这时候就需要并发和锁的处理了
如:500个用户同时购买A商品,这时候需要向数据库请求减少库存并增加订单
那么同时处理的话,数据库肯定处理不过来,有可能A商品的库存只会减少1个
这是很验证的

怎么处理?

我们可以用到事务处理,加锁。

简单说

就是每个用户上一把属于他们的锁,但用户1订单处理完,再处理用户2,如果处理失败就执行回滚

TP5怎么处理?

我们假设一个数据库表为:test,且保证每个用户同时只能插入一条
表中含有字段

字段 说明
id 自增Int(假设用户账户)
age 年龄(假设的数据)

首先,我们先试试下面这个没有结果加锁处理的代码

   public function test()
    {
        Db::startTrans(); // 启动事务
        try {
            $res = db('test')->find();
            if (!$res) {
                //执行你想进行的操作, 最后返回操作结果 result
                Db::name('test')->insert(array('age'=>20));
                $result = true;
                if (!$result) {
                    db('test')->rollback();//回滚
                }
            }
            Db::commit();
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
        }
    }

然后我们用Apache的测压工具AB来执行并发测试
(可以百度搜索:ab并发测试工具)
请求数10,并发数5

ab -n 10 -c 5 http://bf.com/index/index/test

1998890909.png

这时候,数据库多了5条记录
[图片已丢失]
那么我们来试一下加锁
,先把表里的数据清空,然后用下面这个代码

public function test()
    {
        Db::startTrans(); // 启动事务
        try {
            $res = db('test')->lock(true)->where('id', '>', 1)->find();//这里可以自定义
            if (!$res) {
                //执行你想进行的操作, 最后返回操作结果 result
                Db::name('test')->insert(array('age' => 1));
                $result = true;
                if (!$result) {
                    db('test')->rollback();//回滚
                }
            }
            Db::commit();
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
        }
    }

注意,里面的lock就是TP5的锁
然后我们再AB一下
接下来看看数据库

1617607751.png

就一个数据咯
是不是很简单?很好理解?
今天的教程结束
有什么疑问可以评论在下方哦,我每天都会回的

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇