2015-11-09 18:42:59 2733次浏览 2条回答 0 悬赏 100 金钱

想請問 我用 ab.exe 測試我的API
API 功能描述 : 這項活動只能新增10筆訂單
於是我使用 sql 抓取活動範圍並 count($order::find()->where('xxx')->all())
看是幾筆

if(count($active) >= 10){
    exit;
    當活動次數達10筆時,停止操作
}

$order = new Order();
$order->xxxx = 'xxx';
$order->save();

我單次單次執行 API 是可行的當執行10次時 因為新增10筆就會停止動作
但是我用 ab 測試時 一次傳送20筆 他就會跳過~我所限定的新增次數範圍
因為是同一時間傳送了20筆 資料庫無法抓到比數

是有看過 PHP synchronized 同步的範例 但資訊真的很少完全沒有頭緒
想請問大家有甚麼辦法能解決此類的問題
能否 PO 點 example 讓我參考或學習....快吐血了

最佳答案

  • 500miles 发布于 2015-11-09 23:39 举报

    这样子可能轻松生成上千订单

    依赖 mysql count订单量, 在并发情况下 是不可靠的.

    除非你加锁, 针对你这种情况, 需要加表级别锁, 还得是WRITE LOCK, 将会引起性能上的极大隐患, 不推荐.

    一个简单易行 比较讨巧的办法 是做一个原子性的自增计数, 来帮你控制10个订单的量.

    你可以用mysql的自增id特性完成, 他内部维护有轻量的自增锁.

    具体做法是: 新建一张表A, 只要一个自增主键即可; 每次请求 都先插入表A一条空数据, 拿到一个自增id, 判断是否大于10即可;

    针对你这个情况, 应该足以应付了.

    当然 如果使用内存db, 比如redis memcache等, 来实现一个自增计数, 或者一个队列, 就更高效了

    4 条回复
    回复于 2015-11-10 00:13 回复

    我這只是舉例 哈哈 基本上可能一次會很多流量近來跑API
    就很麻煩~~ 大哥!! wirte lock 我會看看怎麼使用,不過您說效能不高
    也只能試試看了 我用的是 postgre !! 也有想用 trigger 是實踐但挺難的
    大哥您有用過 pecl synchronized 嗎 我是一直在看文件....頭真疼(沒甚麼頭緒 光是安裝就氣死我啦)
    明天應該會先想辦法試著用 synchronized 試試看 再用您說的方法試試 感謝您感謝您

    回复于 2015-11-10 08:40 回复

    synchronized 印象中, 这个东西好像是java的吧

    回复于 2015-11-10 08:47 回复

    额 查了一下, 原来php pthreads扩展里面也有提供这个. 你指的应该是这个吧?

    回复于 2015-11-10 08:49 回复

    但这玩意和你现在面临的问题毫无关系啊.. 不仅解决不了问题. 还会添油加醋, 变得更不可控....

    觉得很赞
您需要登录后才可以回答。登录 | 立即注册
bryson
副总裁

bryson Taipei

注册时间:2015-07-22
最后登录:2017-04-03
在线时长:84小时54分
  • 粉丝19
  • 金钱4885
  • 威望230
  • 积分8025

热门问题