2012-10-02 26 views
2

請原諒,如果它是PHP中的一個基本問題。 我是一個桌面應用程序開發人員,所以不太確定它,如何處理PHP腳本中的共享資源

就像我們把鎖定,同步或使用不同語言的關鍵部分來訪問多個線程的一些公共資源。我的假設是真實的,如果一個腳本(php)被多個不同的客戶端同時訪問會被多線程處理?如果他們正在更新通用記錄,他們需要一些同步?

它是如何在PHP中完成的?

在我的情況下,一個PHP頁面可能有多個Android客戶端訪問它,並可能修改/訪問相同的記錄或表格行。

+2

什麼是您的案例中的「記錄」? – KingCrunch

+0

MySQL錶行 – Ahmed

回答

5

PHP顯式爲單線程,每個PHP腳本調用都將由其自己的服務器線程/進程處理。

同時更新記錄必須由底層數據庫層處理。 MySQL例如被廣泛使用和線程安全。在使用事務時,您還可以保證其他級別的原子性。

+0

存儲過程本身不是原子的。當然你不是指別的東西(例如交易)? – KingCrunch

+0

@KingCrunch你是對的,那就是我的意思。 –

2

當使用DBMS(您所做的)時,那麼該數據一致性負責。特別是閱讀時,無論如何都是沒有問題的,因爲問題只會發生,當某些事情被修改時。如果您不確定,請在寫作時使用交易。

1

如果你在談論訪問服務器,那麼它依賴於服務器是否線程化(Apache不是,nginx等),並且與PHP本身無關(不是線程化的)。無論哪種方式,如果你在談論MySQL,那麼它是一個不同的故事,因爲MySQL工作每個連接會話(像CURRENT_TIMESTAMPLAST_INSERT_ID()取決於連接,而不是數據庫作爲一個整體)。所以,如果你有這樣的事情:

//some insert query 
$stmt->execute(); 
$id = $connection->insert_id; 
$stmt2->execute($id); 

...它是在被執行單一stmt2之前執行多次,即使第一stmt「安全」,該ID將仍然是因爲連接是否正確是一樣的。

+0

謝謝,服務器是我的情況下的Apache,你是否建議,因爲它是Apache,它會阻止/拒絕其他客戶端,而第一個正在處理? – Ahmed

+0

@Ahmed不,完全沒有; Apache產生多個子進程,可能會耗盡插槽,然後*它會拒絕連接,但我懷疑你會用完。 (**注意:**有一個使用線程的apache實現)。 –