2017-04-18 123 views
0

我們具有Concrete5.7與堆棧一個奇怪的問題:我們已經開始收集了不少棧(目前64)和我們的服務器已經開始拋出服務器錯誤(PHP Fatal error: Maximum execution time of 30 seconds exceeded in /example/path/to/website/concrete/blocks/html/controller.php on line 89)編輯頁面時,特別是通過XHR獲取/ccm/system/panels/add?cID=2468&tab=stacks時。Concrete5.7棧 - PHP最大的執行時間超過

我暫時解決了這個由php.ini從30%增加到max_execution_time到60,但是這似乎是一個貧窮的解決方法,我將不得不增加更多的內容,以籌碼後再次碰撞。

除了只是盲目增加max_execution_time之外,還有什麼我能做的嗎?

追蹤到blocks/html/controller.php:89,即在xml_highlight()函數中;具體而言,這條線(see the code in context here):

$s = preg_replace(
     "#<(.*)(\[)(.*)(\])>#isU", 
     "&lt;\\1<font color=\"#800080\">\\2\\3\\4</font>&gt;", 
     $s 
    ); 

這似乎是一個相當簡單的正則表達式來我;我錯過了什麼嗎?

它也發生,我認爲我可以從xml_highlight()刪除所有preg_replace調用和查詢性能,但我不確定我會這樣做會失去什麼功能。

作爲參考,從dashboard/system/environment/info

# concrete5 Version 
Core Version - 5.7.5.2 
Version Installed - 5.7.5.2 
Database Version - 20150731000000 
+2

什麼是「#<(。*)(\ [)(。*)(\])> #isU」'應該匹配?您可以嘗試將其更改爲'「#<([^ [] *)(\ [)([^]] *)(])> #i」'看看是否有幫助。所有的正則表達式都是基於'''的,當你處理標記的文本時這是不好的。 –

+1

它總是在一個正則表達式的作者將追加'U'選項,每一個正則表達式,就好像它是一個神奇的藍色藥丸,解決所有的性能問題是個壞兆頭。 –

+0

@WiktorStribiżew我認爲's'選項可能是必要的,但匹配的代碼是/可以是帶有(用戶輸入的)換行符的HTML。 –

回答

2

與該正則表達式的問題是,它具有在它的.*兩個實例,並且在讓.匹配換行符結束時s選項。

這意味着,在找到&lt;之後,它必須掃描潛在的整個剩餘文本,查找[,然後再次查找]&gt;U選項意味着它將首先嚐試最短的匹配,但它會繼續嘗試,直到它找到匹配或消除所有可能性。它會爲文檔中的每個&lt;做到這一點。

改變正則表達式爲Wiktor suggested要解決這個問題,但我會採取這一步,使用佔有慾量詞:

"#&lt;([^[]*+)(\[)([^]]*+)(\])&gt;#i" 

在該功能的其他正則表達式只是爲寫的不好,但它們包含在每一個最多一個.*,所以他們不會嘗試崩潰系統。

+0

您是否在捕獲組4(右方括號)中缺少轉義字符?即'(])'是'(\])'? –

+1

是和不是。它應該按原樣工作,但我通常會逃避它,因爲有些口味堅持它。這一次,我只是將它從RegexBuddy複製粘貼出來,在那裏我編寫了它。爲了安全起見,我會繼續逃避它。 –