The content of this post was written by myself as an entry at my work wiki. It’s intended for new administrator with few knowledge of web environment.
What is PHP ?
PHP
is a server-side scripting language designed for web development. PHP
code may be embedded into HTML code, or it can be used in combination with various template systems, content management system and frameworks. PHP
code is usually processed by an interpreter implemented as a module in the web server (like apache mod_php) or as a separated executable (PHP-FPM).
PHP versions
PHP
core was rewritten several time, breaking compatibility each time. Since PHP4 the official interpreter is named “Zend Engine”. PHP4/ZendEngine 1.0 was first released on May 2000 and deprecated in August 2008. PHP5/ZendEngine 2.0 was first released in 2004 and is still actively maintained. PHP6 was an experimental branch for implementing unicode support. It’s no longer in use. The next branch is called PHP7/ZendEngine 3.0 and was first released on December 2015.
PHP and webservers
In order to “connect” PHP
with your webserver you can use two different system :
- an “embedded” interpreter: mod_php for Apache HTTPd, isapi for IIS, etc..
- an external fast-cgi process: php-fpm
Embedded interpreter was the historical choice but since PHP5.5 it’s recommended to use the fast-cgi approach. In each case you need to load the appropriate module on your webserver.
+ Embedded interpreter: mod_php
mod_php
is an apache module who load the official interpreter (Zend Engine) inside it. With mod_php
the code is executed by apache (user www-data
for Debian). It’s not possible to use several unix user for each application. Setting files are loaded only once, at startup. Any change in configuration imply restarting apache. mod_php
can also be memory hungry because each new apache child process load the PHP
interpreter even if no code is executed.
+ External fast-cgi process: PHP-FPM
PHP-FastCGI Process Manager is a daemon implementing the fast-cgi protocol for PHP
. PHP-FPM is the official implementation since PHP5.3.3, superseding other fast-cgi implementation like FCGI, SpawnFCGI, etc…
PHP-FPM is more efficient than mod_php
because spawning process is adaptative. FPM can start workers with different uid/gid and different setting files. This allows much greater security and scalability because the webserver and the code interpreter can be split into their own individual server environments if necessary. PHP-FPM can also shared opcode cache across multiple processes.
PHP-FPM runs as a standalone daemon, but you still need module to connect it to your webserver:
- for nginx : ngx_http_fastcgi_module
- for apache 2.4 and greater : mod_proxy_fcgi
- for older apache version : mod_fastcgi (this setup is not recommended)
HHVM
Beside the official interpreter (Zend Engine) several implementation of PHP
exist : Pipp, Phalanger, HHVM. These implementations are partial! There is no warranty your application can work with them.
The most interesting alternative implementation is HHVM aka. HipHop Virtual Machine. HHVM actually works on the same principle as the JVM (Java Virtual Machine). HHVM not only translate PHP
code into an high-level bytecode (more or less like other opcodes solutions) but also execute it on an JIT compiler. PHP
code performance can be increase by a factor 2 to 5 when using HHVM.
PHP accelerator
In order to improve PHP
performance several “accelerator” extension have been made. These extensions all work on the same principle: they store the already parsed PHP
code into a pseudo-bytecode, called opcode, generally keep in memory. This technique reduce web applications response’s times drastically.
+ APC
For PHP
version upto 5.3 APC is the recommended accelerator.
You can adjust the quantity of memory used by apc into /etc/php5/apache2/conf.d/apc.ini
. A value of 256Mb is recommended.
It possible but not advised to install APC on PHP
5.4. It has been reported that such configuration can lead to execution errors that break whole applications. APC can’t be install on newer PHP
version.
+ opCache
Since version 5.5 PHP
has it own built-in accelerator: opCache. You can install and configure OpCache on PHP
5.4 manually. It’s also possible to fine-tune opCache. We usually use these values:
opcache.memory_consumption=256
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
APCu
In addition to opcode caching APC also offer a way to cache serialized object, pretty much like redis does. This functionality isn’t provided by opCache so a new extension was created: APCu. APCu only provide object caching.