多线程请求环境中的面向对象编码 - PHP

时间:2011-01-23 02:18:47

标签: php database multithreading queue message-queue

我正在面向对象设计中编写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是好的,还是开发人员必须进行任何类型的多线程?

4 个答案:

答案 0 :(得分:0)

有几件事:

  1. 这与OOP无关。
  2. PHP不支持用户线程
  3. 每个请求都将使用自己的内存,因此您不必担心背后的并发使用更新变量。

    但是,在处理数据库中的数据时必须小心。用户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上运行,并且整天同时发生数百个并发请求,并且他们不必编写任何特殊代码来处理它。