2010-05-26 78 views
6

可以用ajax來實現真正的多線程嗎?如果可以,怎麼辦? 請給我一些相關的信息,網站或書籍。 謝謝〜!ajax多線程

回答

15

這取決於你的意思是「多線程」。

Javascript代碼明顯是單線程的。沒有Javascript代碼會中斷當前在同一頁面上執行的其他Javascript代碼。 AJAX(XHR)請求會觸發瀏覽器做一些事情,並且(通常)在完成時調用回調。

在服務器上,每個Ajax請求都是一個單獨的HTTP請求。這些將在他們自己的線程上執行。根據Web服務器配置的不同,它們甚至可能不在同一臺計算機上執行。但是,即使調用相同的腳本,每個PHP腳本實例也將完全分離。本身沒有共享狀態。

現在,瀏覽器通常會限制頁面在每個主機的基礎上同時發生的Ajax請求的數量。這個數字通常是2.我相信你可以改變它,但是因爲大多數人會有默認值,所以你必須假設它是2.更多的請求將會排隊,直到現有的請求完成。這可能導致必須做煩人的事情,如創建多個主機名稱,如req1.example.com,req2.example.com等。

一個例外是會話,但它們不是多線程。開始一個會話將阻止所有其他腳本嘗試啓動完全相同的會話(基於cookie)。這就是爲什麼您需要儘量減少會話打開時間的一個原因。可以說,你可以使用數據庫或類似memcache的東西來克服腳本間的通信,但它並不是真正的PHP。

PHP最適合用於簡單的請求處理。收到請求。它被處理並返回一個響應。該響應可能是HTML,XML,文本,JSON或其他。該請求可能是來自瀏覽器的HTTP請求或AJAX請求。

在可能的情況下,這些請求 - 響應週期中的每一個應被視爲單獨的實體。

另一種使用的技術是長輪詢。 HTTP請求被髮送到服務器,並且可能不會很長時間返回。這用於基於Web的聊天和其他「服務器推送」類型的場景。有時部分回覆將被刷新而不結束請求。

最後一個選項(至少在Unix/Linux上)是PHP可以產生進程,但這似乎不是你所指的。

那你究竟在做什麼?

+0

也許他是在假設一個人必須等待ajax請求完成而另一個才能被解僱?如果是這樣,如果一個函數依次觸發5個Ajax請求,它將不會等待請求之一在處理第二個請求之前回來。如上所述,它不會在_exact_同時發射全部5個,但它們都將在相互間的幾毫秒內運行(通常爲 – 2010-05-26 15:18:42

+0

)這是一個很好的答案,但值得注意的是,大多數瀏覽器將限制您的請求數量可以發送兩個(雖然這可以在瀏覽器設置中更改),並將其餘的排隊,所以您可能無法從並行請求中獲得顯着的加速。 – 2010-05-26 15:34:40

+0

@丹哦,我的意思是把它放進去,但忘記了。感謝您提出。 – cletus 2010-05-26 21:44:17

3

實際上你不能多線程,但是很多大型網站做的是刷新頁面的輸出,然後使用Ajax來實時加載其他組件,以便用戶在瀏覽器仍然可以看到內容時請求新的信息。它是一種很好的技術,但是和其他一切一樣,你需要小心如何使用它。