2011-07-12 71 views
1

早上php,多線程和其他疑問

我對php的工作方式有些疑惑。

讓我們假設我們有一個安裝了PHP + Apache的一個單一的服務器:所以在這裏)

它去;我不能在任何地方找到答案的書籍,所以我想打堆。這裏是我的信仰:

1-php一次可以處理一個請求。如果apache一次可以處理多個線程並不重要,因爲最終被調用的php解釋器是單線程的。

2 - 從信念1得出結論,我相信如果服務器在同一時間接收4個呼叫,則這些呼叫一次排隊並執行1次。誰最後得到響應最後。

3 - 從1和2開始,如果我cron調用一個對應於一些劇烈運動/耗時的腳本的url,我會放慢腳本返回的速度。

什麼是真的?什麼是假?

歡呼

+0

您是否傾銷關於PHP的隨機瘋狂假設,或者您是否真的在某處讀過? –

+0

我認爲,我們的答案是不可接受的:-( – Nemoden

+0

不要混淆'requests'與'threads' ... –

回答

0

我看不出爲什麼PHP無法同時處理多個請求。也就是說,根據腳本的類型,它可能是半真用於處理單個客戶端的請求。

許多腳本都使用會話。當調用session_start()時,會話正在打開,並且被鎖定爲。當腳本執行結束時,會話正在關閉,解鎖(這可以手動完成)。當同一會話有多個請求時,第一個請求會打開並鎖定會話,第二個請求必須等待,直到會話被解鎖。這可能會讓人覺得多個PHP腳本不能同時執行,但是這僅僅對於使用相同會話的請求(換句話說,來自同一瀏覽器的請求)是(部分)。只要不使用在其他請求中鎖定/解鎖的資源(文件,數據庫表等),可以並行處理來自兩個客戶端(瀏覽器)的請求。

+0

我認爲我在開發人員編寫的腳本中的線程之間感到困惑(語言中沒有多線程)和解釋者層面的線程,解釋者可以多次進入多個實例,但這是一個不同的故事。 – nourdine

1

我的水晶球建議您使用PHP會和你有併發的請求(無論是內部框架或AJAX)得到排隊。問題是默認會話處理程序使用文件並鎖定數據文件。您應該快速讀取會話數據,然後致電session_write_close()發佈該文件。

+0

有時需要在請求中修改'$ _SESSION'。取決於框架。問題與其他鎖定資源(非會話文件,數據庫表等)雖然,我同意鎖定的會話文件可能是最常見的原因 – binaryLV