我的网站上有一个小PHP函数,基本上可以做三件事:
如果我在我的网站上同时连接了多个尝试访问此特定功能的用户,是否存在并发问题的可能性,例如我们可以在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...
}
答案 0 :(得分:0)
不是PHP。但您可能让用户插入或更新相同的内容。 你必须做到这一点不会发生。
因此,如果您让他们更新用户个人资料,则只有用户才能访问。不会发生碰撞。
但如果他们正在编辑内容管理系统中的内容......他们可以覆盖彼此的编辑内容。然后你必须实现一些锁定机制。
例如(有很多方法......)如果你在保留当前时间和用户的内容上写一个更新。 然后用户锁定内容可能持续10分钟。你应该在前端向用户显示(在这种情况下)10分钟倒计时。还有一个取消按钮来解锁内容......你可能会得到这个想法
如果其他人试图在10分钟内加载内容,则会出错。 “用户xy已经......锁定在xx:xx过期”
希望这有帮助。
答案 1 :(得分:0)
访问您网站的每个用户都在运行专门的PHP流程。所以,你不需要信号量或类似的东西。处理同时访问问题是您的数据库问题。
答案 2 :(得分:0)
通常,根据INSERT
结果决定是UPDATE
还是SELECT
是不安全的,因为并发PHP进程可以INSERT
之后的行执行了你的SELECT
并且没有在表格中看到任何行。
有两种解决方案。第一个解决方案是使用REPLACE
或INSERT ... 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上有UNIQUE
或PRIMARY
密钥:
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')