Home > Article > Backend Development > Yii Framework Official Guide Series 52 - Special Topic: Performance Tuning
#The performance of web applications is affected by many factors. Database access, file system operations, network bandwidth, etc. are all potential influencing factors. Yii has reduced the performance impact of frameworks in various aspects. But there are still many places in user applications that can be improved to improve performance.
Enabling PHP APC extension is probably the easiest way to improve the overall performance of an application. This extension caches and optimizes PHP intermediate code and avoids the time spent reparsing PHP scripts for each new request.
Disabling debug mode is another easy way to improve performance. If the constant YII_DEBUG
is set to true, this Yii application will run in debug mode. Debug mode is useful during the development phase, but it affects performance because some components cause additional system overhead. For example, the message logger will log additional debugging information for each logged message.
yiilite.php
When the PHP APC extension is enabled, we can replace yii.php
with another one named yiilite.php
boot file to further improve the performance of Yii-powered applications.
The file yiilite.php
is included with every Yii distribution. It is a merged file of some commonly used Yii class files. In the file, comments and trace statements are stripped. Therefore, using yiilite.php
will reduce the number of files being referenced and avoid executing trace statements.
Note that using yiilite.php
without enabling APC will actually reduce performance because yiilite.php
contains some classes that are not required for every request. This will take extra parsing time. Also note that using yiilite.php
will be slower on some server configurations, even if APC is turned on. It's best to run a benchmark using hello world
from the demo to decide whether to use yiilite.php
.
As mentioned in the Caching chapter, Yii provides several caching solutions that can effectively improve performance. If the generation of some data takes a long time, we can use the data cache method to reduce the frequency of data generation; if a part of the page remains relatively fixed, we can use the fragment cache method to reduce its rendering frequency; if an entire page remains relatively fixed, Fixed, we can use page caching method to save the cost of page rendering.
If the application is using Active Record, we should turn on the data structure cache to save time in parsing the data table structure. This can be accomplished by setting the CDbConnection::schemaCachingDuration property to a value greater than 0.
In addition to these application-level caching technologies, we can also use service-level caching solutions to improve application performance. In fact, the PHP APC cache we described earlier falls into this category. There are also other server technologies, such as Zend Optimizer, eAccelerator, Squid, and others are not listed one by one.
Retrieving data from the database is often the main bottleneck of a network application. Although using caching can reduce performance penalties, it does not solve the underlying problem. When the database contains a large amount of data and the cached data is invalid, obtaining the latest data will be very resource-intensive without good database and query optimization design.
Smartly design indexes in a database. An index can make SELECT
queries faster, but it will make INSERT
, UPDATE
or DELETE
queries slower.
For complex queries, it is recommended to create a database view for it, rather than generating query statements through PHP code and letting the DBMS parse them repeatedly.
Don’t abuse Active Record. Although Active Record is good at modeling data in an OOP style, it actually reduces performance because it requires creating one or several objects to represent each query result. For data-intensive applications, using a DAO or database interface under the hood would be a better choice.
Last but not least, use LIMIT
in your SELECT
query. This will avoid fetching too much data from the database and exhausting the memory allocated for PHP.
Complex pages often require the introduction of many external JavaScript and CSS files. Because each file will cause an extra round trip, we should minimize the number of script files by combining files. We should also consider reducing the size of each script file to reduce network transfer time. There are many tools to help improve both aspects.
For a Yii generated page, the exception is some script files rendered by components that we do not want to change (such as Yii core components, third-party components). To minimize these script files, we need two steps.
Note: The
scriptMap
features described below have been supported since version 1.0.3.
First, declare that the script is minimized by configuring the scriptMap attribute of the application component clientScript. This can be done in the application configuration or configured in code. For example,
$cs=Yii::app()->clientScript; $cs->scriptMap=array( 'jquery.js'=>'/js/all.js', 'jquery.ajaxqueue.js'=>'/js/all.js', 'jquery.metadata.js'=>'/js/all.js', ...... );
What the above code does is map these JavaScript files to the URL /js/all. js
. If any of these JavaScript files need to be imported by some component, Yii will import this URL (once) instead of each individual script file.
Secondly, we need to use some tool to combine (and compress) the JavaScript files into a single file and save it as js/all.js
.
The same technique also works for CSS files.
With the help of Google AJAX Libraries API we can improve page loading speed. For example, we can import jquery.js
from Google's servers instead of our own. To do this, we first configure scriptMap
as follows,
$cs=Yii::app()->clientScript; $cs->scriptMap=array( 'jquery.js'=>false, 'jquery.ajaxqueue.js'=>false, 'jquery.metadata.js'=>false, ...... );
by mapping these false for script files, we prevent Yii from generating code that imports these files. As an alternative, we write the following code in the page to directly import the file from 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>
The above is the Yii Framework Official Guide Series 52 - Special Topic: Performance Tuning Content, more related content Please pay attention to the PHP Chinese website (www.php.cn)!