2011-03-25 110 views
2

我有一個進程用戶必須通過我的網站,這可能需要相當多的時間(在某些情況下超過一小時)。PHP後臺進程

我希望能夠讓用戶啓動進程,然後被告知它在後臺運行,並且他們可以離開頁面,並在進程完成時通過電子郵件發送。這有助於避免在用戶不耐煩時關閉窗口,並在流程結束之前關閉窗口。

理想狀態下的示例是Mailchimp如何處理導入聯繫人。您上傳聯繫人的CSV文件,然後他們說目前聯繫人正在上傳,但這可能需要一段時間,因此可以隨意離開該頁面。

完成此操作的最佳方法是什麼?我看着Gearman,但是看起來這個工具對於縮放大量任務來迅速發生,而不是在後臺運行進程更加有用。

感謝您的幫助。

+1

後臺進程也是php嗎? – Tesserex 2011-03-25 18:37:42

+0

是的,我們的整個代碼庫是PHP/MySQL – 2011-03-25 18:39:32

回答

4

即使它似乎沒有要你在第一次看用什麼,我想我會用Gearman的,爲:

  • 當用戶做他的行動可以推動任務給它
  • 它會處理這兩種:
    • 平衡任務幾個服務器,如果你有一個以上的
    • 排隊,所以沒有比X多任務並行執行。
  • 沒有必要重新發明輪子;-)
+0

我的印象是,Gearman會承擔推送的工作,但用戶仍然需要等待頁面完成加載,直到工作人員反饋結果?我正在尋找的解決方案將允許用戶退出該頁面,但仍然可以在後臺處理該作業(可能需要一整小時)。 – 2011-03-25 18:43:03

+0

您可以使用Gearman在後臺推送作業。參見http://fr2.php.net/manual/en/gearmanclient.dobackground.php – 2011-03-25 18:45:13

+0

@Aaron German開始一個與用戶請求分開的新進程。因此,用戶可以安全地關閉瀏覽器,作業將在後臺運行。 – 2011-03-25 18:46:06

1

你可能想看看創建一個守護進程。我建議用PHP以外的語言編寫守護進程(node.js也許?),但是如果你已經在PHP中有一個大的(ish)代碼庫,這可能不合意。試試看How to design a daemon with a MySQL DB connection

我一直致力於PHP中的庫調用LooPHP,以允許事件驅動的PHP編程(通常爲守護進程所需)。該庫允許定時事件,多線程偵聽器(當您希望一個事件隊列從> 1類源中提供時)。

如果您可以爲我們提供關於此後臺進程的具體信息,可能會有所幫助。

+0

當然,感謝最初的迴應。後臺進程用於收集關於特定Twitter或Myspace用戶的位置分析。對於Twitter,長度來自撥打Twitter API的電話,然後通過Mapquest API驗證找到的用戶的位置。對於Myspace,我們正在抓取特定用戶個人資料的每個朋友,這對於擁有成千上萬個朋友的用戶來說可能需要很長時間。 – 2011-03-25 18:47:06

+0

聽起來很適合Gearman或自定義守護進程(如果您需要比Gearman提供的更多控制)。 – 2011-03-25 18:50:17

0

使用用戶的ID作爲文件名寫出來的文件。產生一個新的進程來執行你想要的任何操作(如果你想要的是讓它執行更多的PHP,那麼你可以用你想運行的腳本調用PHP)。當這個過程完成後,讓它刪除該文件。如果用戶再次訪問該頁面,請讓腳本檢查文件是否存在(因爲文件名可根據用戶標識進行預測)。如果它存在,那麼你還在處理中,所以告訴他們繼續等待。也許有一些上限需要等待,如果他們回來並且文件存在,但是已經過了5個小時,刪除文件並讓他們再試一次。

+0

這可能不會很好地擴展,因爲它不允許排隊工作。另外上限並不是你想要的,因爲有時可能需要很長時間(在高負荷下)。如果你想要用這種方法,你可能應該使用.pid文件。 – 2011-03-25 18:44:18

+0

聽起來很合理,我並沒有真正想到更大的規模。我設置了類似於我所提到的內容,但是最多需要3-5秒才能完成。 – 2011-03-25 18:46:20