PHP-logoLast weekend I decided to give PHP7 a try. Given it’s beta, I had to compile from source. As I already run a stable package version, this guide doesn’t cover the Debian packaging process. Instead we concentrate on installing PHP to an alternate directory.

Building PHP7

Firstly, install the build dependencies;

sudo apt-get -y build-dep php5
sudo apt-get -y install bison autoconf automake libtool pkg-config build-essential

I decided to download PHP from version control, and checkout the php-7.0.0beta1 tag;

git clone https://github.com/php/php-src.git
cd php-src/
git checkout php-7.0.0beta1
./buildconf --force

You have to force buildconf, as by default it believes itself to be a release package. Next, I saved my configure options to a shell script for replay;

./configure \
 --prefix=/opt/php7 \
 --enable-fpm \
 --enable-mysqlnd \
 --enable-opcache \
 --with-mysqli=mysqlnd \
 --with-pdo-mysql=mysqlnd \
 --with-openssl \
 --with-gd \
 --with-iconv \
 --with-curl \
 --with-mcrypt \
 --enable-mbstring \
 --enable-intl \
 --enable-memcache \
 --enable-zip \
 --with-zlib

This will compile PHP7 with some basic options, including php-fpm and php-mysqlnd. Finally, we can kick off the build process;

make

Installing PHP7 / PHP-FPM

sudo make install

Now PHP7 should be installed to /opt/php7.  We need to add PHP-FPM service management into Debian’s init.d folder. PHP ships a init.d script which works fine, except you need to make a slight change;

sudo cp ./sapi/fpm/init.d.php-fpm /etc/init.d/php7-fpm
sudo chmod +x /etc/init.d/php7-fpm
sudo sed -e 's/# Provides:\(\s*\)php-fpm/# Provides:\1php7-fpm/' -i /etc/init.d/php7-fpm
sudo update-rc.d php7-fpm defaults

Debian will trip up on the LSB Provides: line if you already run the php5-fpm package version. We need to switch the name to something different (i.e. php7-fpm). Above we use sed to change this value, which allows the update-rc.d command to run successfully.

Finally, I copy the php.ini-production example from the source distribution;

cp ./php.ini-production /opt/php7/lib/php.ini

Installing PHP7 Extensions

This is where it gets interesting; we configured PHP to install to the /opt/php7 prefix, which leaves the Debian packaged version untouched. This does however complicate matters, as configure will use the package version of php-config. You will need to download packages manually, and configure them using the correct php-config. I required the imagick extension, which hasn’t yet got a PHP7 compatible version in PECL;

sudo apt-get -y install libmagick++-dev
git clone https://github.com/mkoppanen/imagick.git
cd imagick
git checkout phpseven
/opt/php7/bin/phpize
./configure --with-php-config=/opt/php7/bin/php-config
make
sudo make install

Finally, add the extension to php.ini;

sudo sh -c "echo extension=imagick.so >> /opt/php7/lib/php.ini"

It’s worth noting that the PECL extensions I checked don’t seem yet to have been updated to facilitate the changes in the underlying Zend Engine.

Michael is a Software Engineer working in the North West of England. Michael spends his days building hand-crafted PHP applications. Rumours of his super-hero status are currently unconfirmed. He savours his victories when solving difficult programming challenges; occasionally writing about them here, on his personal blog.