$this = (new Soapbox())->shout(array_map('strtoupper', $opinions)); //Shaun's blog


Installing PHP 7.2 with pthreads on CentOS 6

Posted January 12, 2018 by shaun

This week I finally took the plunge and upgraded most of the servers I work with from PHP 7.1 to PHP 7.2. (Some of them still can't be brought forward due to dependencies that use mcrypt.) I ran into a few snags with the upgrade to 7.2 and thought I'd document them here. This may be useful if you:

  • Run CentOS 6 (6.9 in my case),
  • Want to install PHP 7.2,
  • Need pthreads support in PHP, and
  • Prefer to compile PHP from source

Executive summary

In order to build PHP 7.2 with pthreads on CentOS 6, you must upgrade to autoconf 2.64, which can't presently be done through the yum package manager. You'll also have to first build PHP 7.2 without pthreads, then use this "bootstrap" copy to prepare the pthreads extension before compiling PHP a second time.

autoconf 2.64

Start by installing autoconf 2.64. The latest version available through yum is 2.63, which isn't sufficient to build PHP's configure script.

It's critical that you supply the --prefix=/usr option when configuring autoconf. The default installation prefix for the generic autoconf distribution is /usr/local, but CentOS 6 keeps it in /usr. If you forget to set the correct prefix, you're going to wind up with two different versions of autoconf installed, and who wants that?

curl -Lo autoconf-2.64.tar.gz ftp://ftp.gnu.org/pub/gnu/autoconf/autoconf-2.64.tar.gz
tar xfz autoconf-2.64.tar.gz
cd autoconf-2.64
./configure --prefix=/usr
make && make install

Make sure the correct version has been properly installed. autoconf --version should show:

autoconf (GNU Autoconf) 2.64
Copyright (C) 2009 Free Software Foundation, Inc.
[..snip..]

Bootstrap PHP 7.2

Compiling PHP 7.2 with pthreads presents a bit of a Catch-22: in order to build the pthreads extension, you need to have the 7.2 version of PHP (more accurately, a version with ZEND_MODULE_API_NO >= 20170718) and its libraries already installed. To work around this scenario, it's necessary to compile and install a minimal version of the PHP 7.2 CLI first, then use this "bootstrap" version to prepare pthreads.

Start by obtaining the latest PHP 7.2 source distribution and doing a minimal build. The only option you need to pass to configure this time around is --enable-maintainer-zts, to turn on thread safety. Don't worry about other modules (mysqli, PDO, etc.) as you're not going to be keeping this version of PHP installed for long. If you also run PHP as an Apache module, disregard that for now and just build the CLI version.

curl -Lo php-7.2.1.tar.gz http://us3.php.net/get/php-7.2.1.tar.gz/from/this/mirror
tar xfz php-7.2.1.tar.gz
cd php-7.2.1
./configure --enable-maintainer-zts
make
make install

Verify that a thread-safe version of PHP 7.2 has been installed. The output of php -v should indicate a 7.2 version number and the ( ZTS ) signature.

PHP 7.2.1 (cli) (built: Jan 8 2018 17:14:36) ( ZTS )
[..snip..]

Prepare pthreads

Obtain and prepare the pthreads extension. Note there's a dot . as the final argument to git clone. If you don't use git, you can manually download a .zip file of the pthreads source.

cd ext      #this should put you in the php-7.2.1/ext directory
mkdir pthreads && cd pthreads
git clone https://github.com/krakjoe/pthreads.git .
phpize && ./configure && make install

If you receive error output that includes the following,

php_pthreads.c:38:3: error: #error "pthreads requires PHP 7.2, ZTS in versions 7.0 and 7.1 is broken"

...this means that your bootstrap PHP 7.2 didn't install properly, and you have an older PHP command line binary on your system. You should repeat the bootstrapping step above.

Build your final PHP 7.2

Now it's time to build PHP 7.2 for real. Return to the main PHP source tree, clean up the artifacts from the bootstrap build, and generate a new configure script. The ./buildconf --force command creates a new configure script that tells PHP how to bundle the pthreads extension.

cd ../..    #this should put you in the php-7.2.1 directory
make clean
rm -f configure && ./buildconf --force

If you receive the following error, something didn't work out with your autoconf 2.64 installation and you should scroll up and do that part again.

Forcing buildconf
Removing configure caches
buildconf: checking installation...
buildconf: autoconf version 2.63 found.
           You need autoconf version 2.64 or newer installed
           to build PHP from Git.
make: *** [buildmk.stamp] Error 1

At this point you should configure PHP as you normally would, enabling whatever options and extensions you require, including the Apache build option if that applies. Since pthreads was the main point of this exercise, don't forget to turn it on by passing the --enable-pthreads=shared and --enable-maintainer-zts options as well. Here's an example from one of my servers:

./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-openssl --with-zlib \
  --with-curl --with-gd --with-snmp --with-pdo-mysql --with-ldap --enable-pcntl \
  --enable-pthreads=shared --enable-maintainer-zts --with-config-file-path=/usr/local/etc
make
make install

Near the end of the output from make install, look for a line like this:

Installing shared extensions: /usr/local/lib/php/extensions/no-debug-zts-20170718/

You'll need this path in the next step.

Get php-cli.ini in order

Finally, it's time to activate pthreads so you can use it. This is done by editing PHP's configuration file.

Because the pthreads extension only works with the command line version of PHP, you only want to enable it when the CLI SAPI is active. Conveniently, PHP allows you to create a separate php-cli.ini file for the command line binary. This prevents other SAPIs, such as the Apache module, from trying to load pthreads and causing problems.

Find the php.ini file that PHP is using on your system. Running php --ini will ouput a line indicating the currently loaded configuration file. If this file is named simply php.ini, make a copy of it called php-cli.ini in the same directory as the original. Then run php --ini again and verify that the "Loaded Configuration File" points to php-cli.ini.

Open php-cli.ini in your editor and add the following line to activate the pthreads extension. The path to pthreads.so will be the directory you noted from the previous step. You can place this line anywhere in the file, but the section labeled "Dynamic Extensions" is a reasonable spot for it.

extension=/usr/local/lib/php/extensions/no-debug-zts-20170718/pthreads.so

Now run php -m to verify that pthreads appears in the list of loaded modules, and you're all set.



Recent articles

📰 Unusual HTTP POST traffic from 75.108.75.42

📰 1.1.1.1: Fast, but not so accurate (yet)

📰 autodiscover.xml as an Indicator of Attack

📰 Blocking Facebook's Tracking and Surveillance: A Comprehensive Approach

📰 Let's Encrypt Readies for Certificate Transparency with Embedded SCTs

📰 Evaluating DNSBL Effectiveness with Postfix Logs

📰 Russian/Ukrainian Referer Spam Campaign IPs

📰 Resolving subversion error E145001: Node has unexpectedly changed kind

📰 Installing PHP 7.2 with pthreads on CentOS 6

📰 LocalStorage kills another site, or: Working around Zap2it's new interface

📰 A new DNS geolocation service from PowerDNS

📰 Firefox's privacy.resistFingerprinting option reports a very old User-Agent (50.0)

▲ Back to top | Permalink to this page