2010-09-21 51 views
5

另請參閱Having a PHP script loop forever doing computing jobs from a queue system,但這並不能回答我所有的問題。讓PHP腳本永遠運行,訪問隊列

如果我想永遠運行PHP腳本,訪問隊列,做的工作:

  1. 什麼是內存問題的可能性?如何避免它們? (任何沖洗功能或我應該使用的東西?)

  2. 如果腳本因某些原因死亡怎麼辦?什麼是自動啓動它的好方法?

  3. 什麼是啓動腳本的最佳基本方法。由於它永遠運行,我不需要cron。但是,我如何啓動它? (另請參閱2.)

+0

1.取決於你在做什麼。一些擴展有一些嚴重的內存泄漏。 - 2.使用某種護衛。 - 3.叉()它進入後臺。 – halfdan 2010-09-21 13:08:32

+0

到底忙什麼呢?它如何總是會有工作要做?當它耗盡隊列時,它會做什麼?爲什麼PHP? – Dolph 2010-09-21 13:09:15

回答

9

將隊列設置爲cron腳本。每10秒執行一次。當腳本啓動時,檢查是否存在鎖定文件(類似.lock)。如果有,立即退出。如果沒有,則創建.lock並開始處理。如果發生任何錯誤,請發送電子郵件/記錄這些錯誤,刪除.lock並退出。如果沒有任務,則退出。

我認爲這種方法非常理想,因爲PHP的設計並不是真正能夠像你問的那樣長時間運行腳本。爲了避免潛在的內存泄漏,崩潰等,持續執行腳本是一種更好的方法。

+0

聽起來不錯,也許我也應該用這種方式重寫我的守護進程。乾杯。 – 2010-09-21 13:20:21

+0

+1我使用這種方法。它簡單而有效。 – goat 2011-01-17 20:13:26

0

對於狀態機來說,不要太過分,至少將'states'(例如:flv2avi轉換)和'tasks'(flv2avi 1.flv)引入狀態是個好主意。

在我的腳本(Perl)上,有時殭屍進程正在開始降低整個腳本的性能。這是一種罕見的情況,但它在源代碼中是本地的,所以腳本應該能夠停止閱讀隊列,從而允許新實例繼續其任務&jobs;然而,保持運行任務的數據儘可能多是受歡迎的。一旦第一個實例有1-2個任務,它就會被殺死。

在啓動: 檢查常見的錯誤(因關機) 檢查已知錯誤(空間不足,無法讀取輸入) 殺死任何可能被殺死,將狀態設置爲「等待」 啓動所有等待。如果你運行一個管道工作(vlc | ffmpeg,tail -f | grep),你可以嘗試避免在你的程序中使用太多的I/O,而不是使用fork()(PHP的壞主意?)或者只是調用/ bin/bash -c「prog1 | prog2」,這可以節省很多CPU負載。

啓動點:既/etc/rc.d中和cron(檢查過程中,運行一審||與「調試」的說法跑秒)

1

如果在PHP雖然可以訪問(發佈和使用)MQ的,所有可能的嘗試使用功能齊全的MQ應用程序來執行此操作。

一個功能齊全的MQ應用程序(在ruby,perl,.NET,Java等中)將會處理您所討論的所有併發性,錯誤日誌記錄,狀態管理和可伸縮性問題。