如果你碰到dedecms 生成靜態(tài)文件504 time out不一定是服務(wù)器的原因。如果你在文章中增加了大量的高亮標(biāo)簽,比如幾千上萬(wàn),那么dede的程序要替換這些高亮標(biāo)簽很可能就直接掛了。
今天碰到的問(wèn)題,有個(gè)dedecms系統(tǒng)中的高亮標(biāo)簽多大6000多個(gè),直接導(dǎo)致生成html慢的跟蝸牛一樣,生成一篇靜態(tài)文章要12 秒或者更多。
所以跟了下生成html的代碼。
一直跟蹤到 include/arc.archives.class.php 這個(gè)文件的第1211行,性能都豪在這里了大概意思是根據(jù)一個(gè)段落來(lái)匹配存在的高亮標(biāo)簽,而且只對(duì)同一個(gè)標(biāo)簽匹配一次,反正很煩。
只實(shí)現(xiàn)這個(gè),為嘛不直接用str的操作的,preg來(lái)來(lái)去去的多耗性能啊,所以修改了下。
從arc.archives.class.php 第1202行到1211行用如下代碼代替,也就是說(shuō),把他哪個(gè)神馬$body = @preg_replace("#(^|>)([^<]+)(?=<|$)#sUe", "_highlight('\\2', \$karr, \$kaarr, '\\1')", $body); 這一句給刪掉。在while循環(huán)里進(jìn)行替換就行了。
測(cè)試通過(guò)。
while($row = $this->dsql->GetArray()) { $key = trim($row['keyword']); $key_url=trim($row['rpurl']); $karr[] = $key; $keyReplace = "$key"; $kaarr[] = $keyReplace; //直接對(duì)每個(gè)Key進(jìn)行一次字符串替換操作 $searPos = mb_strpos($body, $key); if($searPos !== false){ $body = mb_substr($body, 0, $searPos) . $keyReplace . mb_substr($body, $searPos + mb_strlen($key)); } }