Building and testing the upcoming PHP7
The GoPHP7-ext project aims to ensure that all the known PHP extensions out there work with the upcoming PHP 7. This is non-trivial as some significant changes have occurred in the core PHP engine (related to performance) that mean that extensions need to be updated.
In order to help out (and prepare my own PHP code for PHP 7!), I needed the latest version of PHP7 working in a vagrant VM.
Fortunately Rasmus has created a such a VM called php7dev, so let’s start there.
Firstly we make a new directory to work in:
$ mkdir php7dev $ cd php7dev
Within this directory, we can set up the vagrant vm:
$ vagrant box add rasmus/php7dev $ vagrant init rasmus/php7dev $ vagrant up
If you are asked to enter the vagrant@127.0.0.1’s password, then it’s “vagrant“.
We can now work within the VM to Update to the latest PHP 7 and work with extensions:
$ vagrant ssh
PHP versions within the VM
Rasmus’ box comes with PHP versions 5.3, 5.4, 5.5, 5.6 and 7. For each of these versions, it provides four variants: release, debug, zts-release and zts-debug. A script, called newphp is provided that allows us to change between them like this:
$ newphp {version number} {type}
Where {version number} is one of: 53, 54, 55, 56, or 7 and {type} is one of: debug, zts or debugzts.
The ones I use are:
$ newphp 7 $ newphp 7 debug
The newphp script sets up PHP in both the CLI and nginx and rather usefully, sets up the correct phpize, so that when you build an extension, it will set it up for the current PHP.
Update PHP 7 to the latest version
PHP 7 is actively in development, so we’re going to have to update it regularly to pick up the new changes. Rasmus has helpfully provided a script that, makephp, that does this for us:
$ makephp 70
This will grab the latest source code for PHP 7 and then compile and install both the release and debug versions. The makephp script can also compile zts and other PHP versions – run it without arguments to find out how.
Activate your new PHP build:
- For PHP 7 release: $ newphp 7
- For PHP 7 debug: $ newphp 7 debug
Check that the “built” date is correct by viewing the output of php -v
In my case, I see:
PHP 7.0.0-dev (cli) (built: Mar 29 2015 11:33:44) Copyright (c) 1997-2015 The PHP Group Zend Engine v3.0.0-dev, Copyright (c) 1998-2015 Zend Technologies with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2015, by Zend Technologies
Building an extension
Building an extension is easy enough. Let’s walk through the apfd extension that’s in PECL:
$ cd ~/src $ git clone https://git.php.net/repository/pecl/http/apfd.git $ cd apfd $ make distclean; phpize && ./configure && make $ make test $ sudo make install
To install for any other PHP versions that you are using, change the current PHP installation via newphp and then repeating these steps.
To install the extension:
- $ echo "extension=apfd.so" | sudo tee /etc/php7/conf.d/mysql.ini > /dev/null
(Change php7 to the appropriate directory that’s in /etc/ for other PHP versions) - $ php -m to check that the module is loaded.
Writing tests and upgrading an extension
As the internal C API has changed significantly, code changes are required to make an extension work on PHP7.
The process for tackling this is to “adopt” an extension on the GoPHP7-ext Extensions catalogue and then read the Compiling and testing extensions article on the GoPHP7-ext site, followed by the Testing Extensions page.
If you want to tackle fixing the C code, then the key changes that need to be made can be found on the Upgrading PHP extensions from PHP5 to NG wiki page.
Testing that your PHP code works on PHP7
To test my PHP code, I share it into the VM. This is done in the Vagrantfile using the config.vm.synced_folder directive.
I want to share my Zend Framework 1 source, so I edit Vagrantfile and after the config.vm.box line, I add this line:
config.vm.synced_folder "/www/zendframework/zf1", "/www/zf1"
This maps my local source code which is at /www/zendframework/zf1 into the VM at the /www/zf1 directory.
Run vagrant reload after changing the Vagrantfile in order to effect the change.
I can now vagrant ssh into the VM, cd /www/zf1 and run my unit tests (after installing PHPUnit, of course). If you want to run a website, then you need to set up a vhost as appropriate within the VM.
Fin
Rasmus has provided a PHP 7 VM that’s very easy to keep up to date, so none of us have any excuse and need to be testing our PHP sites with it, reporting regressions and fixing our code!
Here is some help for building it on a Ubuntu box: https://gist.github.com/m1st0/1c41b8d0eb42169ce71a