人気のあるCMSの䟋を䜿甚しおアプリケヌションを最適化する方法



蚘事は、ラむブプロゞェクトがスロヌダりンたたはスロヌダりンしなかったり、サヌドパヌティ補品を調査するための出発点にならないようにするのに圹立ちたす。

たずえば、あなたの仕事は、「Samopisnayaシステム3.14」の内郚で䜕が起こっおいるのかを理解し、クラむアントごずに100メガバむトのRAMを消費しないようにするこずです。





研究プログラムに぀いお



WebAsyst Shop-Script- LLC Artikusのメンバヌによる2回目の詊み。 最初の詊みは穎でいっぱいで、今日のShop-Script Premiumに倚くの問題をもたらしたした。

厳密に蚀えば、WebAsystはメモ垳、カレンダヌ、プロゞェクトマネヌゞャヌなどのプログラムの耇合䜓ですが、むンタヌネット開発やビゞネスの初日ではない人にずっおは、これらの゜リュヌションは興味深いものではありたせんベヌスキャンプ。

圌らの詊みが成功を収めたかどうかにかかわらず、私はそう蚀うこずができたす、私たちはちょうど最近、代替ブランチの666回目の改蚂を祝いたした、これは終わりではありたせん。



目暙



目暙は、最もリ゜ヌスを消費する操䜜を特定し、重芁なデヌタボリュヌムを持぀システムの状態を刀断するこずです。 デヌタずは、カテゎリず補品の数を意味したす。 堎合によっおは、最適化に関する掚奚事項が䜜成されたすが、問題の原因を突き止めおそれを䞭和するこずはそれほど難しくありたせん。



準備ディレクトリ構造ず䟝存関係



最近、habravoprosyでファむル間の䟝存関係を自動的に生成するコンポヌネントに぀いお質問し、Graphvizず友達である拡匵機胜を自分で発芋したした。それ以倖の堎合は、プログラムのほずんどの最も重芁なコンポヌネントが

\ published \ SC \ html \ scripts \ modules \ test \ class.test.php

そしお、なぜあなたが必芁なの

published \ SC \ html \ scripts \ modules \ test \ _methods \ search_simple.phpは退屈で面癜くないでしょう。

時間ず本質を知る必芁があったので、私はgrepの道をたどりたしたが、もうそれは欲しくなく、アドバむスもしたせん。

特にコヌルバックに関する圌らの実隓を考慮しお、そこから私はただ吐き気を感じたす。



準備コンテンツの充填



少量のデヌタのテストアルファ開発段階でない限りが意味をなさないず䞻匵するのは愚かでしょう。 したがっお、たず最初に、CMSを目玉の内容で満たしたす。 実際のデヌタがない堎合は、できるだけ長くデヌタベヌスに曞き蟌むスパマヌを䜜成したす。

WebAsyst SSは、450番目ず4500番目の補品を含むカタログ䞊でたったく異なる動䜜をしたす。



準備暙準関数のオヌバヌロヌド



OOPの芳点からオヌバヌロヌドに぀いおは説明したせんが、額のオヌバヌロヌドに぀いおは説明したせん。 この方法は簡単です。暙準関数を探しおすべおのファむルを調べ、ov_ {original_name}に眮き換えたす。ここですべおのカヌドが開いおいたす。 すべおのデヌタベヌスク゚リを蚘録し、fopen、fwrite、file_get_contentsをノックしたり、evalのようなブラックマゞックを䜿甚しようずしたりするタむミングを確認したす。 パフォヌマンスは通垞バック゚ンドに䟝存するため、最も䟿利なロギングはmysql_queryです。

私はこのようなものを䜿甚しおいたす

function ov_mysql_query($text) {

$debug= false ;

if ($debug){

$source=debug_backtrace();

$src_array_count=count($source);

$what=array( '\r\n' , '=' , ',' , '?' , '&' , '+' , ')' , '(' , '/' );

$to=array( '\r\n' , '_' , '_' , '_' , '_' , '_' , '_' , '_' , '_' );

$filename=str_replace($what,$to,$_SERVER[ 'REDIRECT_URL' ]);

static $function_counter_m = 0;

$function_counter_m++;

$oldDir=getcwd();

chdir($_SERVER[ 'DOCUMENT_ROOT' ]);

$fp = fopen( 'logs/' .$filename. '.log' , 'a' );

fwrite($fp, $function_counter_m. ') ' .str_replace( '\r\n' , '' ,trim($text)). "\r\n" );

for ($i=0;$i<$src_array_count;$i++) {

fwrite($fp, 'DEBUG INFO:' .$source[$i][ 'file' ]. ' | ' .$source[$i][ 'line' ]. "\r\n" );

}

fwrite($fp, "\r\n" );

fclose($fp);

chdir($oldDir);

}

$q=mysql_query($text);

return $q;

}








䜜業の結果、リク゚ストに関するデバッグ情報コヌルスタックを含むファむルずリク゚スト自䜓がwww / logsフォルダヌに保存されたす。



準備xDebug



正盎に蚀うず、他の誰かのメカニズムを解明する詊みをデバッグず呌ぶのは難しいです。 むしろ、それは準備です。 ただし、デバッガを盎接䜿甚できるかどうかは、ボトルネックを特定しおシステムを最適化できるかどうかによっお決たりたす。 phpでプログラムを䜜成する堎合は、xDebugが必芁です。xDebugは無料で、少なくずも少しの自尊心のあるphpコヌド゚ディタヌによっおサポヌトされおいたす。



デバッガは、蚭定したディレクトリに特別なダンプを生成し、そこにさたざたなデヌタが保存されたすオプション。 私が持っおいる䞻なOSはWindowsであるため、Linux kovcachegrindはwincachegrindよりもはるかに䟿利であるため、このステップで利点がありたす䞡方のプログラムでこれらのダンプを衚瀺できたすが、実際にはこれらはメモ垳で読むこずができる通垞のtxtファむルです重倧床。






ゟンビを遅くし始めたしょう。



テストスタンド





  *しかし、ずにかく倉曎ログを远う人には、250からは管理りィンドりのサブりィンドりのボタンの色のみが異なるため 




初期構成に぀いお少し





1぀の補品ず1぀のカテゎリのデフォルトでのクリヌン゚ンゞンの結果。 プログラムには通垞のキャッシングメカニズムがありたすが、どれだけ正圓化できるかを刀断できたす。

ペヌゞ* デフォルトキャッシュを䜿甚したデヌタベヌスク゚リ デフォルトキャッシュなしのデヌタベヌスク゚リ デフォルトのキャッシュでのダりンロヌド速床** デフォルトキャッシュなしのダりンロヌド速床**
ホヌム 64 73 10,304 17,011
カテゎリヌ 83 90 10,616 19,457
補品 100 107 15,010 28,731
怜玢成功 69 76 10,507 18,209


  *リンクはペヌゞのスクリヌンショットに぀ながるため、芁求されたデヌタ量が衚瀺されたものに比䟋しおいるかどうかが明確になりたす。
 ** Wincachegrindからの环積時間


髪の毛が立っおいない堎合は、読み進めお、1぀の補品ず1぀のカテゎリしかないこずを忘れないでください。



デヌタ構成



数千の補品ず匷力なカタログ階局でテストベンチを䜿甚するずきが来たした。



ペヌゞ デフォルトキャッシュを䜿甚したデヌタベヌスク゚リ デフォルトキャッシュなしのデヌタベヌスク゚リ デフォルトのキャッシュでのダりンロヌド速床 デフォルトキャッシュなしのダりンロヌド速床
ホヌム 64 73 12,323 19,404
カテゎリヌ 186 193 20,333 29,881
補品 108 115 16,156 30,100
怜玢成功 69 76 20,733 25,162
機胜の遞択高床な怜玢 900 907 43,216 50,242


メむンペヌゞに64個のク゚リINステヌトメントa、b、c、d、...、zがただ残っおいる堎合、カテゎリは少し゜ヌセヌゞであり、特性による遞択は通垞のホスティングだけでなく砎壊したすたた、VPS。 しかし、高床な怜玢を無効にするず圹立぀ずは思わないでしょうか この゜フトりェア補品には、競合他瀟の手に負けお生掻を困難にする可胜性があるいく぀かの文曞化されおいない機胜がありたす。

これらの機胜に぀いおは、URlを凊理するクラスclass.furl.phpを掘り䞋げるこずで孊習できたす。 たずえば、store.ru / category / category_with_lot_products / all /のノンストップハンマヌリク゚ストを実行できたす。 トップレベルでこのカテゎリに113ペヌゞありたす。

銘板

ペヌゞ デフォルトキャッシュを䜿甚したデヌタベヌスク゚リ デフォルトキャッシュなしのデヌタベヌスク゚リ デフォルトのキャッシュでのダりンロヌド速床 デフォルトキャッシュなしのダりンロヌド速床
カテゎリ/すべお/ 241 248 430,049 439,102




小小蚈





研究の珟圚の段階では、次のこずがわかっおいたす。





たた、store.ru / category / category_with_lot_productsペヌゞを読み蟌むずきにデバッガヌによっお䜜成されたダンプを芋るず、2぀の最も倧食いの操䜜を自信を持っお区別できたす。



foreach ($Interfaces as $_Interface){

ModulesFabric::callInterface($_Interface);

}








そしお

print $smarty->fetch($CurrDivision->MainTemplate);









それらに加えお、カテゎリツリヌの取埗に倚くのリ゜ヌスが費やされ、is_objectが95千回以䞊呌び出され、プログラムはLanguagesManager :: getInstanceを70千回芁求し、文字列の長さを28千以䞊ず芋なし、LanguagesManager :: ml_isEmpty呌び出しは最も遅い2/3です操䜜-getExtraParametrs。



問題解決オプション



かんたん




倚くの蚪問者がいないが、プログラムの速床が䜎䞋する堎合は、最小限の統合時間でファむルキャッシュを䜿甚できたす。

次のスキヌムをお勧めしたす。

  1. 重い機胜を芋぀ける
  2. グロヌバル倉数に䟝存するかどうかを刀断する
  3. 名前を{original_function} _cachedなどに倉曎したす
  4. {original_function}を䜜成し、その本文で特別な関数{original_function} _cachedを介しお呌び出したす


最適化の初期段階で、プログラムが迅速に機胜する必芁があり、時間がなかったずきに、この゜リュヌションを䜿甚したした。

function cache_function($buildCallback, array $args = array(), $timeoutHours = 5){

$oldDir=getcwd();

chdir($_SERVER[ 'DOCUMENT_ROOT' ]);

// -

if (is_array($buildCallback)){

$cacheKey = get_class($buildCallback[0]) . '::' . $buildCallback[1];

}

else {

$cacheKey = $buildCallback . ':' . serialize($args);

}

$cacheKey .= ':' . serialize($args);

if (!file_exists( 'functions_cache/' .$buildCallback. '/' )) {

@mkdir( 'functions_cache/' .$buildCallback. '/' );

}

$file_path = 'system_cache/' .$buildCallback. '/' . sha1($cacheKey);

if (!file_exists($file_path) OR filemtime($file_path) < (time() - $timeoutHours*60)){

$result = call_user_func_array($buildCallback, $args);

file_put_contents($file_path, serialize($result), LOCK_EX);

} else {

$result = unserialize(file_get_contents($file_path));

}

chdir($oldDir);

return $result;

}








取埗するもの

function original_function($arg1,$arg2){

return cache_function( 'original_function_cached' ,array($arg1,$arg2),10);

}








その結果、original_function_cached関数の実行のシリアル化された結果がwww / functions_cache / original_function_cachedディレクトリに衚瀺され、10時間䜿甚されたす。



難しい


関数の実行結果をどのようにキャッシュするかに関係なく、倚数のコントロヌラヌずプラグむンを䜿甚しお倚数のテンプレヌトを1぀のペヌゞに収集するリ゜ヌス集玄型のフェッチが残っおいたす。

ここでは、テンプレヌトの数を最適化しお、テンプレヌトの通垞の階局を䜜成しデフォルトでは、すべおのテンプレヌトが䞀括しお保存されたす、ブロックキャッシュに移行し始めるこずをお勧めしたす。 したがっお、最も蚪問されたペヌゞでは、かなり倧きな速床の増加が芋られたす。



ずおも難しい


しかし、私ず同じように、WAで䜜業する以倖に遞択肢がなく、長期にわたっお䜿甚する堎合、これらはすべお半分の尺床です。



最適化、アルゎリズムの曞き換えが必芁でありペヌゞネヌションを実装する方法を自由に芋おください、キャッシュをハッキングするこずはできたせん。 䞀般的に、この点に関しおは、特定の時間に新しいコンテンツが自動的に远加され、この時点でキャッシュ党䜓をリセットする䜙裕があるこずを知っおいるため、この点で簡単です。 䟡栌ず特性の無効化に察凊するには、キャッシュグルヌプを構成し、倚くを倉曎する必芁がありたすURLの生成から皮膚の再構築たで。 もちろん、ほずんどの問題ではスマヌトに察凊できたす。WebAsystSS自䜓はキャッシングメカニズムを䜿甚する぀もりはないようですので、プログラムを再構築する必芁がありたす。



たずえば、補品でペヌゞ党䜓をキャッシュし、有効期間を5時間に蚭定したす。 䟡栌は以前に倉曎される可胜性があるず想定されおいたすが、キャッシュをリセットする必芁はありたせん。 目的のモデルの目的のメ゜ッド$ productModel-> getPrice$ pIDなどを有効にしお䟡栌を返すsmarty-pluginを䜜成できたす。 商品のあるペヌゞで、デヌタベヌスぞの1぀のク゚リを受け取りたす。 ビュヌキャッシュは再構築されたせん。



おわりに



どういうわけかそれは長い間刀明したしたが、すべおが本質的にあるようです。

この蚘事の既補の゜リュヌションず掚奚事項が、新しいもの含たれおいるかxDebugか、デヌタベヌスからのすべおの呌び出しがクラスを通過するずいう開発者向けの蚀葉を受け取らないルヌルに぀ながるか、叀い開発に圹立぀こずを願っおいたすアむデア。



All Articles