This tutorial concerns the new PHP SDK and PHP 7.2 and later, while the described PHP SDK is compatible with at least PHP 7.0. To build PHP prior to 7.0, or if you experience issues building PHP lower than 7.2 with the new PHP SDK, please refer to older documentation.
Building PHP on Windows will require three things
PHP officially supports building with Microsoft's Visual C++ compilers. MinGW and Cygwin are NOT supported. ICC and clang can be used for experimental purposes. Though, be aware, the production quality binaries are guaranteed only by using Visual C++. The freely available Community VC++ editions are fully supported and can be used. For more information and how to get the compiler see the supported versions. The following VC++ versions are supported:
Always keep your installed Visual C++ up to date. Otherwise build errors may occur due to dependencies built with newer versions.
Support for a certain Visual Studio version means only support for its default platform toolset; building PHP with a non-default platform toolset (such as 14.16 with Visual Studio 2019) may work, but is not recommended.
In filenames (and the PHP_SDK_VS
environment variable; see below) the Visual Studio version is usually abbreviated. Before Visual Studio 2019, the abbreviation used the scheme “vc#” (for instance, “vc14”). This number (“#”) has tradionally been the major number of the respective platform toolset. The preview releases of Visual Studio 2017 shipped with platform toolset 15.00, so “vc15” was used. The first GA release of Visual Studio 2017, however, shipped with platform toolset 14.10 (to signal the backward compatibility), but the internal Visual Studio version number stayed 15.00. To avoid confusion “vc15” has been kept. For the Visual Studio 2019 builds (master), the “vc#” has finally been changed to “vs#” (note the “s”), where the number now designates the major internal Visual Studio version number.
The PHP SDK 2.0.0+ provides starter scripts, that automatically setup the compiler environment. The starter scripts also provide functionality to inject custom setup pieces. To create a customized setup script, put your code into the file phpsdk-local.bat
into the PHP SDK root dir. The following variables are automatically available within the PHP SDK shell
set
commandThe full list of the tools included with the PHP SDK can be found on the repository readme page.
Each version of Visual Studio (or Windows SDK) provides a command prompt environment for compiling (available from the Start Menu group). It is usable, for example, if you want to omit the starter scripts usage or want to test a pre release Visual Studio version.
All commands in the rest of this document should be run in the appropriate command prompt.
phpsdk_deps -u
This should be done only once before building PHP. The reference binary SDK directory used here is c:\php-sdk
, an arbitrary location can be used depending on concrete circumstances. Consequently, we use the path C:\php-sdk\phpdev\vc14\x64\php-7.1.0-src
as a reference path for the Visual C++ 64-bit build of PHP 7.1.0.
c:\php-sdk
bin
, lib
and msys2
cd c:\php-sdk\
phpsdk_buildtree
batch script which will create the desired directory structure: phpsdk_buildtree phpdev
phpsdk_buildtree
script will create the path according to the currently VC++ version used and switch into the newly created directoryC:\php-sdk\phpdev\vX##\x##
, where:vX##
is the compiler version you are using (eq vc14
or vs16
)x##
is your architecture (x86
or x64
)C:\php-sdk\phpdev\vc14\x64\php-7.1.0-src
deps
directory. Do one of the followingphpsdk_deps -u
Note, that no cross builds are currently supported by the PHP SDK starter scripts.
c:\php-sdk\phpsdk-vc14-x64.bat
cd C:\php-sdk\phpdev\vc14\x64\php-7.1.0-src
buildconf
configure --help
configure --disable-all --enable-cli --enable-$remains
nmake
nmake snap
nmake clean
buildconf --force
configure --disable-all --enable-cli --enable-$remains
nmake
Many PECL extensions already have prebuilt DLLs which can be downloaded from the extension page on the PECL web site. For example, on the APCu extension page, there are *DLL* links next to the release archive link. They lead you to a page where you can download the compiled extension for your desired PHP version and architecture.
To build a PECL extension (for example APCu):
pecl
on the same level as your PHP source directory, e.g. C:\php-sdk\phpdev\vc14\x64\pecl
pecl
directoryC:\php-sdk\phpdev\vc14\x64\pecl\apcu
apcu-4.0.7
c:\php-sdk\phpsdk-vc14-x64.bat
buildconf
configure --help
should now contain an option to enable APCu --enable-apcu Whether to enable APCu support
configure --disable-all --enable-cli --enable-apcu
nmake
php -m
command, to make sure APCu is loadedAt this point, your compiled extension will be located in the release directory.
Alternatively to the “in-tree” build described above, you can do a “phpize” build, what is mostly useful if you don't need to build PHP from source, but rather use a pre-built PHP binary package.
c:\php-sdk\phpsdk-vs16-x64.bat
PATH
phpize
configure --help
to see the list of configuration options--enable-apcu
)--with-prefix
which expects the PHP folder to be passed--with-php-build
folder, or use the --with-extra-includes
and --with-extra-libs
options; suitable pre-built libraries can be found on https://windows.php.net/downloads/php-sdk/deps/ and https://windows.php.net/downloads/pecl/deps/configure
with the desired optionsnmake
nmake test
If you want to build your extension via Github Actions, consider to use https://github.com/php/php-windows-builder or https://github.com/php/setup-php-sdk.
When you have successfully compiled PHP, the release directory can be one of multiple, depending on the build configuration:
If you are compiling using a 64-bit compiler, then these directories will be located in a directory called `x64`.
set LDFLAGS=/d2:-AllowCompatibleILVersions
and re-configuring the build.