diff --git a/docs/guide/performance.md b/docs/guide/performance.md index 42aa042..9309c2c 100644 --- a/docs/guide/performance.md +++ b/docs/guide/performance.md @@ -28,9 +28,10 @@ logger may record additional debug information for every message being logged. ### Enabling PHP opcode cache Enabling the PHP opcode cache improves any PHP application performance and lowers -memory usage significantly. Yii is no exception. It was tested with -[APC PHP extension](http://php.net/manual/en/book.apc.php) that caches -and optimizes PHP intermediate code and avoids the time spent in parsing PHP +memory usage significantly. Yii is no exception. It was tested with both +[PHP 5.5 OPcache](http://php.net/manual/en/book.opcache.php) and +[APC PHP extension](http://php.net/manual/en/book.apc.php). Both cache +and optimize PHP intermediate code and avoid the time spent in parsing PHP scripts for every incoming request. ### Turning on ActiveRecord database schema caching @@ -69,7 +70,10 @@ Note that `cache` application component should be configured. ### Combining and Minimizing Assets -TBD +It is possible to combine and minimize assets, typically JavaScript and CSS, in order to slightly improve page load +time and therefore deliver better experience for end user of your application. + +In order to learn how it can be achieved, refer to [assets](assets.md) guide section. ### Using better storage for sessions @@ -118,7 +122,38 @@ save the rendering cost for the whole page. ### Leveraging HTTP to save processing time and bandwidth -TBD +Leveraging HTTP caching saves both processing time, bandwidth and resources significantly. It can be implemented by +sending either `ETag` or `Last-Modified` header in your application response. If browser is implemented according to +HTTP specification (most browsers are), content will be fetched only if it is different from what it was prevously. + +Forming proper headers is time consuming task so Yii provides a shortcut in form of controller filter +[[\yii\web\HttpCache]]. Using it is very easy. In a controller you need to implement `behaviors` method like +the following: + +```php +public function behaviors() +{ + return [ + 'httpCache' => [ + 'class' => \yii\web\HttpCache::className(), + 'only' => ['list'], + 'lastModified' => function ($action, $params) { + $q = new Query(); + return strtotime($q->from('users')->max('updated_timestamp')); + }, + // 'etagSeed' => function ($action, $params) { + // return // generate etag seed here + //} + ], + ]; +} +``` + +In the code above one can use either `etagSeed` or `lastModified`. Implementing both isn't necessary. The goal is to +determine if content was modified in a way that is cheaper than fetching and rendering that content. `lastModified` +should return unix timestamp of the last content modification while `etagSeed` should return a string that is then +used to generate `ETag` header value. + ### Database Optimization @@ -140,7 +175,7 @@ to create one or several objects to represent each row of query result. For data intensive applications, using DAO or database APIs at lower level could be a better choice. -Last but not least, use LIMIT in your SELECT queries. This avoids fetching +Last but not least, use `LIMIT` in your `SELECT` queries. This avoids fetching overwhelming data from database and exhausting the memory allocated to PHP. ### Using asArray