1. 程式人生 > >記錄安裝php與apache不相容的過程

記錄安裝php與apache不相容的過程

1.在ubuntu中安裝php之後,重啟apache2,出現以下的問題:

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe

 在插敘資料後,發現是apache的工作模式的問題。故將apache模式改成了mpm_prefork模式,關於模式之間的介紹見連結:

2.連結內容摘抄

   Apache 2.X支援插入式並行處理模組,稱為多程序處理模組(MPM)。在編譯apache時必須選擇也只能選擇一個MPM,對類UNIX系統,有幾個不同的MPM可供選擇,它們會影響到apache的速度和可伸縮性。

   2.1 prefork模式

        prefork是一個非線性的、預派生的MPM,使用多個程序,每個程序在某個確定的時間只單獨處理一個連線,效率高,但記憶體使用比較大。

        優點:適合於沒有執行緒安全庫,需要避免執行緒相容性問題的系統。它是要求將每個請求相互獨立的情況下最好的MPM,這樣若一個請求出現問題就不會影響到其他請求。

        缺點:一個程序相對佔用更多的系統資源,消耗更多的記憶體。而且,它並不擅長處理高併發請求,在這種場景下,它會將請求放進佇列中,一直等到有可用程序,請求才會被處理。

         

     2.2 worker模式

           worker使用了多程序和多執行緒的混合模式,worker模式也同樣會先預派生一些子程序,然後每個子程序建立一些執行緒,同時包括一個監聽執行緒,每個請求過來會被分配到一個執行緒來服務。

            優點:執行緒比起程序會更輕量,因為執行緒是通過共享父程序的記憶體空間,因此,記憶體的佔用會減少一些,在高併發,高流量的場景下會比prefork有更多可用的執行緒,表現會更優秀一些;

             缺點:如果一個執行緒出現了問題也會導致同一程序下的執行緒出現問題,如果是多個執行緒出現問題,也只是影響Apache的一部分,而不是全部。由於用到多程序多執行緒,需要考慮到執行緒的安全了,在使用keep-alive長連線的時候,某個執行緒會一直被佔用,即使中間沒有請求,需要等待到超時才會被釋放(該問題在prefork模式下也存在)

           

            Worker模式下所能同時處理的請求總數是由子程序總數乘以ThreadsPerChild值決定的,應該大於等於MaxRequestWorkers。如果負載很大,現有的子程序數不能滿足時,控制程序會派生新的子程序。預設最大的子程序總數是16,加大時也需要顯示宣告ServerLimit(最大值是20000)。需要注意的是,如果顯式聲明瞭ServerLimit,那麼它乘以ThreadsPerChild的值必須大於等於MaxRequestWorkers,而且MaxRequestWorkers必須是THreadsPerChild的整數倍,否則Apache將會自動調節到一個相應值。

         2.3 Event模式

           Apache最新的工作模式,它和worker模式很像

           優點:不同的是在於它解決了keep-alive長連線的時候佔用執行緒資源被浪費的問題(HTTP的Keepalive方式能減少TCP連線數量和網路負載),在event工作模式中,會有一些專門的執行緒用來管理這些keep-alive型別的執行緒,當有真實請求過來的時候,將請求傳遞給伺服器的執行緒,執行完畢後,又允許它釋放。這增強了在高併發場景下的請求處理。