Changing PHP Version On Vagrant
(adsbygoogle = window.adsbygoogle || []).push({});
After nearly 24 hours of working on this issue I finally figure out how to change the running version of PHP from the WEB SERVER under VVV for my WordPress development environment. I recall, at a WordPress conference last year, someone touting how easy it was to change PHP versions to test plugin and theme development on various deployment stacks. Sure, if you happen to want to pull a whole new box image with just the right version of PHP along with all your other tools in place.
For me, I wanted to keep my vanilla Vagrant box with a single mapped directory intact. I wanted the SSL certificates I created to remain as well, which was another day-long project. The only thing I wanted to do was replace the default PHP 5.5 release with PHP 5.4.43 to match that of a client. I’d also like to test with PHP 5.2 someday as that is the minimum supported version for WordPress.
It turns out that changing the PHP version at the command line is easy. Making it take affect in nginx, the default web server for VVV, is a whole other story. I found lots of resources on doing this “simple trick” but very few were current and almost ALL were missing information or provide cryptic installs such as “on Apache” (not the VVV default web server) or “on Debian” (no the VVV default distro).
The Summary
Install and use phpbrew to build the PHP flavor you are looking for.
Find your particular flavor of PHP under the vagrant user directory and get the path to the socket listener.
Modify the nginx configuration file to use the socket for your flavor of PHP.
Restart nginx.
Installing phpbrew
Install phpbrew either by going to the phpbrew site and following their instructions OR go to the Vagrant site , install Vagrant, and then clone the repo to a local directory. After cloning the repo checkout the feature/phpbrew branch. phpbrew will be installed and ready-to-run.
I chose the “install manually” option as I wanted to keep my Customfile and some tweaks to my config files that I already had in place on my current “non-repo based” Vagrant box.
# curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew # chmod +x phpbrew # sudo mv phpbrew /usr/local/bin/phpbrew
Make sure you run the phpbrew init command, preferably as the default vagrant login NOT as root. This will create a hidden .phpbrew directory under your user’s (vagrant) home directory (/home/vagrant).
# phpbrew init
Install Your PHP “Flavor”
Decide what version of PHP you want to run and install it with phpbrew. This may take a little time. When it is done you should have some new directories under your /home/vagrant/.phpbrew/php folder for the version you installed.
You will want some default options as well. Here is my command for PHP 5.4.43 with the default configuration, FPM support, MySQL support, and CLI support.
# phpbrew install 5.4.43 +default +fpm +mysql +cli
Find The Socket Listener
Under the ~/.phpbrew/php//etc directory you will find the configuration files for that version of PHP. Search the files for the line that loads the socket listener. The socket listener ends with .sock and is usually in a /run/ directory. I use grep to search:
# cd ~/.phpbrew/php/php-54.43/etc # grep -iR 'php-fpm.sock' * php-fpm.conf:listen = /home/vagrant/.phpbrew/php/php-5.4.43/var/run/php-fpm.sock
The part after the listen = that is returned is the patch to the PHP 5.4.43 socket listener for FPM.
Modify The nginx Config
I edited this directly on my guest box by logging in with vagrant ssh and restarted nginx. The default config file is at /etc/nginx/nginx.conf
Look for the line that loads the current socket listener, usually in the /var/run directory and comment it out. Put another line in that points to your specific PHP listener. Here is my snippet pointing to my PHP 5.4.43 version:
# Upstream to abstract backend connection(s) for PHP. upstream php { # server unix:/var/run/php5-fpm.sock; server unix:/home/vagrant/.phpbrew/php/php-5.4.43/var/run/php-fpm.sock; }
The other option to make this more permanent is to edit the vagrant config files. Got to the directory that contains your Vagrant environment, the place with the Vagrantfile, and go to the ./config/nginx-conf/ subdirectory. Edit the nginx.conf file. This is the file that will build the /etc/nginx.conf file whenever you provision your Vagrant box. If you change this file you will want to run vagrant provision from your host.
Restart nginx
Again, I did this from the command line on my vagrant box after logging in with vagrant ssh.
# sudo service nginx restart
Check Your Work
Go to to your web browser and check the phpinfo status.
By default this is found at http://vvv.dev on your host.
Click the phpinfo link.
Take a look at https://tomjn.com/2017/01/16/whats-new-vvv-2-0/ for an even better way. Thank you for your write up though!