您在這裡

畫面一片空白!

Hipfox's 的頭像
Hipfox 在 2007-04-08 (周日) 13:39 發表

事情實在很糟糕,Drupal 的站竟然出現畫面一片空白的困境,更不好的是用戶還沒報錯(尚未發現這重大事件)~

最近把 php 升到 4.4.6 + eAccelerator v0.9.5 with Zend Optimizer v3.2.6,完成後抽測幾個站點,恩~ 都正常。不過近幾日發現 /tmp 中產生很多 .wrk 的檔案,大概是有啥麼狀況吧,我猜。

果然發現一個Drupal製作的站點,已經空白在那裡,就稱為「白色恐怖」好了~ 怎麼排除呢? 幾乎沒有線索...

這次不是記憶體不夠的狀況,用 locate 把 apache 的 error_log 找出藏身之地, [notice] child pid xxxx exit signal Segmentation fault (11) , 就是它出錯的。找了 google, drupal.org... 還是風馬牛不相及,無解!是因為大家出錯的環境不一定相同。

於是把 eAccelerator 拿掉,re-compile Apache, 甚至 downgrade 到 php 4.4.5... 逐一回到案發之前的系統環境,最後還是無解。

於是再架一個新的測試站出來,正常。再把出錯的網站資料倒入 MySQL,還是出錯,索性把 Drupal 4.4.6 升到 5.1,啊~還是不行,算了假日就好好休息吧...

也是懷疑記憶體不夠,但才用了20%,還很 ok. 而這一個 vps 裡頭還有跑 XOOPS, OScommerce, Drupal...等等的網站,都很健康地運作著。而且也從遠端 Server reboot 幾次,再 try 下去抱怨消息就會接踵而來...

memory_limit = 64M 不ok.

既然是現有的資料庫造成的結果,就拿 /includes/database.mysql.inc 來追查...
把下列這一段 func 暴力砍掉

if (variable_get('dev_query', 0)) {
$bt = debug_backtrace();
$query = $bt[2]['function'] . "\n" . $query;
list($usec, $sec) = explode(' ', microtime());
$stop = (float)$usec + (float)$sec;
$diff = $stop - $timer;
$queries[] = array($query, $diff);
}

於是 ok. 但破壞核心碼,再還原回去,另外在 /sites/default/settings.php 加入$conf 的一個預設值...
'dev_query' => 0

終於暫時解決。

後記:cache 資料表中存在 def_query 的預存設定,不知是什麼時候跑進去的,就是在這裡卡死。但整個網站移到另一個主機環境卻沒事,怪怪。

恭喜恭喜,這真是個難找的問題
devel module記得在運行的站中,把該關掉的關掉,尤其是 change user
你可能在devel module的蒐集query的選項忘記關掉
variable 這個table裡頭存著這個變數值,可以直接改variable這個資料庫該dev_query的值
再把cache給清空~

--
from open mind to open source~