Home > Server Admin > FastCGI with a PHP APC Opcode Cache

FastCGI with a PHP APC Opcode Cache

Hosting PHP web applications in a shared environment usually involves a choice between two exclusive options: host a fast application by using a persistent opcode cache, or host an application that your shared neighbors can’t snoop around or destroy. In this post I discuss a way to get the best of both worlds, by combining FastCGI with a single opcode cache per user.

This is a long post, ready to jump right in? Skip the history!

The evolution of mod_php to FastCGI

In the early days of all-you-can eat shared hosting, administrators served PHP via mod_php. mod_php loads the PHP interpreter into every web server process during server startup, thus alleviating the expense of starting an interpreter each time a script executes. This allowed executing PHP scripts relatively fast.

mod_php came with a few drawbacks:

  • Every server process, even those serving static files such as images and CSS scripts, contained the PHP interpreter. This caused a lot of bloat in the web server’s memory footprint. It also eliminated the ability to use mutil-threaded web servers as many PHP extensions are not thread safe.
  • Every PHP script ran as the same user as the web server. While web servers typically run as a non-privileged user such as nobody, multiple mutually untrusting shared accounts could easily access, disrupt or destroy each other by executing a PHP script.

FastCGI loads the PHP interpreter into a separate process. This process is still persistent across connections, but, using a mechanism such as suEXEC, can run as a different user. Static files can be served by a lightweight multi-threaded web server process while PHP scripts are served by a single-threaded FastCGI process. What’s more, if PHP crashes, it doesn’t bring down the entire web server.

In the shared hosting context, each user’s PHP scripts are executed with the user’s credentials. This leads to a more secure environment for both the host and the shared user.

The opcode cache

One of the easiest and most effective things you can do to speed up your PHP scripts is to enable an opcode cache such as APC, XCache or eAccelerator. An opcode cache caches the compiled state of PHP scripts in shared memory. Thus each time a PHP script is run, the server doesn’t have to waste time compiling the source code. Opcode caches can speed up execution of scripts by up to 5 times and decrease server load.

In my opinion running PHP on a webserver without an opcode cache is like restarting your car’s engine at every stop sign. You can still get where you’re going but it’s going to take longer and put a lot more wear and tear on your engine. An opcode cache is so important that APC is going to be included in the core of PHP 6.

An opcode cache requires that the PHP interpreter process persist between connections. Both mod_php and FastCGI satisfy this requirement. An opcode cache requires RAM, a precious commodity on a shared hosting server. By default, each cache allocates 30MB of shared memory. This can be easily configured up or down depending on the scripts you are running.

Combining FastCGI with an opcode cache

So if we agree that FastCGI and opcode caches are good (a must IMHO), why do most shared hosting providers only enable one? The answer is two-fold:

  1. RAM. Each opcode cache is typically 30MB. Each PHP process gets its own opcode cache. Each user must run its own PHP process for security. Thus each user requires at least 30MB of RAM on top of the RAM required for the PHP interpreter (a lot). All you can eat shared hosting companies typically oversell their servers. Overselling usually works when it comes to bandwidth, I/O and CPU time, however overselling RAM is harder. Remember the PHP processes stay in memory between connections. So a small site only getting a 100 hits a day still hogs the same amount of RAM as a busy site. This breaks the overselling model.
  2. FastCGI. In a typical configuration, FastCGI spawns many separate PHP processes per user. Each PHP process needs its own opcode cache. Instead of maintaining one opcode cache (per user), the server maintains multiple caches. This reduces the effectiveness of the cache and increases the strain on server resources.

Solving problem #1 is hard. Some have suggested a single cache that can be shared across multiple processes and users and still provide assurance that different users cannot mess with each other. This blog post is not about #1. There are many reasons to use unlimited shared hosting providers. Opcode caches are not one.

This blog post is about how to solve problem #2. The goal is to have a reasonable system that utilizes suEXEC, FastCGI and the APC opcode cache. Each user should have one and only one opcode cache. The administrator should be able to adjust the size of the cache for each individual user based on their needs (and monthly fee). Finally, the solution should decrease script load time and increase server performance while maintaining security and privacy between accounts.

mod_fastcgi vs mod_fcgid

I run Apache on my server. Many people suggest running a more lightweight server such as lighttpd. One day I may switch, but for now I’ve tuned my Apache server to be as fast as I need.

There are two modules to implement FastCGI on Apache – mod_fastcgi and the newer mod_fcgid. Both are binary compatible with each other and do basically the same thing. mod_fcgid sports better control over spawning processes and error detection. mod_fastcgi has been around longer. Both support suEXEC, and both separate PHP from Apache, thus allowing Apache to run threaded workers if desired.

As I mentioned in the combining FastCGI with an opcode cache section, the typical behavior of FastCGI is to spawn multiple PHP interpreters. The FastCGI process monitors each child process, kicking out processes with errors, restarting failed processes and sending incoming requests to the least busy child. This is usually the preferred behavior, and mod_fcgid implements it particularly well.

Opcode caches throw a wrench in this however, because of their inability to share the cache across FastCGI processes. Hopefully one day this will be remedied. Luckily, in the meantime, PHP is capable of playing “process manager” and a single PHP process can spawn several children to handle requests. This way the parent PHP process can instantiate the opcode cache and its children can share it. You’ll see this later when we set the PHP_FCGI_CHILDREN environment variable.

Both mod_fcgid and mod_fastcgi can be told to limit the number of PHP processes to 1 per user. The PHP process can then be told how many children to spawn. Unfortunately mod_fcgid will only send one request per child process. The fact that PHP spawns its own children is ignored by mod_fcgid. If we use mod_fcgid with our setup, we can only handle one concurrent PHP request. This is not good. A long running request could easily block multiple smaller requests.

mod_fastcgi will send multiple simultaneous requests to a single PHP process if the PHP process has children that can handle it. This is the reason we must use mod_fastcgi to achieve our goal of one cache per user.


This section describes the steps I took to enable suEXEC FastCGI with a single APC opcode cache per user on Apache 2.2. These instructions may vary by Linux distribution and are not intended to be a cut-and-paste howto. I use Gentoo, so most steps will be geared towards a Gentoo install but the general idea should work on any distribution.

1. Install php-cgi and disable mod_php

The PHP interpreter can run in three different modes: as an Apache module, as a CGI binary or as a command line command. Typically, separate binaries are built for the CGI and CLI modes, php-cgi and php respectively. On Gentoo, each mode is associated with a USE flag: apache2 for mod_php, cgi for a CGI binary, and cli for command-line PHP. The cgi USE flag must be enabled. If it isn’t, add it to /etc/make.conf or /etc/portage/package.use and recompile PHP. On other distributions, search for a php-cgi binary.

You will want to disable mod_php (if it was enabled) before implementing FastCGI. This can be done by commenting out the appropriate LoadModule line in your Apache configuration file:

# LoadModule php5_module modules/libphp5.so

On Gentoo, this can be easily done by removing PHP5 from the APACHE2_OPTS variable in /etc/conf.d/apache2.

2. Install and enable mod_fastcgi Apache module

We already discussed why we must use mod_fastcgi instead of mod_fcgid. On Gentoo, installing mod_fastcgi can easily be done by running:

$ sudo emerge mod_fastcgi

For other distributions, try installing a mod_fastcgi package or see the FastCGI Installation Notes.

Make sure your Apache conf file contains the line:

LoadModule fastcgi_module modules/mod_fastcgi.so

On Gentoo, this line is found in /etc/apache/modules.d/20_mod_fastcgi.conf. mod_fastcgi is enabled by adding FASTCGI to the APACHE2_OPTS variable in /etc/conf.d/apache2.

3. Install and configure the APC Opcode Cache

To install APC on Gentoo, simply run:

$ sudo emerge pecl-apc

For other distributions, see the Alternative PHP Cache installation instructions.

Once installed, look for the apc.ini file in your php extension configuration directory (e.g. /etc/php/cgi-php5/ext-active). The default apc.ini works with one exception. You need to comment out apc.shm_size="30" (line 5 below). Commenting this line will enable us to set it per user later.

My apc.ini file looks like:

;commenting this out allows you to set it in each fastcgi process

4. Install/enable Apache suEXEC

Apache 2.2 contains built-in support for executing CGI programs as a different user id and group id than the webserver. This support must be compiled into Apache. On Gentoo, use the suexec USE flag and recompile apache. On other distributions, see Configuring & Installing suEXEC.

5. Create wrapper scripts

The Apache suEXEC security model requires that the CGI binary meet some pretty stringent requirements concerning file ownership and permissions. Rather than copying the php-cgi binary for each user, we create multiple wrapper scripts around the php-cgi binary. These wrapper scripts allow us to set options on a per-user basis.

I keep my wrapper scripts in /var/www/bin, though you may keep yours wherever you want. Each user has a directory in /var/www/bin, for example:

$ ls -l /var/www/bin
dr-xr-xr-x 2 bob bob 104 Jun 24 13:56 bob/
dr-xr-xr-x 2 sue sue 104 Jun 24 13:56 sue/
dr-xr-xr-x 2 joe joe 104 Jun 24 13:53 joe/

Inside each user’s bin directory is a single wrapper script, php-fastcgi:

$ ls -l /var/www/bin/bob/
-r-xr-x‐‐‐ 1 bob bob 145 Jun 24 13:56 php-fastcgi

I’ve shown the ls -l output to show the file and directory ownership and permissions. These are important, and Apache suEXEC will not work correctly if the owner and permissions are not correct.

The contents of the php-fastcgi file in each user’s bin directory (see below for an explanation):



umask 0022
exec /usr/bin/php-cgi -d apc.shm_size=25

This variable tells PHP how many child processes it should spawn. As we discussed earlier, our PHP process will act as “process manager” and pass incoming requests to its children. The parent will maintain a single opcode cache which each child will share. The PHP_FCGI_CHILDREN variable tells PHP how many children to spawn. Another way to think of this is the number of concurrent PHP requests that can be handled per user.

PHP is known for memory leaks in long running processes. This variable causes each child process to be restarted once it has served a given number of requests (e.g. 500). Only the child process is restarted, the parent process remains. Since the parent process maintains the opcode cache, the opcode cache persists.

umask 0022
This sets the umask the PHP binary will run under. Some people may prefer a stricter umask such as 0077, however I’ve found 0022 works best as it allows the Apache server running as nobody to read static files written earlier by a suEXEC’d PHP process. Some PHP applications (WordPress plugins) do not do a good job with permissions, and a strict umask can cause applications to fail.

exec /usr/bin/php-cgi -d apc.shm_size=25
This line calls the php-cgi binary and modifies the APC cache size. It is possible to configure this to use a separate php.ini file instead of setting configuration parameters on the command line, however I like the ability to share a single php.ini file.

6. Edit global Apache settings

There are two sets of settings you must configure in Apache: those that affect all users and those that affect a specific user. This section describes global settings that affect all users.

I like to keep my global settings in my /etc/apache/modules.d/20_mod_fastcgi.conf file, but these can go in any part of your http.conf file. Most of the time you do not want this in a VirtualHost section. My global mod_fastcgi settings look like this (see below for an explanation):

<IfDefine FASTCGI>
LoadModule fastcgi_module modules/mod_fastcgi.so

FastCgiConfig -idle-timeout 20 -maxClassProcesses 1
FastCgiWrapper On

AddHandler php5-fcgi .php
Action php5-fcgi /cgi-bin/php-fastcgi

<Location "/cgi-bin/php-fastcgi">
   Order Deny,Allow
   Deny from All
   Allow from env=REDIRECT_STATUS
   Options ExecCGI
   SetHandler fastcgi-script


The FastCgiConfig configuration directive sets parameters for all dynamic FastCGI processes. The idle-timeout causes FastCGI to abort a request if there is no activity for more than 20 seconds. The maxClassProcesses option is very important: it tells FastCGI to only spawn one php-cgi process regardless of how many requests are pending. Remember that our PHP process will spawn its own children, so FastCGI only needs to spawn one. Until this APC bug is fixed, this is necessary to allow sharing the APC cache among children.

The FastCgiWrapper configuration directive is needed to allow suEXEC to work.

AddHandler / Action
The AddHandler and Action configuration directives tell Apache to handle all files ending in .php with the php-fastcgi script in cgi-bin. In the next step, you’ll see how we alias this cgi-bin directory for each individual user.

The Location directive tells Apache how to handle requests to /cgi-bin/php-fastcgi. The Allow from env=REDIRECT_STATUS on line 13 prevents users from executing this script directly. With this line, the only way to execute php-fastcgi is by requesting a file ending in .php.

7. Edit per-user Apache settings

On my host, every virtual host is associated with one user. And every user has exactly one opcode cache. A single user can have multiple virtual hosts, but these virtual hosts share the same opcode cache.

For each virtual host, I add the following lines, customized for the user associated with that virtual host:

<VirtualHost *:80>
ServerName www.sue.bltweb.net
<IfModule mod_fastcgi.c>
   SuexecUserGroup sue sue
   Alias /cgi-bin/ /var/www/bin/sue/

When combined with the global apache settings and the wrapper scripts, this will launch the php-cgi binary using suEXEC to execute as the appropriate user and group whenever a .php file is requested.

There are several different ways to call the FastCGI binary. On my hosts, users don’t have access to their cgi-bin directory. The /var/www/bin directory is not accessible by ordinary users. This doesn’t have to be the case, the cgi-bin directory could be stored in the user’s directory. It is important to note that allowing the user to modify php.ini values allows them to modify their opcode cache size, which could have severe repercussions on RAM usage.

Pros and Cons

The implementation described above is only one of many ways to implement FastCGI and APC. In my opinion, it is the best way to meet my goals, but in this section I’ll try to outline some of the advantages and disadvantages of my setup.

  • Different users can have different APC cache sizes
  • Multiple concurrent PHP requests can be handled simultaneously
  • RAM usage is predictable as a product of the number of users on the host
  • Server is better secured against attacks from the inside since PHP processes run as the user who owns the script
  • Resource usage can be monitored since each user has a separate PHP process
  • A PHP crash doesn’t mean an Apache crash. If a PHP process crashes it is restarted automatically.
  • The process manager built into mod_fastcgi isn’t used. One of the motivations behind mod_fcgid was to improve upon the process manager in mod_fastcgi.
  • The newer mod_fcgid cannot be used as it will only send one request at a time to the PHP process, thus multiple requests can’t be handled simultaneously
  • Maintaining separate opcode caches per user uses a considerably larger amount of RAM than a single opcode cache used with mod_php
  • Users cannot alter php.ini files
  • If a PHP script crashes it has potential to take down all of the PHP requests currently being processed for that user


In my next post I’ll try to cover RAM usage, performance, benchmarks, compatibility and best practices. This post is already way too long; I’m surprised you are even still reading it!

Stay tuned for more information on using FastCGI with a PHP APC opcode cache. In the meantime let me know what you think of this approach. Have you tried it? Know of a better way? Found any bugs or problems? Leave a comment below!

Server Admin , , , ,

  1. September 7th, 2014 at 06:08 | #1

    Helpful information. Lucky me I discovered your web site unintentionally, and I’m stunned why this twist of fate did not tok place in advance!
    I bookmarked it.

  2. September 7th, 2014 at 10:53 | #2

    Super info Sincères remerciements.

  3. September 9th, 2014 at 20:54 | #3

    What’s up, just wanted to say, I loved this post.
    It was inspiring. Keep on posting!

  4. September 10th, 2014 at 13:50 | #4

    Wow un tonne de fantastique connaissances.

  5. September 11th, 2014 at 14:53 | #5

    Part of creating a successful search engine optimization campaign for you is optimizing your website for
    the correct keywords. Article Source: author writes for which
    provides information regarding tampa seo company. include organic SEO, Reciprocal and one way
    link building, web based content writing for online submissions, Blogging and the like.

  6. September 11th, 2014 at 22:26 | #6

    This will be the easiest and safest approach to hide Cydia in your iPhone.
    SB settings can be accessed from the notification bar or
    the standing bar. So, now the Modifica PS3 is out there that will help you to save some of your cash.

  7. September 11th, 2014 at 23:57 | #7

    I was more than happy to discover this page. I need to to thank you for ones time for
    this wonderful read!! I definitely liked every little bit of
    it and I have you book marked to see new information on your blog.

  8. September 12th, 2014 at 19:30 | #8

    They would like to make their system more appealing and appealing than before.
    When you are looking to Uncover Iphone, look no longer.

  9. September 14th, 2014 at 12:36 | #9

    They are very lovely, durable, and they are low cost so it is a
    great option for your home dcor. cor might be found just
    around the corner from your house. In this way you can light an entire room with only one or two fixtures (saving you energy
    through the number of light fixtures as well as the amount of electricity
    used to light them).

  10. September 15th, 2014 at 23:06 | #10

    Traditionally, single-hung windows were developed first in the
    building of the window pane. There are several approaches in order to check your Facebook without troubles to violate these blockages.

  11. September 16th, 2014 at 07:05 | #11

    Excellent goods from you, man. I’ve understand your stuff previous to and you’re just extremely fantastic.
    I actually like what you’ve acquired here, certainly like what you’re saying and the way in which you say it.
    You make it enjoyable and you still care for to keep it sensible.
    I can not wait to read far more from you. This is actually a terrific web site.

  12. September 17th, 2014 at 05:49 | #12

    You need to be given a toll free number and unlimited support to call on.

  13. September 18th, 2014 at 08:14 | #13

    Hey there! Do you know if they make any plugins to assist with
    Search Engine Optimization? I’m trying to get my blog to rank for some targeted keywords but I’m not seeing
    very good gains. If you know of any please share.
    Thank you!

  14. September 23rd, 2014 at 03:54 | #14

    You’ll be able to attempt by selecting Start, clicking Run and typing +msconfig+.
    Notice, this can set Vista to “Fundamental” graphics mode (and create all fonts nearly unreadable).

  15. September 23rd, 2014 at 20:02 | #15

    The Darkness app shows the times for civil, nautical and astronomical twilight.

    That doesn’t mean you have to go get a refund (simply because that would hurt me, not Apple).

    Okay that was a intelligent transfer, I guess,

  16. September 24th, 2014 at 19:37 | #16

    Hi mates, its wonderful article on the topic of teachingand fully explained, keep it up all the

  17. September 29th, 2014 at 05:32 | #17

    Thanks for every other fantastic post. Where
    else could anybody get that type of information in such a perfect manner of writing?
    I have a presentation subsequent week, and I’m on the search
    for such info.

  18. October 4th, 2014 at 07:20 | #18

    What’s up, I read your blog like every week. Your humoristic style is awesome,
    keep up the good work!

  19. October 4th, 2014 at 16:33 | #19

    It ranks up there with the likes of getting to meet
    Johnny Depp, the best dessert you ever ate, and your husband doing all laundry and cooking for an entire month.
    I recommend using a simple font that is easy to read in a size
    ranging from 32 to 40. The more powerful the image, the more interest you will
    provoke in visitors to your profile which in turn will result in your profile attracting more followers.

  20. October 8th, 2014 at 19:59 | #20

    An intrighing discussion is worth comment.

    I do believe that you should write more about this
    subject, it might not be a taboo matter buut typically
    people do not discuss these topics. To the next! All thhe best!!

  21. October 13th, 2014 at 07:27 | #21

    I like the valuable information you supply on your articles.
    I’ll bookmark your blog and test once more here frequently.

    I am fairly sure I’ll be informed many new stuff proper right here!
    Good luck for the following!

  22. December 15th, 2014 at 19:44 | #22

    I tried getting this working on a Debian 7 VPS with no luck. Very strange results. Installation had a few minor hangups before Apache would start. It’s probably me, as I don’t 100% understand how this is supposed to work.

    When I hit the site with some php that echo’s text – I get nothing. If I place text after the PHP – still nothing. Not a 404, blank. If I put a little text before the PHP – it outputs the text, the PHP code as text, and the text after the PHP …

  23. December 18th, 2014 at 09:49 | #23

    I’m amazed, I have to admit. Rarely do I encounter a blog that’s both equally educative and amusing,
    and let me tell you, you’ve hit the nail on the head.
    The problem is an issue that too few people are speaking intelligently about.
    I am very happy I stumbled across this in my hunt for something relating to this.

  24. January 16th, 2015 at 16:42 | #24

    Fantastic web site. Lots of helpful information here. I’m sending it to several
    buddies ans additionally sharing in delicious. And
    naturally, thanks for your effort!

  25. January 29th, 2015 at 03:05 | #25

    If the impact your seeking is mist or fog at base of
    mountains or trees, then that’s pretty effortless too.

  26. February 22nd, 2015 at 00:13 | #26

    破天私服开服一条龙服务 http://www.m9yx.com/

  27. May 22nd, 2015 at 20:52 | #27

    Understanding these differences might help people to greater realize, appreciate and view their furry friends.

    Eye can become red and swollen for many factors – even when we don’t use lenses.

  28. June 26th, 2015 at 09:11 | #28

    Thanks for this Post it helped us to speed up our system. Keep on!

  29. July 1st, 2015 at 22:07 | #29

    To the Bitter Barista, Most cafe owners are aware that the role barista was not their employee’s dream job but if they take the chance on hiring you & give you a paycheck, the least you could do is respect them or quit! As an employee, you represent that company. Nothing is safe on the internet and your venting (on the job) was stupidity on your part. I’m glad All City made the decision to let a cocky, bitter barista go because you obviously think they are worthy to have you there and didn’t enjoy working their based on your blog. Why should they keep you? Get over yourself. I ‘m sure there are plenty of baristas who would like that job.
    fake cartier bracelet http://lovecollections.org/

  30. July 13th, 2015 at 01:00 | #30

    It’s awesome in favor of me to have a web site, which is beneficial in support of
    my knowledge. thanks admin

  31. September 11th, 2015 at 08:40 | #31

    Thanks for this Post it helped. Speed up 5.4 to 4.1

  32. October 7th, 2015 at 08:16 | #32

    I thought I’d have to read a book for a divscoery like this!

  33. October 28th, 2015 at 16:05 | #33

    PMI on traditional financings differs, because of your credit score, the loan type, and
    the dimension of your down payment, so there is
    no basic price..

  34. November 22nd, 2015 at 21:30 | #34

    It’s perfect time to make some plans for the longer term
    and it is time to be happy. I’ve learn this put up and if I may just
    I desire to suggest you few interesting issues or tips. Maybe you could write subsequent articles referring to this article.
    I wish to learn even more things approximately it!

  35. November 22nd, 2015 at 22:10 | #35

    Its not my first time to pay a visit this site, i am browsing this site
    dailly and get pleasant data from here every day.

  36. December 16th, 2015 at 08:23 | #36

    <3 APC

  37. January 20th, 2016 at 15:14 | #37

    After looking at a number of the blog articles on your
    site, I truly like your way of writing a blog.
    I saved it to my bookmark website list and will be checking back soon. Please visit my website too and tell me what you think.

  38. March 6th, 2016 at 10:51 | #38

    Features – Once you confirm that you’re dealing with an actual organization that takes protection seriously, it’s time for you to go through the features the particular PPD network offers.
    The protesters threw bottles and white paint over the car.
    A princess affair could become a princess tea, or a princess training day.

  39. April 29th, 2016 at 02:28 | #39

    Despite looking like an awful website and the constant coding errors that appear at the top and the awful spam you get from tutors begging to help you the website is decent to use.

  40. May 5th, 2016 at 03:14 | #40

    Do you mind if I quote a few of your articles as long as
    I provide credit and sources back to your webpage? My blog site
    is in the very same niche as yours and my
    visitors would certainly benefit from some of the information you provide here.
    Please let me know if this alright with you.

  41. May 31st, 2016 at 05:41 | #41

    Greetings from California! I’m bored at work so I decided to browse your site on my iphone during lunch break.
    I love the info you provide here and can’t wait to take a look when I get home.

    I’m shocked at how quick your blog loaded on my phone ..
    I’m not even using WIFI, just 3G .. Anyhow, good blog!

  42. June 4th, 2016 at 10:50 | #42

    Hey There. I discovered your blog using msn. That is a very neatly written article.
    I’ll make sure to bookmark it and come back to read extra of your helpful info.
    Thank you for the post. I will definitely return.

  43. June 9th, 2016 at 04:07 | #43

    If you are going foг best сontents like I do,
    only go to see this web sіte daily for the reason that іt gives feature contents,

  44. July 9th, 2016 at 09:00 | #44

    Nice post. I learn something new and challenging on websites I stumbleupon every day.

    It’s always useful to read articles from other writers and use a little something from
    their websites.

  45. July 12th, 2016 at 10:46 | #45

    Thanks in favor of sharing such a nice thinking,
    paragraph is good, thats why i have read it entirely

  46. August 12th, 2016 at 13:56 | #46

    There’s certainly a lot to know about this subject. I like all the points you have

  47. August 12th, 2016 at 14:10 | #47

    Excellent web site. Lots of helpful info here.
    I’m sending it to a few buddies ans additionally sharing in delicious.
    And certainly, thanks for your sweat!

  48. August 12th, 2016 at 15:21 | #48

    Asking questions are genuinely nice thing if you
    are not understanding anything totally, however this article offers good understanding even.

  49. September 1st, 2016 at 00:40 | #49

    Your are ans great go-to, james!

  50. September 10th, 2016 at 14:40 | #50

    Oh my goodness! Incredible article dude! Thank you so much,
    However I am encountering issues with your RSS.
    I don’t know the reason why I cannot subscribe to
    it. Is there anyone else getting similar RSS problems?
    Anyone that knows the solution will you kindly respond?

Comment pages
  1. December 28th, 2009 at 11:48 | #1
  2. January 21st, 2010 at 16:11 | #2
  3. August 13th, 2011 at 12:49 | #3
  4. August 31st, 2011 at 07:39 | #4
  5. January 10th, 2012 at 17:23 | #5
  6. May 22nd, 2012 at 22:32 | #6
  7. September 2nd, 2012 at 20:37 | #7
  8. November 16th, 2012 at 14:00 | #8
  9. November 23rd, 2012 at 14:55 | #9
  10. April 27th, 2013 at 22:35 | #10
  11. May 4th, 2013 at 22:18 | #11
  12. June 30th, 2013 at 10:28 | #12
  13. October 2nd, 2013 at 09:38 | #13
  14. May 3rd, 2014 at 06:39 | #14
  15. July 24th, 2014 at 08:41 | #15
  16. July 25th, 2014 at 09:16 | #16
  17. September 22nd, 2014 at 13:13 | #17
  18. September 23rd, 2014 at 15:32 | #18
  19. December 9th, 2014 at 02:49 | #19
  20. January 12th, 2015 at 23:21 | #20
  21. January 31st, 2015 at 09:17 | #21
  22. March 14th, 2015 at 10:19 | #22
  23. August 5th, 2015 at 03:17 | #23
  24. October 14th, 2015 at 10:02 | #24
  25. November 11th, 2015 at 19:40 | #25
  26. July 6th, 2017 at 21:29 | #26
  27. November 24th, 2017 at 13:01 | #27
  28. December 14th, 2017 at 21:16 | #28
  29. July 19th, 2018 at 15:09 | #29