2017-04-18 20 views
0

Concrete5.7のStackで奇妙な問題が発生しました:現在、かなりの数のスタックを集め始めており(現在64)、サーバーでサーバーエラー(PHP Fatal error: Maximum execution time of 30 seconds exceeded in /example/path/to/website/concrete/blocks/html/controller.php on line 89)ページを編集するとき、特に/ccm/system/panels/add?cID=2468&tab=stacksをXHRで取得するときConcrete5.7 Stacks - PHP最大実行時間を超えました

php.iniに増やして一時的に解決しましたが、これはStacksにコンテンツを追加した後にもう一度バンプする必要があります。

盲目的に増加する以外に何かできることはありますか?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 
    ); 

は、これは私にはかなり簡単な正規表現のように思えます。私は何かを欠いている?

preg_replaceのコールをすべてxml_highlight()から削除してパフォーマンスを確認することもできますが、どのような機能を失うかはわかりません。参考のため

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マッチしたコードは(ユーザが入力した)改行でHTMLにすることができるので、 's'オプションが必要かもしれないと思います。 –

答えて

2

その正規表現の問題は、それはそれで.*の2つのインスタンス、および.マッチ改行をすることができます最後にsオプションを持っているということです。

つまり、&lt;が見つかったら、[を探して残りのテキスト全体をスキャンし、次に]&gt;を再度検索する必要があります。 Uオプションは、最初に最短一致を試すことを意味しますが、一致を見つけるか、すべての可能性を排除するまで試行を続けます。文書内のすべての&lt;に対してそれが実行されます。

Wiktor suggestedとして正規表現を変更して問題を解決する必要がありますが、私はさらに一歩それを取ると所有量指定子を使用します。その関数内

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

他の正規表現は、同じようにひどく書かれているが、彼らはに含まれていますほとんどはそれぞれ.*なので、システムをクラッシュさせないようにします。

+0

キャプチャグループ4(右角かっこ)にエスケープ文字がありませんか?つまり '()'は '(\))'であるべきですか? –

+1

はい、いいえ。それはそのまま動作するはずですが、私は通常それをエスケープします。なぜなら、いくつかの味がそれを主張しているからです。今回はRegexBuddyからコピーして貼り付けて作った。私は先に進み、安全に過ごすためにそれを脱出します。 –

関連する問題