2015-10-06 64 views
4

我知道Laravel的隊列驅動程序,比如redis和beanstalkd,我讀過你可以增加beanstalkd等工作的人數。但是我不確定這些解決方案是否適合我的場景。這是我需要的;在後臺運行異步作業(laravel)

我通過套接字連接偵聽XML饋送,並且數據只是保持快速。永遠。我一秒鐘就可以獲得數十個XML文檔。

我一行一行地從這個套接字讀取數據,一旦我到達XML結束標記,我就會將緩衝區發送到另一個進程進行解析。我以前只是在base64中編碼xml,併爲每個xml運行一個單獨的php進程。 shell_exec('php parse.php' . $base64XML);

這讓我很快解析了這個永無止境的xml數據。排序的手動線程。現在我想使用與Laravel相同的功能,但我想知道是否有更好的方法來做到這一點。我相信Artisan :: call('command')不會將它推到後臺。我當然也可以在Laravel中執行shell_exec,但是我想知道是否可以從Beanstalkd或類似的解決方案中受益。

所以真正的問題是這樣的:如何設置beanstalkd或redis驅動程序的隊列工作者數量?就像我想要同時運行20個線程一樣。如果可能,更多。

一個稍微不太重要的問題是:有多少線程太多?如果我有一臺非常高端的專用服務器,可以很好地處理負載,那麼使用這些工具創建500個線程/工作者會在代碼級別上造成任何問題?

回答

6

拉拉維爾排隊就是爲了這個。您必須創建Job Class。所有你想在你的xml文檔上做的繁重工作都需要在這裏。 然後,您從套接字中提取xml,並且只要您收到一個文檔,就會立即從隊列中選取它,然後執行繁重的工作。

這樣做的好處是,如果您排隊處理文檔的速度快於您對它們的處理速度,那麼隊列將負責處理高負載時間併爲以後的任務排隊。

我也不建議你在沒有隊列的情況下使用它(像你這樣的叉子)。事實上,如果文件太多,你會創建太多的子線程並使服務器超載。當具有固定數量的工人的簡單隊列即時解決所有這些問題時,正確地記帳這些線程是有風險的並且不值得。

+0

非常感謝您的幫助,但老實說,我真正想知道的是如何設置,可以在同一時間運行工人的數量。 –

+3

一個工人basicaly運行PHP命令工匠隊列中的PHP實例:聆聽這裏所說:http://laravel.com/docs/5.1/queues#running-the-queue-listener 如果你只運行一個命令,有是一個工人,如果你跑兩個,你有兩個工人,等等...... 我建議像管理員或工頭一樣來管理你產生了多少過程。 – Atrakeur

0

經過多一點研究,我發現how to set the number of worker processes。我錯過了文檔中的那一部分。傻我。我仍然懷疑這個主管工具是否可以處理像我這樣的情況下的數百名員工。希望有人能分享他們的經驗,但如果不是,我會在本週做一次性能測試後更新這個答案。

0

我從經驗告訴你,shell_exec()不是在PHP中運行異步任務的理想方式。 在開發時似乎很好,但是如果你有一個小的vps(1-2 GB RAM),你可能會超載你的服務器,並且apache/nginx/sql /在你不在的時候可能會剎車,你的網站可能會停機幾個小時/天。

我推薦Laravel Queues + Scheduler用於這些事情。