2012-05-13 33 views
3

這有點複雜,所以請不要跳到結論,隨意問任何不夠清楚的事情。PHP線程和高延遲文件訪問(例如:FTP)

基本上,我有一個用PHP編寫的websocket服務器。請注意,websocket消息是異步的,也就是說,在客戶端繼續工作時(如果適用),對請求的響應可能需要很長時間。

客戶端應該要求服務器訪問其他服務器上的文件。這可以是FTP服務或Dropbox。

在這裏,請採取兩種問題注意:應連接共享和重用服務器實際上「凍結」,同時完成其工作,因此,任何請求進行處理後,服務器有「解凍」。

因此,我想,爲什麼不卸載文件訪問(這是凍結服務器)到PHP threads

這裏的問題是雙重的;

  • 如何在子線程可用的主線程(服務器)中創建連接資源(對於上述線程模型不可能)?
  • 如果兩個線程最終需要相同的資源會發生什麼?如果一個人被鎖定,直到另一個人完成,這很好,但我們仍然需要弄清問題#1。

也許我的思路全部搞砸了,如果你能找到更好的解決方案,我很想聽到它。我也有過一個擁有連接資源的PHP線程的想法,但它的內存密集。

+1

您可能可以在PHP中使用它,但我可能會建議使用另一種服務器端技術(如Node.JS),或者以更直接的方式實際支持多線程的東西。如果你使用Node路由,你不必實際編寫任何線程代碼......它通過在單個線程中運行你的代碼,但在幕後以多線程方式處理IO,它可以爲你工作。當然,你仍然有一個維護連接池到外部資源的問題,但是至少你的代碼能夠在不通過IPC的情況下看到該池。 – Brad

+0

很久以前我就曾想過Node.js,它既沒有幫助,也沒有減少我的事業的任何代碼。事實上,它增加了維護,並減少了服務器提供商的選擇(不,我不需要一個花哨的雲提供商爲這樣一個小小的個人應用程序)。 – Christian

+0

我還有另一個問題,它會應用於node.js,只是相同;我將如何共享不同線程之間的連接? – Christian

回答

5

PHP不支持線程。 PHP的目的是快速響應Web請求。這就是架構的目的。不同的圖書館試圖做類似線索的事情,但它們通常會導致比解決問題更多的問題。

一般有兩種方式來實現你想要什麼:

+0

我會檢查出齒輪工,希望它不會與phpthreadlib有相同的限制關於異步操作;問題在於他們錯過了某些關鍵方面,例如,沒有辦法使'ftp_rawlist()'異步。 – Christian