2009-12-04 18 views
0

執行proc_nice()時,它實際上是否正在運行Apache的線程?PHP proc_nice是否以新的優先級設置離開Apache線程?

如果是這樣,並且如果當前用戶(非超級用戶)無法恢復其原始優先級,則會在Apache 2.0x服務器上查殺適當的Apache線程(apache_child_terminate)?

問題是我試圖限制允許用戶運行Ad-Hack查詢的應用程序的影響。查詢可能很大,數據的轉換需要大量的內存和CPU。

我已經將流程重新編寫爲基於流的流程 - 幫助處理內存消耗,但是我還希望流程運行較低的優先級。不過,我不能將Apache線程置於低優先級,因爲我們有許多高優先級Web服務在同一個機器上運行。

TIA

回答

2

在那種情況下,如果經常這樣做,那種Apache的過程中繁重的工作的一個解決方案,但無論是:

  • 運行一個外部的PHP程序,使用類似例如shell_exec - 這是如果您必須以同步模式工作(即,如果幾分鐘後您不能執行任務)
  • 將任務推送到FIFO系統,並立即返回消息給用戶說「你的任務即將完成」
    • ,並有一些其他進程(通過每分鐘的crontab推出,例如)檢查FIFO隊列
    • 並做處理它有東西在隊列
    • 這一進程本身,可以運行在低優先級模式下。


儘可能經常地,特別是如果重計算需要一些時間,我會去的第二個解決方案:

  • 它使用戶能夠得到一些反饋立刻道:「服務器已收到您的請求,並將儘快處理它「
  • 它不保持Apaches的進程」工作「很長時間:重的東西由其他進程完成
  • 如果有一天,您需要一臺服務器不夠的處理能力,這種系統將更容易擴展:只需添加第二臺服務器即可從同一個FIFO隊列中選擇
  • 如果您的服務器真的太加載了,你可以停止從隊列中處理,至少在一段時間內,所以負載可以變得更好 - 例如,如果關鍵的Web服務在特定的時間內使用很多,這可能是有用的,幀。


另一個(非常漂亮的,但我還沒有嘗試過)的解決辦法是使用某種工具一樣的,比如,Gearman

的Gearman提供通用應用程序 框架外出工作到其他 更好的機器或過程 適合做這項工作。
它允許你 並行工作,加載 餘額處理,並致電 語言之間的功能。
它可以是 用於各種應用, 從高可用性網站到 數據庫複製傳輸 事件。
換句話說,它是關於分佈式處理如何通信的神經系統。

+0

感謝您的慷慨細節。我已經把這個系統分成了一個請求/隊列系統,正如你所描述的那樣(有些查詢可能需要幾個小時才能完成),儘管它是一個可以完成這項工作的web服務(並且Apache仍然參與其中)。我和一位同事討論過這個問題,他也建議讓CLI工作人員去做可能會被「剔除」的實際工作。我會看看Gearman,但同時我會考慮換一個CLI工作人員。 – ChronoFish

+0

不客氣:-) ;;如果你的任務花費了這麼長時間,一個獨立於Apache的CLI應用程序似乎確實是必需的:否則,你將以沒有可用的Apache進程結束服務頁面,有一天或另一個...仍然,玩得開心! –