Browse Source
* caching fragment * guide PL Previous sections update Tutorial: shared hostingtags/2.0.8
Bizley
9 years ago
committed by
Dmitry Naumenko
12 changed files with 360 additions and 38 deletions
@ -0,0 +1,165 @@
|
||||
Pamięć podręczna fragmentów |
||||
=========================== |
||||
|
||||
Pamięć podręczna fragmentów dotyczy zapisywania w pamięci podręcznej części strony Web. Dla przykładu, jeśli strona wyświetla podsumowanie danych rocznej sprzedaży w postaci tabeli, |
||||
można tę tabelę zapisać w pamięci podręcznej, aby wyeliminować konieczność generowania jej za każdym razem od nowa. Mechanizm pamięci podręcznej fragmentów zbudowany jest w oparciu |
||||
o [pamięć podręczną danych](caching-data.md). |
||||
|
||||
Aby wykorzystać pamięć podręczną fragmentów, należy użyć następującego kodu w [widoku](structure-views.md): |
||||
|
||||
```php |
||||
if ($this->beginCache($id)) { |
||||
|
||||
// ... generowanie zawartości w tym miejscu ... |
||||
|
||||
$this->endCache(); |
||||
} |
||||
``` |
||||
|
||||
Jak widać, chodzi tu o zamknięcie bloku generatora zawartości pomiędzy wywołaniem metod [[yii\base\View::beginCache()|beginCache()]] i [[yii\base\View::endCache()|endCache()]]. |
||||
Jeśli wskazana zawartość zostanie odnaleziona w pamięci podręcznej, [[yii\base\View::beginCache()|beginCache()]] wyrenderuje zapisaną zawartość i zwróci false, przez co pominie |
||||
blok jej generowania. W przeciwnym wypadku generowanie zostanie uruchomione, a w momencie wywołania [[yii\base\View::endCache()|endCache()]] wygenerowana zawartość zostanie zapisana |
||||
w pamięci podręcznej. |
||||
|
||||
Tak, jak w przypadku [pamięci podręcznej danych](caching-data.md), unikalne `$id` jest wymagane do identyfikacji zawartości. |
||||
|
||||
|
||||
## Opcje zapisu w pamięci podręcznej <span id="caching-options"></span> |
||||
|
||||
Możesz określić dodatkowe opcje zapisu pamięci podręcznej fragmentów, przekazując tablicę opcji jako drugi parametr w metodzie [[yii\base\View::beginCache()|beginCache()]]. |
||||
Opcje te będą użyte do skonfigurowania widżetu [[yii\widgets\FragmentCache|FragmentCache]], który implementuje właściwą funkcjonalność zapisu pamięci podręcznej. |
||||
|
||||
### Czas życia <span id="duration"></span> |
||||
|
||||
Prawdopodobnie najczęściej używaną opcją zapisu fragmentów jest [[yii\widgets\FragmentCache::duration|duration]]. |
||||
Parametr ten określa, przez ile sekund zawartość może być przechowywana w pamięci podręcznej, zanim konieczne będzie wygenerowanie jej ponownie. Poniższy kod zapisuje fragment |
||||
zawartości w pamięci podręcznej na maksymalnie godzinę: |
||||
|
||||
```php |
||||
if ($this->beginCache($id, ['duration' => 3600])) { |
||||
|
||||
// ... generowanie zawartości w tym miejscu ... |
||||
|
||||
$this->endCache(); |
||||
} |
||||
``` |
||||
|
||||
Jeśli ta opcja nie jest określona, przyjmuje domyślną wartość 60, co oznacza, że ważność zapisanej zawartości wygaśnie po upływie 60 sekund. |
||||
|
||||
|
||||
### Zależności <span id="dependencies"></span> |
||||
|
||||
Tak, jak w przypadku [pamięci podręcznej danych](caching-data.md#cache-dependencies), zapis fragmentów może opierać się na zależnościach. |
||||
Dla przykładu, zawartość wyświetlanego posta zależy od tego, czy został on zmodyfikowany, bądź nie. |
||||
|
||||
Aby określić zależność, należy ustawić opcję [[yii\widgets\FragmentCache::dependency|dependency]], która może przyjąć postać zarówno obiektu klasy [[yii\caching\Dependency|Dependency]], |
||||
jak i tablicy konfiguracyjnej, służacej do utworzenia obiektu zależności. Poniższy kod określa pamięć podręczną fragmentu jako zależną od zmiany wartości kolumny `updated_at`: |
||||
|
||||
```php |
||||
$dependency = [ |
||||
'class' => 'yii\caching\DbDependency', |
||||
'sql' => 'SELECT MAX(updated_at) FROM post', |
||||
]; |
||||
|
||||
if ($this->beginCache($id, ['dependency' => $dependency])) { |
||||
|
||||
// ... generowanie zawartości w tym miejscu ... |
||||
|
||||
$this->endCache(); |
||||
} |
||||
``` |
||||
|
||||
|
||||
### Wariacje <span id="variations"></span> |
||||
|
||||
Zapisana zawartość może mieć kilka wersji, zależnych od niektórych parametrów. Przykładowo, w aplikacji Web wspierającej kilka języków, ten sam fragment kodu w widoku może generować |
||||
zawartość w różnych językach. Z tego powodu wymagana może być konieczność zapisu zawartości w wariacji zależnej od aktualnie wybranego języka aplikacji. |
||||
|
||||
Aby określić wariacje pamięci podręcznej, ustaw opcję [[yii\widgets\FragmentCache::variations|variations]], która powinna mieć postać tablicy wartości skalarnych, z których każda |
||||
będzie reprezentować odpowiedni czynnik modyfikujący wersję. Dla prykładu, aby zapisać zawartość w zależności od języka, możesz użyć następującego kodu: |
||||
|
||||
```php |
||||
if ($this->beginCache($id, ['variations' => [Yii::$app->language]])) { |
||||
|
||||
// ... generowanie zawartości w tym miejscu ... |
||||
|
||||
$this->endCache(); |
||||
} |
||||
``` |
||||
|
||||
|
||||
### Warunkowe uruchamianie pamięci podręcznej <span id="toggling-caching"></span> |
||||
|
||||
Czasem konieczne może być uruchamianie pamięci podręcznej fragmentów tylko w przypadku, gdy spełnione są określone warunki. Przykładowo, dla strony zawierającej formularz, |
||||
pożądane może być zapisanie i wyświetlenie go z pamięci podręcznej tylko w momencie pierwszego pobrania jego treści (poprzez żądanie GET). Każde kolejne żądanie wyświetlenia formularza |
||||
(już za pomocą metody POST) nie powinno być zapisane w pamięci, ponieważ może zawierać dane podane przez użytkownika. |
||||
Aby użyć takiego mechanizmu, należy ustawić opcję [[yii\widgets\FragmentCache::enabled|enabled]], jak w przykładzie poniżej: |
||||
|
||||
```php |
||||
if ($this->beginCache($id, ['enabled' => Yii::$app->request->isGet])) { |
||||
|
||||
// ... generowanie zawartości w tym miejscu ... |
||||
|
||||
$this->endCache(); |
||||
} |
||||
``` |
||||
|
||||
|
||||
## Zagnieżdżony zapis w pamięci <span id="nested-caching"></span> |
||||
|
||||
Fragmenty zapisane w pamięci podręcznej mogą być zagnieżdżane. Oznacza to, że zapisany fragment może być częścią innego, również zapisanego w pamięci podręcznej. |
||||
Przykładowo, komentarze mogą być zapisane jako fragmenty w pamięci podręcznej, które z kolei w całości również są zapisane jako większy fragment w pamięci. |
||||
Poniższy kod pokazuje, w jaki sposób można zagnieździć dwa fragmenty w pamięci podręcznej: |
||||
|
||||
```php |
||||
if ($this->beginCache($id1)) { |
||||
|
||||
// ... generowanie zawartości ... |
||||
|
||||
if ($this->beginCache($id2, $options2)) { |
||||
|
||||
// ... generowanie zawartości ... |
||||
|
||||
$this->endCache(); |
||||
} |
||||
|
||||
// ... generowanie zawartości ... |
||||
|
||||
$this->endCache(); |
||||
} |
||||
``` |
||||
|
||||
Zagnieżdżone fragmenty mogą mieć różne opcje zapisu. Dla przykładu, wewnętrzny i zewnętrzy fragment może mieć inną wartość czasu życia. Nawet w przypadku, gdy zawartość zapisana |
||||
w zewnętrznym fragmencie straci ważność, wewnętrzny fragment wciąż będzie pobierany z pamięci. Nie zadziała to jednak w przeciwnym przypadku - dopóki zewnętrzny fragment będzie ważny, |
||||
będzie zwracał tą samą zawartość za każdym razem, niezależnie od tego, czy zawartość wewnętrznego fragmentu już wygasła, czy nie. Z tego powodu należy zwrócić szczególną ostrożność |
||||
przy ustalaniu czasu życia lub zależności zagnieżdżonych fragmentów, ponieważ "stara" zawartość może być wciąż niezamierzenie przechowywana w zewnętrznym fragmencie. |
||||
|
||||
|
||||
## Dynamiczna zawartość <span id="dynamic-content"></span> |
||||
|
||||
Używając pamięci podręcznej fragmentów, można napotkać na sytuację, kiedy duża część zawartości strony jest względnie statyczna z wyjątkiem kilku nielicznych miejsc. |
||||
Przykładowo, nagłówek strony może wyświetlać pasek głównego menu razem z imieniem aktualnie zalogowanego użytkownika. Innym kłopotem może być to, że zapisywana w pamięci zawartość |
||||
może zawierać kod PHP, który musi być wykonany dla każdego żądania (np. kod rejestrujący paczkę assetów). W obu tych przypadkach pomoże nam skorzystanie z funkcjonalności tzw. |
||||
*dynamicznej zawartości*. |
||||
|
||||
Dynamiczna zawartość oznacza fragment zwrotki, który nie powinien zostać zapisany w pamięci podręcznej, nawet jeśli znajduje się w bloku objętym zapisem. Aby określić zawartość jako |
||||
dynamiczną, musi być ona generowana poprzez wykonanie jakiegoś kodu PHP dla każdego zapytania, nawet jeśli całość fragmentu serwowana jest z pamięci podręcznej. |
||||
|
||||
Możesz wywołać metodę [[yii\base\View::renderDynamic()|renderDynamic()]] wewnątrz zapisywanego fragmentu, aby wstawić w danym miejscu zawartość dynamiczną, jak w przykładzie poniżej: |
||||
|
||||
```php |
||||
if ($this->beginCache($id1)) { |
||||
|
||||
// ... generowanie zawartości ... |
||||
|
||||
echo $this->renderDynamic('return Yii::$app->user->identity->name;'); |
||||
|
||||
// ... generowanie zawartości ... |
||||
|
||||
$this->endCache(); |
||||
} |
||||
``` |
||||
|
||||
Metoda [[yii\base\View::renderDynamic()|renderDynamic()]] przyjmuje jako parametr kod PHP. |
||||
Wartość zwracana przez ten kod jest traktowana jako zawartość dynamiczna. Ten sam kod PHP będzie wykonany dla każdego zapytania, niezależnie od tego, czy obejmujący go fragment będzie |
||||
pobierany z pamięci podręcznej czy też nie. |
@ -0,0 +1,116 @@
|
||||
Współdzielone środowisko hostujące |
||||
================================== |
||||
|
||||
Współdzielone środowiska hostujące są często ograniczone, jeśli chodzi o możliwości ich konfiguracji i struktury folderów. Pomimo to, wciąż, w większości przypadków, |
||||
możesz w takim środowisku uruchomić Yii 2.0 po kilku drobnych modyfikacjach. |
||||
|
||||
Wdrożenie podstawowej aplikacji |
||||
------------------------------- |
||||
|
||||
W standardowym współdzielonym środowisku hostującym jest zwykle tylko jeden główny folder publiczny (webroot), zatem wygodniej jest stosować podstawowy szablon projektu. |
||||
Korzystając z instrukcji w sekcji [Instalowanie Yii](start-installation.md), zainstaluj taki szablon lokalnie. Po udanej instalacji, dokonamy kilku modyfikacji, aby aplikacji |
||||
mogła działać na współdzielonym środowisku. |
||||
|
||||
### Zmiana nazwy webroota <span id="renaming-webroot"></span> |
||||
|
||||
Połącz się ze swoim współdzielonym hostem za pomocą np. klienta FTP. Prawdopodobnie zobaczysz listę folderów podobną do poniższej. |
||||
|
||||
``` |
||||
config |
||||
logs |
||||
www |
||||
``` |
||||
|
||||
W tym przykładzie, `www` jest folderem webroot. Folder ten może mieć różne nazwy, zwykle stosowane są: `www`, `htdocs` i `public_html`. |
||||
|
||||
Webroot w naszym podstawowym szablonie projektu nazywa się `web`. Przed skopiowaniem aplikacji na serwer, zmień nazwę lokalnego folderu webroot, aby odpowiadała folderowi |
||||
na serwerze, czyli z `web` na `www`, `public_html` lub na inną nazwę, która używana jest na serwerze. |
||||
|
||||
### Folder root FTP jest zapisywalny |
||||
|
||||
Jeśli masz prawa zapisu w folderze poziomu root, czyli tam, gdzie znajdują się foldery `config`, `logs` i `www`, skopiuj foldery `assets`, `commands` itd. bezpośrednio w to |
||||
miejsce. |
||||
|
||||
### Dodatkowe opcje serwera <span id="add-extras-for-webserver"></span> |
||||
|
||||
Jeśli Twój serwer to Apache, będziesz musiał dodać plik `.htaccess` z poniższą zawartością do folderu `web` (czy też `public_html`, bądź jakakolwiek jest jego nazwa), |
||||
gdzie znajduje się plik `index.php`: |
||||
|
||||
``` |
||||
Options +FollowSymLinks |
||||
IndexIgnore */* |
||||
|
||||
RewriteEngine on |
||||
|
||||
# jeśli katalog lub plik istnieje, użyj go bezpośrednio |
||||
RewriteCond %{REQUEST_FILENAME} !-f |
||||
RewriteCond %{REQUEST_FILENAME} !-d |
||||
|
||||
# w innym przypadku przekieruj żądanie na index.php |
||||
RewriteRule . index.php |
||||
``` |
||||
|
||||
W przypadku serwera nginx nie powinieneś potrzebować dodatkowego pliku konfiguracyjnego. |
||||
|
||||
### Sprawdzenie wymagań |
||||
|
||||
Aby uruchomić Yii, Twój serwer musi spełniać jego wymagania. Minimalnym wymaganiem jest PHP w wersji 5.4. Możesz sprawdzić wszystkie wymagania, kopiując plik |
||||
`requirements.php` z folderu root do folderu webroot i uruchamiając go w przeglądarce pod adresem `http://example.com/requirements.php`. |
||||
Nie zapomnij o skasowaniu tego pliku po sprawdzeniu wymagań. |
||||
|
||||
|
||||
Wdrożenie zaawansowanej aplikacji |
||||
--------------------------------- |
||||
|
||||
Wdrażanie zaawansowanej aplikacji na współdzielonym środowisku jest odrobinę bardziej problematyczne, niż w przypadku podstawowej aplikacji, ponieważ wymaga ona dwóch folderów |
||||
webroot, czego zwykle nie wspierają serwery środowisk współdzielonych. Będziemy musieli odpowiednio dostosować strukturę folderów. |
||||
|
||||
### Przeniesienie skryptów wejściowych do jednego folderu webroot |
||||
|
||||
Na początek potrzebujemy folderu webroot. Stwórz nowy folder i nazwij go tak, jak webroot docelowego serwera, jak opisane zostało to w |
||||
[Zmiana nazwy webroota](#renaming-webroot) powyżej, np. `www` czy też `public_html`. Następnie utwórz poniższą strukturę, gdzie `www` jest folderem webroot, |
||||
który właśnie stworzyłeś: |
||||
|
||||
``` |
||||
www |
||||
admin |
||||
backend |
||||
common |
||||
console |
||||
environments |
||||
frontend |
||||
... |
||||
``` |
||||
|
||||
`www` będzie naszym folderem frontend, zatem przenieś tam zawartość `frontend/web`. Do folderu `www/admin` przenieś zawartość `backend/web`. |
||||
W każdym przypadku będziesz musiał zmodyfikować ścieżki w plikach `index.php` i `index-test.php`. |
||||
|
||||
### Rozdzielone sesje i ciasteczka |
||||
|
||||
Backend i frontend zostały stworzone z myślą o uruchamianiu ich z poziomu oddzielnych domen. Jeśli uruchamiamy je z poziomu jednej domeny, frontend i backend będą dzielić |
||||
te same ciasteczka, co może wywołać konflikty. Aby temu zapobiec, zmodyfikuj backendową konfigurację aplikacji `backend/config/main.php` jak poniżej: |
||||
|
||||
```php |
||||
'components' => [ |
||||
'request' => [ |
||||
'csrfParam' => '_backendCSRF', |
||||
'csrfCookie' => [ |
||||
'httpOnly' => true, |
||||
'path' => '/admin', |
||||
], |
||||
], |
||||
'user' => [ |
||||
'identityCookie' => [ |
||||
'name' => '_backendIdentity', |
||||
'path' => '/admin', |
||||
'httpOnly' => true, |
||||
], |
||||
], |
||||
'session' => [ |
||||
'name' => 'BACKENDSESSID', |
||||
'cookieParams' => [ |
||||
'path' => '/admin', |
||||
], |
||||
], |
||||
], |
||||
``` |
Loading…
Reference in new issue