How To Build PHP 5.6-beta3 (PHP-FPM & FastCGI) With ionCube Loader, Zend OPcache And APCu For ISPConfig 3 (Debian Wheezy)

Want to support HowtoForge? Become a subscriber!
 
Submitted by howtoforge (Contact Author) (Forums) on Fri, 2014-05-30 09:22. :: Debian | Web Server | Apache | nginx | PHP

How To Build PHP 5.6-beta3 (PHP-FPM & FastCGI) With ionCube Loader, Zend OPcache And APCu For ISPConfig 3 (Debian Wheezy)

Version 1.0
Authors: Falko Timme, Srijan Kishore
Last edited 22/May/2014

Since ISPConfig 3.0.5, it is possible to use multiple PHP versions on one server and select the optimal PHP version for a website. This feature works with PHP-FPM (starting with PHP 5.3) and FastCGI (all PHP 5.x versions). This tutorial shows how to build PHP 5.5 as a PHP-FPM and a FastCGI version on a Debian Wheezy server. These PHP 5.6 builds include the ionCube Loader, Zend OPcache, and APCu.

I do not issue any guarantee that this will work for you!

 

1 Preliminary Note

I will install PHP 5.6.0beta3, the latest PHP 5.6.0beta3 version at the time of this writing. I will also show how to build some additional PHP extensions such as APCu, memcache, memcached, and ioncube.

Please note that PHP-FPM can be used on both Apache and nginx servers, while FastCGI is available only for Apache servers.

PHP-FPM and FastCGI are mutually exclusive in PHP 5.6.0beta3, that's why I show two ways of building PHP, one for PHP-FPM, one for FastCGI, however you can compile PHP twice to get both, one time with --enable-fpm and one time with --enable-cgi (make sure to use different base directories, such as /opt/php-5.6.0beta3 for PHP-FPM and /opt/phpfcgi-5.6.0beta3 for FastCGI).

 

2 Building PHP 5.6.0beta3 (PHP-FPM)

Download the PHP sources with wget from php.net and extract PHP 5.6.0beta3:

mkdir /opt/php-5.6.0beta3
mkdir /usr/local/src/php5-build
cd /usr/local/src/php5-build
wget http://downloads.php.net/tyrael/php-5.6.0beta3.tar.bz2
tar jxf php-5.6.0beta3.tar.bz2

cd php-5.6.0beta3/

Install the prerequisites for building PHP5:

apt-get install build-essential

apt-get build-dep php5

apt-get install libfcgi-dev libfcgi0ldbl libjpeg62-dbg libmcrypt-dev libssl-dev libc-client2007e libc-client2007e-dev

ln -s /usr/lib/libc-client.a /usr/lib/x86_64-linux-gnu/libc-client.a

(The last command is needed if you build PHP with --with-imap, because otherwise ./configure will stop with the following error:

checking for crypt in -lcrypt... yes
configure: error: Cannot find imap library (libc-client.a). Please check your c-client installation.
root@server1:/usr/local/src/php5-build/php-5.6.0beta3#

)

Configure and build PHP 5.6.0beta3 as follows (you can adjust the ./configure command to your needs, take a look at

./configure --help

to see all available options; if you use a different ./configure command, it is possible that additional libraries are required, or the build process will fail):

./configure \
--prefix=/opt/php-5.6.0beta3 \
--with-pdo-pgsql \
--with-zlib-dir \
--with-freetype-dir \
--enable-mbstring \
--with-libxml-dir=/usr \
--enable-soap \
--enable-calendar \
--with-curl \
--with-mcrypt \
--with-zlib \
--with-gd \
--with-pgsql \
--disable-rpath \
--enable-inline-optimization \
--with-bz2 \
--with-zlib \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-pcntl \
--enable-mbregex \
--enable-exif \
--with-mhash \
--enable-zip \
--with-pcre-regex \
--with-mysql \
--with-pdo-mysql \
--with-mysqli \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--enable-gd-native-ttf \
--with-openssl \
--with-fpm-user=www-data \
--with-fpm-group=www-data \
--with-libdir=/lib/x86_64-linux-gnu \
--enable-ftp \
--with-imap \
--with-imap-ssl \
--with-kerberos \
--with-gettext \
--with-xmlrpc \
--enable-opcache \
--enable-fpm

The last switch (--enable-fpm) makes sure this PHP version will work with PHP-FPM.

make
make test
make install

Copy php.ini and php-fpm.conf to the correct locations:

cp /usr/local/src/php5-build/php-5.6.0beta3/php.ini-production /opt/php-5.6.0beta3/lib/php.ini

cp /opt/php-5.6.0beta3/etc/php-fpm.conf.default /opt/php-5.6.0beta3/etc/php-fpm.conf

Open /opt/php-5.6.0beta3/etc/php-fpm.conf and adjust the following settings - in the listen line you must use an unused port (e.g. 8999; port 9000 might be in use by Debian's default PHP-FPM already), and you must add the line include=/opt/php-5.6.0beta3/etc/pool.d/*.conf at the end:

vi /opt/php-5.6.0beta3/etc/php-fpm.conf

[...]
pid = run/php-fpm.pid
[...]
user = www-data
group = www-data
[...]
listen = 127.0.0.1:8999
[...]
include=/opt/php-5.6.0beta3/etc/pool.d/*.conf

Create the pool directory for PHP-FPM:

mkdir /opt/php-5.6.0beta3/etc/pool.d/

Next create an init script for PHP-FPM:

vi /etc/init.d/php-5.6.0-fpm

#! /bin/sh
### BEGIN INIT INFO
# Provides:          php-5.6.0-fpm
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts php-5.6.0-fpm
# Description:       starts the PHP FastCGI Process Manager daemon
### END INIT INFO
php_fpm_BIN=/opt/php-5.6.0beta3/sbin/php-fpm
php_fpm_CONF=/opt/php-5.6.0beta3/etc/php-fpm.conf
php_fpm_PID=/opt/php-5.6.0beta3/var/run/php-fpm.pid
php_opts="--fpm-config $php_fpm_CONF"
wait_for_pid () {
        try=0
        while test $try -lt 35 ; do
                case "$1" in
                        'created')
                        if [ -f "$2" ] ; then
                                try=''
                                break
                        fi
                        ;;
                        'removed')
                        if [ ! -f "$2" ] ; then
                                try=''
                                break
                        fi
                        ;;
                esac
                echo -n .
                try=`expr $try + 1`
                sleep 1
        done
}
case "$1" in
        start)
                echo -n "Starting php-fpm "
                $php_fpm_BIN $php_opts
                if [ "$?" != 0 ] ; then
                        echo " failed"
                        exit 1
                fi
                wait_for_pid created $php_fpm_PID
                if [ -n "$try" ] ; then
                        echo " failed"
                        exit 1
                else
                        echo " done"
                fi
        ;;
        stop)
                echo -n "Gracefully shutting down php-fpm "
                if [ ! -r $php_fpm_PID ] ; then
                        echo "warning, no pid file found - php-fpm is not running ?"
                        exit 1
                fi
                kill -QUIT `cat $php_fpm_PID`
                wait_for_pid removed $php_fpm_PID
                if [ -n "$try" ] ; then
                        echo " failed. Use force-exit"
                        exit 1
                else
                        echo " done"
                       echo " done"
                fi
        ;;
        force-quit)
                echo -n "Terminating php-fpm "
                if [ ! -r $php_fpm_PID ] ; then
                        echo "warning, no pid file found - php-fpm is not running ?"
                        exit 1
                fi
                kill -TERM `cat $php_fpm_PID`
                wait_for_pid removed $php_fpm_PID
                if [ -n "$try" ] ; then
                        echo " failed"
                        exit 1
                else
                        echo " done"
                fi
        ;;
        restart)
                $0 stop
                $0 start
        ;;
        reload)
                echo -n "Reload service php-fpm "
                if [ ! -r $php_fpm_PID ] ; then
                        echo "warning, no pid file found - php-fpm is not running ?"
                        exit 1
                fi
                kill -USR2 `cat $php_fpm_PID`
                echo " done"
        ;;
        *)
                echo "Usage: $0 {start|stop|force-quit|restart|reload}"
                exit 1
        ;;
esac

Make the init script executable and create the system startup links:

chmod 755 /etc/init.d/php-5.6.0-fpm
insserv php-5.6.0-fpm

Finally start PHP-FPM:

/etc/init.d/php-5.6.0-fpm start

As long as there are no pools in /opt/php-5.6.0beta3/etc/pool.d, you will get this warning which you can ignore:

root@server1:~# /etc/init.d/php-5.6.0-fpm start
Starting php-fpm [22-May-2014 03:14:39] WARNING: Nothing matches the include pattern '/opt/php-5.6.0beta3/etc/pool.d/*.conf' from /opt/php-5.6.0beta3/etc/php-fpm.conf at line 529.
 done
root@server1:~#

To enable the Zend OPcache, open /opt/php-5.6.0beta3/lib/php.ini...

vi /opt/php-5.6.0beta3/lib/php.ini

... and add the following line at the end:

[...]
zend_extension=opcache.so

That's it - if you like, you can now install some additional modules like APCu, memcache, memcached, and ioncube.

Note: memcached is not supported yet in beta3

The APCu, memcache, and memcached modules can be installed through PEAR which we must install and initialize first:

apt-get -y install php-pear php5-dev

cd /opt/php-5.6.0beta3/etc/

pecl -C ./pear.conf update-channels

APCu can now be installed as follows:

pecl -C ./pear.conf install channel://pecl.php.net/apcu-4.0.4

Accept all default values. Afterwards, open /opt/php-5.6.0beta3/lib/php.ini...

vi /opt/php-5.6.0beta3/lib/php.ini

... and add the line extension=apcu.so at the end of the file (you can also configure some additional APCu settings):

[...]
extension=apcu.so
apc.enabled=1
apc.shm_size=128M
apc.ttl=0
apc.gc_ttl=600
apc.enable_cli=1
apc.mmap_file_mask=/tmp/apc.XXXXXX
;apc.mmap_file_mask=/dev/zero
;apc.shm_segments = 5

The memcache extension can be installed as follows:

pecl -C ./pear.conf install memcache

Open /opt/php-5.6.0beta3/lib/php.ini...

vi /opt/php-5.6.0beta3/lib/php.ini

... and add the line extension=memcache.so at the end of the file:

[...]
extension=memcache.so

Since January 3, the ionCube loader is available for PHP 5.5. The ionCube Loader can be installed as follows:

cd /tmp

Next download and unpack the correct ionCube Loader package for your architecture (x86_64 or x86).

For x86_64:

wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar xfvz ioncube_loaders_lin_x86-64.tar.gz

For x86:

wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86.tar.gz
tar xfvz ioncube_loaders_lin_x86.tar.gz

Proceed as follows:

cp ioncube/ioncube_loader_lin_5.5.so /opt/php-5.6.0beta3/lib/php/extensions/no-debug-non-zts-20131226/ioncube.so
vi /opt/php-5.6.0beta3/lib/php.ini

Add the line zend_extension = /opt/php-5.6.0beta3/lib/php/extensions/no-debug-non-zts-20131226/ioncube.so right at the beginning of the file (before the [PHP] line):

zend_extension = /opt/php-5.6.0beta3/lib/php/extensions/no-debug-non-zts-20131226/ioncube.so
[PHP]
[...]

Reload PHP-FPM afterwards:

/etc/init.d/php-5.6.0-fpm reload

In ISPConfig 3.0.5, you can configure the new PHP version under System > Additional PHP Versions. On the Name tab, you just fill in a name for the PHP version (e.g. PHP 5.6.0beta3) - this PHP version will be listed under this name in the website settings in ISPConfig:

Click to enlarge


Go to the PHP-FPM Settings tab (the FastCGI Settings tab can be left empty) and fill out the fields as follows:

Click to enlarge

Please do not use the comment function to ask for help! If you need help, please use our forum.
Comments will be published after administrator approval.
Submitted by lightjail (not registered) on Sat, 2014-06-14 21:02.

tested on ubuntu 14.04 with php 5.6.0beta4 >  ok 
 
apcu 4.0.6 (beta) > ok
 
pecl -C ./pear.conf install channel://pecl.php.net/apcu-4.0.6 
 
ioncube is not runnig!!!:
 
 root@XXXXX:/tmp# /etc/init.d/php-5.6.0-fpm restart

Gracefully shutting down php-fpm . done

 done

Starting php-fpm Cannot load the ionCube PHP Loader - it was built with configuration API220121212,NTS, whereas running engine is API220131226,NTS

 
 
 
Submitted by Goossens (not registered) on Tue, 2014-06-03 10:40.


After the command: pecl -C ./pear.conf install channel://pecl.php.net/apcu-4.0.4

 I got the following error:

 /tmp/pear/temp/apcu/apc_cache.c: In function ‘apc_cache_update’:

/tmp/pear/temp/apcu/apc_cache.c:1004:53: error: ‘IS_CONSTANT_INDEX’ undeclared (first use in this function)

/tmp/pear/temp/apcu/apc_cache.c:1004:53: note: each undeclared identifier is reported only once for each function it appears in

/tmp/pear/temp/apcu/apc_cache.c:1006:22: error: ‘IS_CONSTANT_ARRAY’ undeclared (first use in this function)

/tmp/pear/temp/apcu/apc_cache.c: In function ‘my_serialize_object’:

/tmp/pear/temp/apcu/apc_cache.c:1127:34: error: ‘IS_CONSTANT_INDEX’ undeclared (first use in this function)

/tmp/pear/temp/apcu/apc_cache.c: In function ‘my_copy_zval’:

 

/tmp/pear/temp/apcu/apc_cache.c:1360:10: error: ‘IS_CONSTANT_ARRAY’ undeclared (first use in this function)

make: *** [apc_cache.lo] Error 1ERROR: `make' failed

 

 Is this a known issue?
 
Submitted by lightjail (not registered) on Sat, 2014-06-14 21:05.
check this

 

pecl -C ./pear.conf install channel://pecl.php.net/apcu-4.0.6

Submitted by ctrlfrk (not registered) on Sun, 2014-06-08 12:06.
I run into the same problem on debian-unstable amd64. No idea how to fix it.