Recently, to automate building, tagging, and pushing my
geerlingguy/php-apache Docker Hub image (see this issue), I needed to find a way to reliably determine the PHP major.minor.release version string. You'd think this would be simple.
Well, using Docker, I would run the image and then try:
# php --version
PHP 7.3.0-1+0~20181206202713.23+stretch~1.gbp076afd (cli) (built: Dec 6 2018 20:27:14) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.0-dev, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.0-1+0~20181206202713.23+stretch~1.gbp076afd, Copyright (c) 1999-2018, by Zend Technologies
That's great; it outputs the version right at the start. But there are a few problems here:
- The actual version is at a different place between older and newer versions of PHP
- I would have to add regex or string search code in bash to try to extract the version
- I would have to maintain regex for version matching
Basically, any automated solution I want to use and not have to spend a lot of time maintaining... I avoid regex unless it's the last resort.
Reading through the PHP docs on predefined constants, I found a really nice one:
PHP_VERSION. Yay! Testing locally on my Mac:
$ php -r 'echo PHP_VERSION . "\n";'
Great! Ship it!
But wait, when I tried this in the Docker container on Debian Stretch, I got:
# php -r 'echo PHP_VERSION . "\n";'
Nope. Gotta do regex again, not wanting to do that.
So in the end, I used a few other constants to build the string based on the major.minor.release components:
# php -r 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION . "." . PHP_RELEASE_VERSION . "\n";'
Now, why it's
PHP_VERSION, then the components are
PHP_[something]_VERSION... I attribute that to PHP's generally-inconsistent and annoying naming and parameter positioning insanity.
Note: If you're just wanting to compare PHP versions, or check if the installed version is greater than/equal to/less than some other version, you don't need to do all this wrangling. PHP includes a built in function
version_compare()which should work even with the distro-specific version string output from constants like