0 follower

Zwiększanie wydajności

Na wydajność aplikacji sieciowych ma wpływ wiele czynników. Dostęp do baz danych, operacje na plikach, przepustowość sieci, wszystkie z nich potencjalnie są tymi czynnikami. Yii stara się w każdym aspekcie redukować wpływy na wydajność powodowane przez framework. Mimo to, jest wiele miejsc w aplikacji użytkownika, które mogą zostać poprawione by zwiększyć wydajność.

1. Włączanie rozszerzenia APC

Włączenie rozszerzenia PHP APC jest prawdopodobnie najłatwiejszym sposobem zwiększenia całkowitej wydajności aplikacji. Rozszerzenie to buforuje oraz optymalizuje pośredni kod PHP unikając w ten sposób, czasu poświęconego na parsowanie skryptu PHP wraz z każdym nadchodzącym żądaniem.

2. Wyłączanie trybu debugowania

Wyłączenie trybu debugowania jest kolejnym prostym sposobem na poprawienie wydajności aplikacji. Aplikacja Yii działa w trybie debugowania, jeśli stała YII_DEBUG jest zdefiniowana jako wartość true. Tryb debugowania jest użyteczny w trakcie fazy tworzenia aplikacji, jednakże wpływa on na wydajność, ponieważ część komponentów powoduje dodatkowe obciążenia. Na przykład, logger komunikatów może zapisywać dodatkowe informacje dla każdego logowanego komunikatu.

3. Używanie yiilite.php

Jeśli rozszerzenie PHP APC jest włączone, możemy zastąpić yii.php innym plikiem inicjalizującym (ang. bootstrap) yiilite.php aby później zwiększyć wydajność aplikacji opartych o Yii.

Plik yiilite.php dostarczany jest wraz z każdym wydaniem Yii. Jest on rezultatem połączenia pewnych często używanych w Yii plików klas. Zarówno komentarze oraz wyrażenia śledzenia (trace) są usuwane z tego połączonego pliku. Dlatego też używanie yiilite.php spowoduje redukcję ilości plików dołączanych oraz uniknięcie wywołań wyrażeń śledzenia (trace).

Zauważ, że używanie yiilite.php bez APC, może zmniejszyć wydajność ponieważ yiilite.php zawiera on część klas, które niekoniecznie używane są w każdym żądaniu, przez co zwiększają one czas parsowania. Zauważono również, że używanie yiilite.php jest wolniejsze dla pewnych konfiguracji serwera, nawet jeśli włączone jest APC. Najlepszym sposobem rozstrzygnięcia czy używać yiilite.php czy też nie jest uruchomienie benchmarku używającego załączone do Yii demo hello world.

4. Używanie technik buforowania

Tak jak to opisano w sekcji buforowanie, Yii dostarcza kilka rozwiązań związanych z buforowaniem, które mogą zwiększyć w znacznym stopniu wydajność aplikacji sieciowej. Jeśli generowanie pewnych danych zabiera wiele czasu, możemy użyć techniki buforowania danych w celu zredukowania częstotliwości generowania danych; jeśli część strony pozostaje relatywnie statyczna możemy użyć techniki buforowania fragmentarycznego w celu zredukowania częstotliwości renderowania tego fragmentu; jeżeli cała strona pozostaje relatywnie statyczna, możemy użyć techniki buforowania strony w celu zredukowania kosztu generowania całej strony.

Jeśli aplikacja używa rekordu aktywnego powinniśmy włączyć buforowanie schematu bazy danych by zmniejszyć czas parsowania schematu bazy danych. Można to uczynić poprzez skonfigurowanie właściwości CDbConnection::schemaCachingDuration nadając jej wartość większą niż 0.

Poza wymienionymi technikami buforowania na poziomie aplikacji, możemy również skorzystać z rozwiązań na poziomie serwera w celu poprawienia wydajności aplikacji. Buforowanie APC, które wcześniej opisaliśmy bezsprzecznie należy do tej kategorii. Wyróżnia się tutaj inne techniki, między innymi takie jak Zend Optimizer, eAccelerator, Squid.

5. Optymalizacja bazy danych

Pobieranie danych z bazy danych jest często główną przyczyną wąskich gardeł wydajnościowych w aplikacjach internetowych. Chociaż używanie buforowanie może złagodzić zakłócenie wydajności nie rozwiązuje one w pełni problemu. Jeśli baza danych zawiera ogromne ilości danych
a dane zbuforowane są niepoprawne, pobieranie dużej ilości danych może być nadmiernie kosztowne bez właściwego zaprojektowania bazy danych oraz zapytań.

Twórz indeksy w bazach danych mądrze. Indeksowanie może uczynić zapytania z SELECT dużo szybszymi, ale może spowolnić zapytania INSERT, UPDATE czy też DELETE.

W przypadku złożonych zapytań rekomenduje się utworzenie w bazie danej widoku dla nich zamiast wywoływania zapytań z poziomu kodu PHP i proszenia DBMS o każdorazowe (powtarzające się) ich parsowanie.

Nie nadużywaj rekordu aktywnego. Chociaż rekord aktywny jest dobry w modelowaniu danych w stylu obiektowym (OOP), faktycznie obniża on
wydajność ze względu na to, iż potrzebuje utworzyć jeden lub więcej obiektów do reprezentowania każdego wiersza wyniku zapytania. Dla aplikacji intensywnie używających danych używanie DAO lub też API bazy danych na niższym poziomie może być lepszym wyborem.

Nie mniej ważnym jest używanie LIMIT w zapytaniach SELECT. Pozwala to unikania
pobierania przytłaczającej ilości danych z bazy danych oraz wyczerpywania pamięci
przydzielonej dla PHP.

6. Minimalizacja rozmiaru plików skryptów

Złożone strony często potrzebują dołączać wiele zewnętrznych plików zawierających JavaScript oraz CSS. Ponieważ każdy z plików spowoduje dodatkowy ruch do i z serwera, powinniśmy zminimalizować ilość plików skryptów poprzez połączenie ich w mniejszą ilość. Powinniśmy również rozważyć zmniejszenie rozmiaru każdego z plików skryptu w celu zmniejszenia czasu przesyłu w sieci. Istnieje wiele narzędzi, które pomogą w tych dwóch aspektach.

Dla stron generowanych przez Yii istnieje możliwość, że znajdują się tam pewne pliki skryptów generowane przez komponenty, których nie chcemy modyfikować (np. rdzenne komponenty Yii, komponenty stron trzecich). W celu minimalizacji tych plików skryptów, potrzebujemy wykonać dwa kroki.

Uwaga: Funkcjonalność scriptMap, która zostanie opisana poniżej została udostępniona wraz z wersją 1.0.3.

Najpierw deklarujemy, które pliki chcemy zminimalizować poprzez skonfigurowanie właściwości
scriptMap komponentu aplikacji clientScript. Możemy to zrobić zarówno w konfiguracji aplikacji jak i w kodzie. Na przykład:

$cs=Yii::app()->clientScript;
$cs->scriptMap=array(
    'jquery.js'=>'/js/all.js',
    'jquery.ajaxqueue.js'=>'/js/all.js',
    'jquery.metadata.js'=>'/js/all.js',
    ......
);

To co wykonuje powyższy kod, to mapowanie tych plików JavaScript do adresu URL /js/all.js. Jeśli któryś z tych plików JavaScript będzie musiał być dołączony przez, któryś z komponentów, Yii załączy (raz) URL zamiast kolejnego załączania poszczególnych plików skryptu.

Po drugie, potrzebujemy użyć pewnych narzędzi do połączenia (i prawdopodobnie skompresowania) plików JavaScript w jeden oraz zapisanie go jako js/all.js.

Ten sam plik ma zastosowanie dla plików CSS.

Możemy również poprawić prędkość ładowania strony przy pomocy Google AJAX Libraries API. Na przykład, możemy załączyć plik jquery.js z serwera Google zamiast z naszego własnego. Aby to zrobić, najpierw konfigurujemy właściwość scriptMap w następujący sposób,

$cs=Yii::app()->clientScript;
$cs->scriptMap=array(
    'jquery.js'=>false,
    'jquery.ajaxqueue.js'=>false,
    'jquery.metadata.js'=>false,
    ......
);

Poprzez zmapowanie tych plików skryptu do wartości false, powstrzymujemy Yii od generowania kodu potrzebnego do załączenia tych plików. W zamian, piszemy następujący kod na naszej stronie aby bezpośrednio dołączyć pliki skryptów ze strony Google:

<head>
<?php echo CGoogleApi::init(); ?>
 
<?php echo CHtml::script(
    CGoogleApi::load('jquery','1.3.2') . "\n" .
    CGoogleApi::load('jquery.ajaxqueue.js') . "\n" .
    CGoogleApi::load('jquery.metadata.js')
); ?>
......
</head>