2013-10-16 161 views
2

我正在編寫一個需要在後臺執行PHP腳本的Web應用程序。隊列問題是它一次只能處理一個隊列。我的問題是,我如何讓Beanstalk同時處理更多作業,或者如何在後臺執行我的腳本,直到用戶手動停止它爲止。我使用的是Laravel 4,所以我擁有所有這些方法。在後臺執行多個PHP腳本

在此先感謝。

該API無法幫助我btw。

<?php 

class Workers { 

    public function fire($job, $data) { 
     $login = Login::find($data['id']); 
     if ($login->active == 0) { 
      $job->delete(); 
     } 

     $job->release(); 
    } 
} 

這就是我的腳本當前的樣子。請注意0​​而不是delete()。這是它繼續執行。

我又做了一些研究,發現背景工作者可能是我的東西。任何人都可以將我鏈接到關於如何在Linux上設置這些內容的教程以及我的選項是關於後臺工作者軟件的教程。豆莖似乎不提供這種選擇。

我剛剛發現http://gearman.org/可能是一種可能性,但我不確定,因爲我不太瞭解工人。我也發現這個http://kvz.io/blog/2009/01/09/create-daemons-in-php/看起來可以完成這項工作。

每次腳本需要運行時,是否可以有一個獨特的工作人員?一個完整的新實例?如果是的話,如何使用哪個程序/平臺?

我想親自感謝幫助我擺脫惡夢的傢伙。當應用程序終於完成時,我有大量的人對我大喊大叫。讚賞,很多!

+2

你需要我更具體的,告訴我們你想做什麼,展示一些代碼,所以我們可以幫助你。 –

+0

它可以在任何地方使用,請參閱[PSR-0自動加載](http://www.sitepoint.com/autoloading-and-the-psr-0-standard/)。可能你想[創建你自己的應用程序庫](http://fideloper.com/laravel-4-application-setup-app-library-autoloading)來容納你的應用程序邏輯。 – fideloper

+0

我編輯了這個問題,使其更加清晰準確。'擱置得太寬了' – Martijn

回答

1

我在大約2.5年前爲PHP deamons實施了一個解決方案。我的應用程序運行在一個封閉的環境中,只有少數用戶。所以可擴展性,性能和安全性並非真正需要。

我基本上是以CLI模式將我的deamons作爲單個PHP應用程序啓動的。

function startDeamon($daemonPath, $args = ""){ 
    $phppath = "/../../php/php"; // points to php executable 
    $executionstring = $phppath." -f ".$daemonPath." ".$args; 
    execInBackground($executionstring); 
} 

function execInBackground($cmd){ 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
     pclose(popen("start /B". $cmd, "r")); // Windows 
    } else { 
     exec($cmd . " > /dev/null &"); // Operating systems like unix 
    } 
} 

通過調用startDaemon與路徑守護進程的腳本,你想給它的參數,一個單獨的進程啓動您的Web服務器上。該進程在守護進程腳本終止後立即結束。

參數可以在你的後臺通過訪問陣列,像這樣來讀:

$myJobIs = $argv[1]; 

請記住,這個解決方案是在內存非常密集,因爲每次啓動過程可能需要像RAM 5MB或更多。 (但這取決於你的PHP安裝,你的系統和你的腳本)

而且你還需要允許PHP打開新進程/運行可能不是你想要做的事情的exec函數。