Open Source Software Technical Articles

Want the Best of the Wazi Blogs Delivered Directly to your Inbox?

Subscribe to Wazi by Email

Your email:

Connect with Us!

Current Articles | RSS Feed RSS Feed

mod_php vs. FastCGI vs. PHP-FPM for Web Server Scripting

  
  
  

Most administrators know that PHP, the widely used scripting language, can be embedded in HTML and works with all major web servers. What's less widely known, however is that you can run PHP in different ways on your server. The most common option is the mod_php module that's runs by default in the Apache HTTP Server. If your primarily goal is performance, however, you should consider other options. PHP-FPM (FastCGI Process Manager) and PHP FastCGI each have pros and cons, but either can speed up the performance of your PHP.

mod_php

Let's start by looking at running Apache with mod_php. This package is present in just about every Linux distribution's repository, so installing it is easy, and so is configuring and managing the software. In fact, its ease of use may be the main reason to deploy mod_php.

PHP accelerators

Using a different PHP package isn't the only way to improve PHP performance. PHP accelerators, also called opcodes cachers, increase the performance of PHP applications by caching the compiled form of PHP scripts. A PHP accelerator typically reduces server load and increases the speed of your PHP scripts as much as 10 times depending on how many different pages and PHP scripts are used and cached. While you can find several PHP accelerators, my suggestion is to use APC (Alternative PHP Cache), an opcode cache maintained by the developer of PHP, who plans to integrate it into PHP starting in version 5.4.

To see how APC helps speed PHP, let's look at how a PHP program is run.

  1. The first step is reading the PHP code from the filesystem and put it into memory.
  2. In the lexing step, PHP code is converted into tokens or lexicons.
  3. In the parsing step, tokens are processed to derive meaningful expressions.
  4. The derived expressions are compiled into opcodes.
  5. Opcodes are executed to get the final result.

The goal of APC is bypass steps 1 to 4 for each call after the first one, instead caching in a shared memory segment the opcodes generated and then copying them into the execution process. APC is easy to install and configure, so I suggest using it in every PHP installation.

 

With mod_php the PHP interpreter is "embedded" inside the Apache process; Apache doesn't call any external PHP process, which means that Apache and PHP can communicate better. However, every single Apache child must load mod_php, which results in a bigger process than necessary being used for serving static resources such as image files, CSS, and JavaScript.

Another problem with this method is that it works only on Apache. This is not always an issue, as Apache is the most complete web server you can find, but websites that run on small virtual private servers (VPS), or big sites that have to serve million of pages a day, might want a different web server that can scale up or down better than Apache, and would therefore need a different way to run PHP too.

Pros:

  • Easy to install and update.
  • Easy to configure with Apache.

Cons:

  • Works only with Apache.
  • Forces every Apache child to use more memory.
  • Needs a restart of Apache to read an updated php.ini file.

 

FastCGI

FastCGI is a generic protocol for interfacing interactive programs with a web server. It's a variation on the earlier Common Gateway Interface (CGI) that reduces the overhead associated with interfacing the web server and CGI programs, allowing a server to handle more page requests at once.

Apache can use FastCGI in the form of mod_fcgid, and other popular webservers, such as lighttpd, nginx, Cherokee, and even Microsoft IIS, can use FastCGI as well.

With FastCGI you can set up multiple versions of PHP. This is particular useful when you have old websites made for, say, PHP 5.1 that are not compatible with the latest version of PHP. With FastCGI you can serve old PHP to the old website while using the latest version for all the others, something that is not possible with mod_php.

FastCGI also utilizes suexec to support different users with their own instances of PHP. This feature is particularly important for improving security in a shared environment, where you could have different users each managing their own websites. FastCGI reduces the memory footprint of your web server, but still gives you the speed and power of the entire PHP language.

Pros:

  • Compatible with many web servers.
  • Smaller memory footprint than mod_php.
  • More configuration options, including multiple PHP and suexec.

Cons:

  • Requires more configuration than mod_php.
  • Not widely known in the IT community.

PHP-FPM

PHP-FPM, the newest way to use PHP with a webserver, is an alternative PHP FastCGI implementation with some additional features that can be useful for websites that run on both small VPSes and multiple servers. It can be used with any web server that is compatible with FastCGI.

PHP-FPM gives administrators the ability to gracefully stop and start PHP worker processes without losing any queries. This allows you to gradually update the configuration and binary without losing any queries. You can start workers with different uid, gid, and chroot environments and different php.ini options. You can also run an emergency restart on all the processes in the event of any accidental destruction of the shared memory opcodes cache, if you're using an accelerator.

Pros:

  • Compatible with many web servers.
  • Smaller memory footprint than mod_php.
  • More configuration options than FastCGI.

Cons:

  • Requires more configuration than mod_php.
  • Not widely known in the IT community.
  • Project is still relatively young.

Conclusions

I can think of no general rule or guideline to tell you what's the right method for you or your company to use to speed up PHP. Personally, I use mod_php on most servers for its stability and the fact it is so well-known. I use PHP-FPM on small VPSes where saving memory while keeping fast performance is a must. The important thing to keep in mind is the variety of different solutions available; knowing about all of them is fundamental when planning your project.

 

e21cef24-2786-4d03-b349-a36ab27f5913



This work is licensed under a Creative Commons Attribution 3.0 Unported License
Creative Commons License.

Comments

Do you know of any benchmarks that support these claims. Running a test with apache bench on a machine with both mod_php and php-fpm installed, mod_php was 20% faster.
Posted @ Thursday, November 01, 2012 4:20 PM by Derak
I agree that mod_php is faster than php-fpm but I use php-fpm because I need security in shared hosting environment.
Posted @ Sunday, March 31, 2013 3:53 AM by Crane
Nice article explaining the most used options for running PHP. I'd like to add that mod_php will use less memory in a shared hosting setup than FastCGI, for the simple reason that every site will have it's own PHP processes. It really depends on how many sites you want to run. I'm thinking that the best of both worlds would by to run mod_php/apache for the php and Nginx to handle all the static content (by using nginx as a frontend proxy)
Posted @ Sunday, June 02, 2013 4:45 AM by Barry van Someren
It's actually pretty simple, if you're running high traffic web servers or php heavy applications such as Drupal, go with FastCGI or PHP-FPM. Running mod_php on such servers will easily run them OOM to such extend that the server because completely unusable.
Posted @ Sunday, September 22, 2013 3:39 AM by Bram Pieters
Great article
Posted @ Wednesday, February 12, 2014 5:51 AM by Foxinni
Post Comment
Name
 *
Email
 *
Website (optional)
Comment
 *

Allowed tags: <a> link, <b> bold, <i> italics