2010-03-13 55 views
3

hy,如何在MySQL中使用php隊列

在我的腳本中,我運行一個exec()函數來製作帶有ffmpeg的電影文件。

問題是ffmpeg的可以在服務器上運行的只有1次,

如果2人是聯機服務器和第一個已經運行的ffmpeg我希望第二個要等到第一端的進程

如何編碼?

謝謝

回答

3

在某處設置鎖。

當ffmpeg啓動時,在文件或數據庫表中設置一個標誌,將其標記爲正在進行中。每次ffmpeg啓動時,都要檢查標誌值是否爲'1',如果是,請等待並在5或10秒內重試。然後當過程結束時,將標誌設置爲'0'。確保它是否崩潰或者你的腳本有錯誤,標誌被設置回'0'。

或者,您可能會以不同的用戶身份運行ffmpeg進程,並且一次運行多個進程。

+0

如何以不同的用戶身份從php運行進程? – robert 2010-03-13 02:41:55

+0

這可以工作,並且很快,但方式效率不高。在共享主機上,您會在執行此類操作時被禁止。 – Alfred 2010-03-13 03:08:02

+0

@robert如果你在共享主機上,很可能你不能像其他用戶那樣運行某些東西,除非你有多個帳戶。 – JAL 2010-03-13 06:50:30

3

對於耶布斯,don't implement your own queue的愛。編寫一個守護進程來拾取消息並處理這些文件。

+3

+1將Jebus拖入此:) – 2010-03-13 02:36:20

+0

我無法編譯和安裝librabbitmq!我無法訪問根服務器 – robert 2010-03-13 02:38:10

0

您可以使用異步隊列。每個新請求都會作爲消息添加到隊列中。您的進程一次只讀取一條消息並處理轉換請求。

對於PHP隊列,您可以嘗試Dropr或類似的方法。

2
  1. 你爲什麼不使用video hosting service(免費),像這個例子的YouTube/VIMEO這是更好的方式來處理這個,那麼你可能永遠不會準備。 Youtube有各種各樣的東西API
  2. 您是從shared hosting運行exec?如果被警告禁止,因爲共享主機不喜歡你以這種方式使用CPU。他們想要短暫的Http請求(在30秒內)。其餘不適用於您的託管,您應該先升級。
  3. 就像伊格納西奧說,你應該安裝一個消息隊列(需要有shell訪問的Linux機器)例如像:

    1. redis如果你有SSH訪問Linux機器上安裝將是最簡單的方式Redis的。然後,當準備好處理視頻時,您的長時間運行的fffmpeg進程(php腳本)應該連接到redis並從隊列中逐個獲取消息。客戶端應該簡單地將消息放在隊列中。我建議看這個快速的video來獲得redis的基礎知識。
    2. beanstalkd
    3. gearman

希望這有助於你一點點。我也正在用java編寫一個簡單的任務隊列,但我還沒完全完成。希望在大約一週內,我可以在github上提交我的第一個版本。

+0

謝謝,祝你好運 – robert 2010-03-13 05:19:12