2009-02-26 45 views
6

我最近閱讀了關於http://php.net/pcntl的文章,並且弄錯了這些函數有多好,以及在PHP中使用多線程是否聰明,因爲它不是PHP的核心功能。PHP中的多線程

我想觸發不需要反饋的事件,就像手動啓動cronjob執行一樣。

所有這一切都應該在與Zend框架

回答

7

編寫一個Web應用程序的了pcntl包工程相當精緻運行 - 它只是使用了根據unix functions。唯一的缺點是,如果從Web服務器上下文中調用php,則不能使用它們。也就是說,您可以在shell腳本中使用它,但不能在網頁上使用它 - 至少不能使用像calling a forking script with exec或類似的破解工具。

我剛剛找到一個解釋why mod_php cannot fork的頁面。基本上這是一個安全問題。

+0

該死的,我想用它在一個webapp :( – Thomaschaaf 2009-02-26 14:22:36

2

讓PHP代碼在多個線程中執行的唯一可能方式是將php作爲線程Web服務器的模塊運行,這是無用的,因爲線程完全隔離且您的代碼無法控制它們。據我所知,pcntl只管理進程,而不是線程。

4

這不是線程控制,這是過程控制。線程庫是pthreads (POSIX threads),它不包含在PHP中,因此PHP中沒有多線程功能。

由於多處理,你不能在mod_php中使用它,因爲這將是一個巨大的安全漏洞(衍生進程將具有所有Web服務器的權限)。

2

如果我需要從PHP執行手動crontab執行或類似操作,我可能會使用隊列。有一個數據庫表,您可以附加作業。另一個來自cron或作爲守護進程運行的進程在它們出現時執行作業。

另一種方法是設置一個單獨的腳本併爲其執行HTTP GET。這不是線程化的,但它是在PHP中另一個命令的一種方式。

例如,如果我想按需運行/usr/bin/somescript.sh,我會有一個執行系統調用的somescript.php。這將在只能從本地主機訪問的虛擬主機上進行。

我會做一個套接字調用到網絡服務器和GET腳本。關鍵是而不是在套接字上讀取,所以它不會阻塞。如果我想檢查返回值somescript.php,我會稍後在主腳本中執行以防止阻塞。

如果somescript.php需要很長時間才能執行(比調用腳本更長),那麼當套接字關閉時,您必須做一些魔法來阻止apache殺死腳本。

1

例子(從他們的項目頁面摘錄):

正如2011年10月25日開始,該模塊已達到「生命結束」,並有利於項目如Elysia Cron已被棄用。這個模塊並不完全無用,因爲受Cron MT啓發的核心修補程序致力於D7。

...提供了有利的Drupal爲收到匿名大多流量的網站非常顯著的性能和可擴展性提升靜態頁面緩存。對於共享主機,這是您提高性能的最佳選擇。在專用服務器上,您可能需要考慮清漆。