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

Me, elsewhere

Miscellaneous public code

A PHP API client for Reddit

I don't tweet much

XMPP chat
(Pidgin, Miranda, Swift, etc.)

Perfect is the enemy of good enough.

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 Linux 6.x,
  • 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 autoconf to version 2.64 or higher, which must be done manually instead of via 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.69

Start by installing autoconf 2.69. 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.69.tar.gz https://ftp.gnu.org/pub/gnu/autoconf/autoconf-2.69.tar.gz
tar xfz autoconf-2.69.tar.gz
cd autoconf-2.69
./configure --prefix=/usr
make && make install

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

autoconf (GNU Autoconf) 2.69
Copyright (C) 2012 Free Software Foundation, Inc.

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.

wget https://www.php.net/distributions/php-7.2.21.tar.gz
tar xfz php-7.2.21.tar.gz
cd php-7.2.21
./configure --enable-maintainer-zts
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.21 (cli) (built: Aug 18 2019 13:08:03) ( ZTS )

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.21/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.21 directory
make clean
rm -f configure && ./buildconf --force

If you receive the following error, something didn't work out with your autoconf 2.69 installation; 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 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.


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

Updated September 1, 2019 to reference PHP version 7.2.21.

PHP logo by Colin Viebrock (http://php.net/logos) CC BY-SA 4.0, via Wikimedia Commons

Recent articles

📰 Caveat with Vantec SATA/IDE to USB 2.0 Adapter and Macrium software

📰 Jay Niffley, Man of Mystery

📰 Compiling Doxygen on FreeBSD without LaTeX and Ghostscript

📰 Introducing Snuze, a PHP client for the Reddit API

📰 jisusaiche: Java's installer telemetry

📰 BIND client log error "query_find: query_getdb failed"

📰 Resolving "The lang/perl5.24 port has been deleted: Has expired" portmaster error

📰 Armagaddon2 interim fix for Firefox 56 and other old versions

📰 Strange DNS queries: qname "miep", qtype ANY

📰 Undeliverable as addressed: A massive broken spam campaign?

📰 Using WITH_META_MODE and ccache for FreeBSD build boosts

📰 Resolving subversion error E000013: Unable to create pristine install stream

📰 Enhancements to SmokePing's AnotherDNS probe

📰 Generating vanity DNSSEC key tags

📰 DDoS involving forged packets from

▲ Back to top | Permalink to this page