Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding template cache handling #146

Open
wants to merge 2 commits into
base: gh-pages
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions 1.8/development/plugins/creating-modifying-templates.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,3 +94,46 @@ global $user;

$user['favorite_colour'] = 'Blue';
```

## Caching Templates
Don't forget to cache the template. This is important for pages with big load and prevent the database server from extra queries.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caching templates is important to optimize the load on your server's database and to avoid performing extra queries.


### Caching a template
A simple way to cache an template only at the place where it's needed is to use the `THIS_SCRIPT` definition.
Copy link

@Shade- Shade- Mar 23, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In order to cache a template you just need to add it to the $templatelist variable, a coma-separated list of templates which is then used by MyBB's core to fetch templates using a single database query. The aforementioned fetch occurs in global.php and the only hook available before is global_start. A proper way to cache a template would then be:

$plugins->run_hooks('global_start', 'myplugin_cache_templates');
function myplugin_cache_templates()
{
    global $templatelist;

    if(isset($templatelist))
    {
        $templatelist .= ',';
    }
    else
    {
        $templatelist = '';
    }

    $templatelist .= 'hello_world_template';
}

You typically use templates in specific locations. You can avoid caching templates globally and cache them in certain pages by checking against the THIS_SCRIPT definition. For example, a template might be needed just in the postbit, therefore you can check if the user is watching showthread.php or not:

if(THIS_SCRIPT == 'showthread.php')
{
    // Cache templates
}

For example, the template is needed in the postbit. Then we can load it in the showthreads.php.
```php
if(THIS_SCRIPT == 'showthread.php')
{
global $templatelist;
if(isset($templatelist))
{
$templatelist .= ',';
}
$templatelist .= 'hello_world_template';
}
```
Another example, here are some more templates needed on the member page. Then we can load it in the member.php.
```php
if(THIS_SCRIPT == 'member.php')
{
global $templatelist;
if(isset($templatelist))
{
$templatelist .= ',';
}
$templatelist .= ',hello_world_template_second';
$templatelist .= ',hello_world_template_third';
}
```

### Testing if the template gets cached
You can simply test if the templates get cached correctly or not. Open the page where they should get cached and add a `?debug&debug=1` or `&debug&debug=1` to the url into the browser.
Copy link

@Shade- Shade- Mar 23, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can test whether if templates get cached correctly or not with ease by opening the page where they should be cached and appending the ?debug=1 query string to the URL. Use &debug=1 if there are already other query strings in place. The resulting MyBB Debug Information page contains a table called Page Generation Statistics which has a row with the template cache information.

Note that only administrators can access the debug page, so ensure you are logged in with an administrator account.

Now you see the `MyBB Debug Information` page. The first table called `Page Generation Statistics` contains a row with the template cache information.

#### If a template does not get cached
`No. Templates Used: 90 (89 Cached / 1 Manually Loaded)`
This means there is 1 template that needs an extra select query to the database to get loaded. At the botton you see the `Template Statistics` and now can control which templates don't get cached. All template names in `Templates Requiring Additional Calls (Not Cached at Startup) - 1 Total` are not cached, so you should correct your code.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A template not cached is added to the Manually Loaded count. An extra select query to the database is performed for every template in such list. The complete list of templates requiring additional calls is located within the Template Statistics section.


#### How to determine if templates are being cached correctly
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not necessary IMHO.

`No. Templates Used: 90 (90 Cached / 0 Manually Loaded)`
Your template is now listed in the correct `Template Statistics` table.