2011-01-23 20 views
2

我正在面向對象的設計中編寫一個Web應用程序。這個應用程序會經常與數據庫進行交互。一些常規操作正在驗證用戶對所請求的函數/方法的ACL權限,執行某些功能等。簡而言之,數據庫將被使用很多。所以我的問題是,如果我使用OOP開發我的應用程序,並聲明將用於設置輸入的類級別變量,並且如果有來自另一個用戶的任何並行或併發請求,輸入數據被改變?在多線程的請求環境中面向對象的編碼 - PHP

我需要做一些獨立的事情來確保應用程序是多線程的,並且在進程未完成之前進入的輸入不會被更改嗎?

例如:

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 =新myProces( ); $ obj-> process1(1,2);

user2: $ obj = new myProces(); $ obj-> process1(5,6);

現在,如果我確實有類級變量,當併發請求進來時它們是否會更改值? PHP會爲多線程做任何類型的處理嗎?我不確定Apache是​​否可以充當消息隊列,請求可以排隊。

任何人都可以解釋,如果面向大量用戶的Web應用程序的OOP好,或者開發人員需要做任何類型的多線程?

回答

-1

這不是你不必擔心的問題。與Web服務器的每個連接都會生成一個完全獨立的PHP解釋器實例,並具有完全獨立的內存和資源句柄。其中一個對象不會受到另一個對象的影響,一個對象中的任何數據庫連接都不會受到另一個對象的影響。您的一個進程中的類屬性不會被另一個進程中的請求修改。

Web上的許多頂級站點都運行在Apache和PHP上,數百個併發請求全天同時發生,而且他們不必編寫任何特殊代碼來處理它。

0

幾件事情:

  1. 這有什麼好做的面向對象編程。
  2. PHP不支持用戶線程

每個請求都將使用它自己的內存,所以你不必擔心你的背後併發使用更新的變量。

但是,在處理來自數據庫的數據時,您必須小心。用戶1可能會讀取某些內容,然後用戶2可能會讀取相同的內容並在用戶1完成之前對其進行更新。然後,當用戶1更新它時,他可能會意外覆蓋用戶2所做的一些事情。

這些事情可以用事務,鎖等來處理。再次,它與OOP或多線程無關。

0

第一個:嘗試瞭解PDO(除非變量之前的VAR,意味着您使用的是PHP4)。

第二:正如konforce和Grossman所說,每個用戶都獲得不同的PHP實例。

:可能會出現此問題的Java項目(及其他),使用靜態的對象或靜態方法。不要擔心這在PHP中。

+0

PDO將如何幫助我?它是爲單個應用程序使用多個數據庫而不是它 – macha 2011-01-23 02:53:24

0

有沒有必要擔心在PHP端混淆了事情,但是當您想出更新或插入數據的需要時,有多個用戶可以修改相同的數據子集將導致您進入不需要的後果。如插入重複行或修改同一行。因此,您需要使用SQL命令,如鎖定表或行。