pache HTTP Server停止工作 原因分析(一)
一.問題描述:
最近網站執行時,伺服器老是出現問題提示:phpstudy apache http server已停止工作
二.原因分析:
查看了一下安裝目錄下的logs\error.log發現問題原因是: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes) in..........\\ThinkPHP\\Library\\Think\\Db\\Driver\\Mysql.class.php on line 198,原來是php.ini中的記憶體分配不足的問題。
php中的相關文件解釋 memory_limit 如下:
memory_limit: integer
該指令設定了一個指令碼 所能夠申請到的最大記憶體位元組數。這有助於防止寫得不好的指令碼消耗光伺服器上的可用記憶體。要使用此指令必須在編譯的時候啟用。因此 configure 一行中應該包括:--enable-memory-limit。如果不需要任何記憶體上的限制,必須將其設為 -1。 從 php 4.3.2 起,當激活了 memory_limit,PHP 函式 memory_get_usage() 便可以使用了。也就是說,php在一個 page 中的處理記憶體限制,預設的(/etc/php.ini)定義為 128M (我的系統預設安裝後),後來開發組的應用寫的越來越複雜,但是在結構上可能還有些欠缺,頻繁的物件請求,居然造成了記憶體不足。
三.解決辦法如以下記錄:
一).根據自己的需要及參考本機的記憶體大小修改或取消php記憶體限制,如改為1024M)
1、修改php.ini(修改後請重新啟動Apache),一個php指令碼寫得不好,不管你以後將memory_limit設定成多大,肯定有出問題的時候:
1).修改php.ini記憶體限制,在php.ini中,找到“memory_limit”這一項,如果沒有,你可以在檔案的尾部自己增加這個引數。以下是一些設定範例:
memory_limit = 128M;//128M改為1024M
2、在php程式裡面修改或取消php記憶體限制
1).修改PHP的記憶體限制
ini_set(”memory_limit”, ”1024M”);
2).取消PHP的記憶體限制在php程式中新增:
ini_set("memory_limit","-1");
3、這種方法只有在php以Apache模組來執行時才生效。 在你的網站的根目錄下找到“.htaccess”檔案,如果沒有,可以自己建立一個。然後把以下配置放入其中php_value memory_limit 128M ; 可以將128M改為任何你想設定的值
二).究其原因,是在編碼時,僅僅對變數賦值,卻從來沒有 unset ($var) 過。導致了記憶體佔用越來越多,所以以後一個變數不再使用之後,一定要記得unset掉它,最大限度節省記憶體資源。
應用層程式碼測試記憶體:
<?
printf(" run total time: %.2f s<br>".
"memory usage num: %.2f M<br> ",
microtime(true)-$HeaderTime,
memory_get_usage() / 1024 / 1024 );
?>
執行結果顯示如下:
run total time: 1.57 s
memory usage num: 97.09 M
試想,如果一個頁面請求要處理10個sql查詢,每個sql查詢返回20個sql結果,而程式設計師從來都不關心是返回一個row的所有column還是僅僅返回需要的column(實際上當我們採用更common的中間層時,往往會返回全部的column而不是特定的某幾個欄位,就像在 ORM 中如NHibernate, JBOSS中的那樣)如果一條row有10K, 那麼這個頁面到處理結束時就要增加到 10K*20*10=2M的陣列分配,這還不算有時候我們需要最陣列進行復制。