PHP中的简单并发?

时间:2015-01-20 14:00:11

标签: php mysql synchronization

我的网站上有一个小PHP函数,基本上可以做三件事:

  • 检查用户是否已登录
  • 如果是,请检查他是否有权执行此操作(DB Select)
  • 如果是,请执行相关操作(数据库插入/更新)

如果我在我的网站上同时连接了多个尝试访问此特定功能的用户,是否存在并发问题的可能性,例如我们可以在Java中使用?我已经看过一些关于信号量或本机PHP同步的例子,但是它与这种情况有关吗?

我的PHP代码如下:

if ( user is logged ) {
    sql execution : "SELECT....."
    if(sql select give no results){
        sql execution : "INSERT....."
    }else if(sql select give 1 result){
        if(selected column from result is >= 1){
           sql execution : "UPDATE....."
        }
    }else{
        nothing here....
    }
}else{
   nothing important here...
}

3 个答案:

答案 0 :(得分:0)

不是PHP。但您可能让用户插入或更新相同的内容。 你必须做到这一点不会发生。

因此,如果您让他们更新用户个人资料,则只有用户才能访问。不会发生碰撞。

但如果他们正在编辑内容管理系统中的内容......他们可以覆盖彼此的编辑内容。然后你必须实现一些锁定机制。

例如(有很多方法......)如果你在保留当前时间和用户的内容上写一个更新。 然后用户锁定内容可能持续10分钟。你应该在前端向用户显示(在这种情况下)10分钟倒计时。还有一个取消按钮来解锁内容......你可能会得到这个想法

如果其他人试图在10分钟内加载内容,则会出错。 “用户xy已经......锁定在xx:xx过期”

希望这有帮助。

答案 1 :(得分:0)

访问您网站的每个用户都在运行专门的PHP流程。所以,你不需要信号量或类似的东西。处理同时访问问题是您的数据库问题。

答案 2 :(得分:0)

通常,根据INSERT结果决定是UPDATE还是SELECT是不安全的,因为并发PHP进程可以INSERT之后的行执行了你的SELECT并且没有在表格中看到任何行。

有两种解决方案。第一个解决方案是使用REPLACEINSERT ... ON DUPLICATE KEY UPDATE。这两种查询类型是" atomic"从您的脚本的角度来看,并解决大多数情况。 REPLACE尝试插入行,但是如果它遇到重复键,它会使用您提供的值替换冲突的现有行,INSERT ... ON DUPLICATE KEY UPDATE稍微复杂一些,但在类似的情况下使用。请参阅此处的文档:

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

http://dev.mysql.com/doc/refman/5.0/en/replace.html

例如,如果您有一个表product_descriptions,并且想要插入ID = 5且具有特定描述的产品,但是如果已存在ID为5的产品,则需要更新说明,然后你可以执行以下查询(假设ID上有UNIQUEPRIMARY密钥:

REPLACE INTO product_description (ID, description) VALUES(5, 'some description')

如果它尚不存在,它将插入ID为5的新行,或者如果已经存在,则将更新现有ID为5的行,这可能正是您想要的。

如果不是,那么第二个方法是使用锁定,如下所示:

 query('LOCK TABLE users WRITE')
 if (num_rows('SELECT * FROM users WHERE ...')) {
      query('UPDATE users ...');
 }
 else {
      query('INSERT INTO users ...');
 }
 query('UNLOCK TABLES')