As you may know, I'm pretty cheap with my server. As in this referenced blog post is already mentioned, I've optimized nearly every part of the lamp stack - besides the (l)inux and (p)hp part. This post focuses on the PHP part.
Current Server + My requirements
Since my last post, the server specs got better: now I have 400mb RAM and have KVM for virtualization, which allows swap space. So I'm not so much constrained by memory anymore. But still, when my php-fpm instances ran longer, they already took 25% of my memory. A second reason to compile PHP on my own is, that I want to utilize the opcode cache, so my webpages get faster.
What is possible
For tuning the performance of PHP there are not many options. The few things one can do without recompiling are:
- disable unused extensions inside the php.ini
- limit number of processes inside php-fpm.conf
So when your PHP is compiled with soap, sqlite, etc. you can only disable it by recompiling. - Which is the focus of this article.
Getting the source and setting up the environment
Mostly I followed this guide: howtoforge. Since I already compiled some other things, the only thing which I needed to do was: "apt-get build-dep php5". I used php5.5 because I wanted the zend opcache easily installed and also to have a sneak peek in the future of PHP.
This was the most difficult part. I didn't find a list in the internet, with important things a PHP binary should be compiled with. So I had to do "try and error" until my webpages worked again. To make things easier, I didn't write the ./configure on the commandline, but in a textfile, which can be read in the following:
[gist]https://gist.github.com/balrok/5542773 [/gist] Because I don't know how to mix comment + this commandline options, the following is a commented, but not working version of my configure script: [gist]https://gist.github.com/balrok/5542806[/gist]
It took my quite long to find out, that session support was missing, because it simply stopped the script without any error logged/displayed. All other options were quite easy to recognize.
php.ini and fpm
While keeping the configuration minimal, I tried this time to have also a minimal php.ini:
short_open_tag = On date.timezone = 'Europe/Berlin' pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock zend_extension=opcache.so opcache.enable=On
The opcache.so will be automatically found so no need to define the full directory.
For php-fpm I only updated the
/etc/init.d/php-fpm where I changed
I just test the same webpage with different configurations - I always take only the smallest value. The db-overhead is for each configuration 21 queries with 18ms.
|php5.5-fpm with opcache||php5.5-fpm without opcache||php5.4 from debian (without opcache)|
Since I can't yet compare it to a debian php-5.5 and don't want to compile php-5.4 it is not 100% clear from what those memory and performance improvements came from.. So do your own conclusions whether this helped :)
Update: I could now compare to a php-5.5 debian package - the new post can be found here: Small PHP vs Debian PHP package.