Not too long ago, I wrote an article indicating Some Great Reasons to use a Local Debian Server running Virtualmin. In it, I mentioned that I had built a Debian 10 server to try out the Virtualmin control panel. Virtualmin is a control panel that allows adding of websites to a server for access to a private or public network.
When building the server and testing its operation for handling WordPress websites, there were a couple of snags I ran into. Hopefully the info here can save you some hassle in looking up how to fix those. This article is the result of pouring through many websites and deciphering the usually cryptic Linux info and putting together some “How to” information written in English to possibly help save you some time.
Getting and Setting up PHP versions
After setting up Virtualmin on a Debian 10 server, the first thing I noticed was that only PHP 7.3 was available. So, the hurdle I had to overcome was how to at least change the PHP version to PHP 7.4 or PHP 8.0. As it turns out, it was fairly straightforward and turned out even better than I had expected.
I was able to add the following versions to the system:
- PHP 5.6 (long past end of life but we have kept it available for compatibility of very much older sites)
- PHP 7.3 (this version was the only one already installed when I loaded up Virtualmin and got it running – we have been removing this version from many of our production servers and will keep it on several servers for sites that might not be able to run without it)
- PHP 7.4 (not past end of life at the time of this writing but is the oldest version that WordPress will not squawk about in its Dashboard’s Tools > Site Heath checker)
- PHP 8.0 (we run this on our production servers at the time of this writing)
- PHP 8.1 (we run this on our production servers at the time of this writing)
- PHP 8.2 (the newest version at the time of updating this writing 2/16/23 and great to have this as well since we can start testing new sites on this so they will be up-to-date for a longer time period and can roll a site back to older versions if plugins and themes do not function under it)
Setting these additional PHP versions up in Debian required root access. Once I discovered the correct syntax it was easier than I thought it would be. I used PuTTY installed on a Windows 10 workstation to log in as the root user.
NOTE: The following paragraph was added when I went to install additional versions onto a new Virtualmin box running Debian 11.
A stumbling block I had to get past was that I didn’t have the correct repository installed for my Virtualmin setup. This solves that issue:
apt-get -y install apt-transport-https lsb-release ca-certificates curl && curl -sSL -o /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg && sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/sury-debian-php-$(lsb_release -sc).list' && apt-get update
Then I individually executed the commands below which installed the various versions of PHP:
apt-get install php5.6-{cli,pdo,fpm,zip,gd,xml,mysql,cgi,intl,opcache,curl,imagick,sqlite,mbstring} apt-get install php7.3-{cli,pdo,fpm,zip,gd,xml,mysql,cgi,intl,opcache,curl,imagick,sqlite,mbstring} apt-get install php7.4-{cli,pdo,fpm,zip,gd,xml,mysql,cgi,intl,opcache,curl,imagick,sqlite,mbstring} apt-get install php8.0-{cli,pdo,fpm,zip,gd,xml,mysql,cgi,intl,opcache,curl,imagick,sqlite,mbstring} apt-get install php8.1-{cli,pdo,fpm,zip,gd,xml,mysql,cgi,intl,opcache,curl,imagick,sqlite,mbstring} apt-get install php8.2-{cli,pdo,fpm,zip,gd,xml,mysql,cgi,intl,opcache,curl,imagick,sqlite,mbstring}
If you are using a CentOS based system, you should use these commands instead:
yum install php5.6-{cli,pdo,fpm,zip,gd,xml,mysql,cgi,intl,opcache,curl,imagick,sqlite,mbstring} yum install php7.3-{cli,pdo,fpm,zip,gd,xml,mysql,cgi,intl,opcache,curl,imagick,sqlite,mbstring} yum install php7.4-{cli,pdo,fpm,zip,gd,xml,mysql,cgi,intl,opcache,curl,imagick,sqlite,mbstring} yum install php8.0-{cli,pdo,fpm,zip,gd,xml,mysql,cgi,intl,opcache,curl,imagick,sqlite,mbstring} yum install php8.1-{cli,pdo,fpm,zip,gd,xml,mysql,cgi,intl,opcache,curl,imagick,sqlite,mbstring}
Checking the Versions in Virtualmin
Once the PHP versions above were installed on the server, I did the following:
- Logged into my Virtualmin
- Chose the Webmin tab
- Clicked on Refresh Modules
- Clicked on Dashboard
- Scrolled down and viewed Servers Status
My additional versions of PHP were now showing there along with other servers.
The missing “intl” PHP extension
I was pretty pleased with how everything looked at this point so I decided to test out a WordPress installation. Note that actually setting up a website server in Virtualmin is beyond the scope of this particular article but will be the topic of a future one.
I set up a test website on a domain already pointed to the server. I then used the WordPress install script in it. While I ran through the process and didn’t really notate a lot while doing it, I recall that after answering a number of questions in the script when WordPress came up with its installation screen it did not seem to recall my username and password, so I had to enter those again. After that, I actually had WordPress complete its install.
Once in the new WordPress installation’s Dashboard, I immediately went to Tools > Site Health to see what WordPress itself thought of its environment. At that point it told me that I was missing the intl PHP extension. The intl PHP extension is indicated by WordPress to be an optional extension, but as a rule I always add what WordPress suggests n order to get a clean Site Heath reading whenever possible.
What “intl” is
I hadn’t recalled previously coming across intl before. The PHP Documentation indicates that intl is the internationalization extension. It goes on to indicate that intl is a wrapper for ICU library, enabling PHP programmers to perform various locale-aware operations including but not limited to formatting, transliteration, encoding conversion, calendar operations, UCA-conformant collation, locating text boundaries and working with locale identifiers, time zones and graphemes.
Adding the “intl” PHP extension
Researching setting up intl in PHP revealed even more cryptic bits and pieces of information that I had to experiment with to figure out how to finally install the missing intl PHP extension. As is nearly always the case, once the answer was discovered it was actually amazingly simple.
Adding the intl PHP extension in Debian required root access. Once I discovered the correct syntax, it was, much like when I was adding the PHP versions, easier than I thought it would be. I used PuTTY installed on a Windows 10 workstation to log in as the root user. Then I individually executed the commands below, which installed the various versions of PHP intl:
apt-get install php5.6-intl apt-get install php7.3-intl apt-get install php7.4-intl apt-get install php8.1-intl apt-get install php8.2-intl
If you are using a CentOS based system, you should use these commands instead:
yum install php5.6-intl yum install php7.3-intl yum install php7.4-intl yum install php8.1-intl yum install php8.2-intl
Once you have installed these, each PHP version needs to be restarted. That can be done using these steps in Virtualmin:
- Log into Virtualmin
- Choose the Webmin tab
- Clicked on Refresh Modules
- Clicked on Dashboard
- Scrolled down and viewed Servers Status
- Click the Restart PHP-FPM Server symbol after each of your PHP versions
That was it. I was then able to go into the WordPress installation and get a Site Health indication of a smiley face with its indication of “Great job! Everything is running smoothly here.”