2011-10-07 54 views
1

我的專業術語可能會在這裏脫穎而出,與我一起裸露:多線程基於socket的服務器 - 可能在PHP?

我們有一堆用php編碼的cli cron樣式腳本。

其中一些服務使用ftp將數據發送到遠程位置。

東西都設置方式,什麼屢有發生的情況是:

a) Script start 
b) Connect to ftp @ remote location 
c) Send data 
d) Close ftp connection 
e) Terminate script 
f) Return to A, repeat, within a short amount of time and send to the same target, but different data. 

的問題是,有相當多的開銷(讀:減速)由於步驟b,其中首先得連接到FTP服務器,登錄,確保文件夾存在,如果沒有創建它等等等等......我知道我知道,正確的做事方式是將這些傳輸合併爲單個推送......但它的遠那更復雜一點。我從這裏簡化了大約30-40步。

所以我希望做是建立這樣一個系統:

[ CRON CLI SCRIPT ] ---> 

[ LOCALLY HOSTED SOCKET BASED SERVER THAT KEEPS THE FTP CONNECTIONS OPEN ] ---> 

[ REMOTE FTP ] 

通過以上,我們可以保持本地託管基於套接字服務器上運行,而FTP連接開放,我們將跳過過程中最長的部分是什麼,ftp認證相關的項目。

雖然在PHP中設置「一次一個」風格的系統是相當平凡的,但我之前從未做過的事情是儘可能地使它接近多線程。

凡,插座被打開(例如,127.0.0.1:10000),以及多個請求可以來。如果需要的話,「孩子們都產生了,新的FTP連接製成,等等等等

任何人都可以透露一些見解,使這個多線程在PHP中,或者,如果有另一個更好的解決方案呢? Perl是一個選項。自從我觸及它以來,它已經有幾年了(年...),但我相信在一些好的文檔前幾天會讓我加快到足以讓它發生。

+0

PHP不支持線程,但是[進程分叉](http://php.net/pcntl),這就是你所追求的。另請參閱套接字服務器的現有實現。 http://pear.php.net/package/Net_Server – mario

+0

[PHP上的多個TCP套接字請求]的可能重複(http://stackoverflow.com/questions/5659443/multiple-tcp-socket-requests-on-php) – mario

回答

3

我們已經建立了一個系統,可以或多或少地做你想要的。所以,在PHP中建立一個多進程應用程序是絕對有可能的。然而,這並不是微不足道的。如果您在子進程中關閉了fork,則需要非常小心地管理遠程連接,以避免出現問題。 (使用socket_*系列功能代替fsockopen以獲得更好的控制)

此外,信號往往會中斷正常的程序流程。這當然是正常的,但PHP並沒有考慮到這一點 - >爲一些意想不到的結果做好準備。

+0

您能否通過提供更多詳細信息來擴展您的答案,您是如何實現這一目標的。 – Pentium10

0

嘗試用戶gearman,你可以處理與齒輪工最昂貴的cpu使用情況,gearman爲每個進程創建一個新的線程。