我正在面向对象设计中编写Web应用程序。此应用程序将经常与数据库进行交互。一些常规操作正在验证用户对所请求的功能/方法的ACL权限,执行某些功能等。简而言之,数据库将被大量使用。所以我的问题是,如果我使用OOP开发我的应用程序,并声明将用于设置输入的类级别变量,并且如果有来自另一个用户的任何并行或并发请求,输入数据是否会输入被改变了吗?
我是否必须单独执行某些操作以确保应用程序是多线程的,并且在进程未完成之前输入的内容不会更改?
例如:
class myProces{
var $input1;
var $input2;
function process1($ip1, $ip2){
$this->input1 = $ip1;
$this->input2 = $ip2;
$this->getDataDB();
}
function getDataDB(){
//do some database activity with the class level variables;
// I would pass the values in the class level variables;
$query = "select column from table where col1 = $this->input1 and col2= $this->input2";
mysql_query($query);
return something;
}
}
现在,如果我有两个用户同时点击我的应用程序,并调用此类中的函数
USER1: $ obj = new myProces(); $ obj->过程1(1,2);
用户2: $ obj = new myProces(); $ obj->过程1(5,6);
现在,如果我有类级别变量,当并发请求进入时,它们是否会更改值? PHP会对多线程进行任何处理吗?我不确定Apache是否可以充当消息队列,其中请求可以排队。
任何人都能解释一下,如果有大量用户的Web应用程序的OOP是好的,还是开发人员必须进行任何类型的多线程?
答案 0 :(得分:0)
有几件事:
每个请求都将使用自己的内存,因此您不必担心背后的并发使用更新变量。
但是,在处理数据库中的数据时必须小心。用户1可以读取某些内容,然后用户2可以读取相同的内容并在用户1完成之前更新它。然后,当用户1更新它时,他可能会意外地覆盖用户2所做的事情。
这些事情可以用事务,锁等处理。同样,它与OOP或多线程无关。
答案 1 :(得分:0)
首先:尝试了解PDO(除非变量之前的VAR,意味着您使用的是PHP4)。
第二:正如konforce和Grossman所说,每个用户都会获得不同的PHP实例。
第三: Java 项目(以及其他)使用静态对象或静态方法时可能会出现此问题。不要在PHP中担心这个问题。
答案 2 :(得分:0)
没有必要担心在PHP方面混淆了什么,但是当你想要更新或插入数据时,让几个用户能够修改相同的数据子集会导致不必要的后果。例如插入重复行或修改同一行。因此,您需要使用SQL命令,例如锁定表或行。
答案 3 :(得分:-1)
这不是一个你不必担心的问题。与Web服务器的每个连接都会生成一个完全独立的PHP解释器实例,并具有完全独立的内存和资源句柄。一个中的对象不会受另一个对象的影响,一个中的数据库连接不会受另一个中的数据库连接的影响。一个进程中的类属性不会被另一个进程中的请求修改。
Web上的许多顶级站点都在Apache和PHP上运行,并且整天同时发生数百个并发请求,并且他们不必编写任何特殊代码来处理它。