簡體   English   中英

使用zeroMQ在PHP中進行並行處理

[英]Parallel processing in PHP using zeroMQ

一些背景:我正在用php構建服務器應用程序,它將需要根據用戶請求執行許多獨立的任務。 我的應用程序對速度有嚴格的要求,因此我想並行執行所有這些任務。

我研究了幾種解決方案(例如gearman,rabbitMQ,zeroMQ),我決定使用zeroMQ(快速,優質的文檔,靈活的方法,並且不需要經紀人)。 這為我解決了線程之間的通信/同步問題。

問:我只想在服務器收到請求時啟動任務(不要長時間運行進程)。 所以我收到一個請求->開始並行計算->將計算結果返回給客戶端。 一種解決方案似乎是pcntl_fork但是文檔中提到在生產服務器環境中使用它存在一些問題,但是並沒有真正說明它們是什么?

我的另一種選擇是使用proc_open ,但我不太喜歡它,因為它需要我以某種方式序列化輸入,這似乎不那么靈活,沒有分支那么快。 它比pcntl_fork有什么優勢嗎?

還有另一種解決方案(仍使用php:p)嗎?

小心翼翼,我在您的問題中看到幾個危險信號,這些信號使我相信您擔心的是可能不需要的事情,而您可能並不在乎應該做的事情。

您說您對速度有嚴格的要求-您是否已驗證正常的單線程PHP不夠快? 運行任何基准測試,找出瓶頸? 如果您對速度的要求很高,您甚至可以考慮使用其他語言,因為PHP的所有魅力,它永遠不會成為工具箱中最有效的工具。 如果您的瓶頸取決於IO,那么Java是實現全面速度的不錯選擇,而node.js是不錯的選擇。 我主要關心的是,在沒有更多信息的情況下,這個問題聞到了過早的優化 這可能是不公平的,您可能已經省略了這些細節,因為這不是問題的核心,但是作為局外人,我至少想確保您尚未考慮這些問題。

您想避免長時間運行的流程-為什么? 長時間運行的進程沒有內在的錯誤-但是當您習慣使用Apache + mod_php的偽高效的“按需”特性時,它確實出錯。 確保您不只是因為不習慣而避免嘗試某些事情。

您似乎要描述的是從PHP Web應用程序內部執行並行處理-就像您編寫的任何其他網頁一樣,Apache啟動PHP腳本,該腳本派生另一個進程,而不是串行執行其操作,而是在並行,完成並在頁面渲染完成時返回給用戶。 如果是正確的話,那么這是您原始問題的答案:

您不能在Web進程中使用pcntl_fork ,而只能在命令行中使用 詳細信息在您鏈接到的頁面上的注釋中:

這不是“不應該”的問題,而是“不能”的問題。 即使我使用--enable-pcntl在PCNTL中進行了編譯,事實證明,它僅編譯為PHP的CLI版本,而不是Apache模塊。 [...] function_exists('pcntl_fork')返回false,即使它已正確編譯。 事實證明,從CLI可以正常返回true,而對於HTTP請求僅返回false。 所有pcntl _ *()函數都一樣。

...這意味着您要么必須將分叉過程作為一個單獨的長期運行過程啟動,要么必須按需使用proc_open啟動它,因此無法按照我假設的方式使其工作你想要它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM