PHP SDK is a tool kit for Windows PHP builds.
The PHP SDK itself and the SDK own tools and code are licensed under the BSD 2-Clause license. With the usage of the other tools, you accept the respective licenses.
The toolset consists on a mix of the hand written scripts, selected MSYS2 parts and standalone programs. It supports any workflows, be it a custom, local or a CI build whatsoever.
The PHP SDK 2.2+ is compatible with PHP 7.2 and above.
The PHP SDK 2.1 is required to build PHP 7.1 or 7.0.
The legacy binary tools SDK is available from the legacy branch and is suitable to build PHP 5.
Visual C++ 2017
or Visual C++ 2019
must be installed prior SDK usage. Required components
Cygwin
, MingW
or any other cross solution is installed, please read notes in the pitfalls sectionphpsdk_buildtree
- initialize the development filesystem structurephpsdk_deps
- handle dependency librariesphpsdk_dllmap
- create a JSON listing of DLLs contained in zip filesphpsdk_pgo
- run PGO training phpsdk_version
- show SDK versiontask.exe
- wrapper to hide the given command linebison
3.3.2, re2c
1.1.1, lemon
awk
, gawk
, sed
, grep
, jq
diff
, diff3
, patch
md5sum
, sha1sum
, sha224sum
, sha256sum
, sha384sum
, sha512sum
7za
, zip
, unzip
, unzipsfx
wget
, pwgen
These are not included with the PHP SDK, but might be useful. While Visual C++ is the only required, the others might enable some additional functionality. Care yourself about making them available on your system, if relevant.
Git
- useful for PHP source managementCppcheck
- used for static analysisclang
- useful for experimental builds and for static analysisICC
- useful for experimental buildsConEmu
- console emulator with tabs and moreThe PHP SDK should be unzipped into the shortest possible path, preferably somewhere near the drive root.
Usually, the first step to start the PHP SDK is by invoking one of the suitable starter scripts. This automatically puts the console on the correct environment relevant for the desired PHP build configuration.
It is not required to hold the source in the PHP SDK directory. It could be useful, for example, to simplify the SDK updates.
git clone https://github.com/Microsoft/php-sdk-binary-tools.git c:\php-sdk
cd c:\php-sdk
git checkout php-sdk-2.1.9
or laterphpsdk-vc15-x64.bat
phpsdk_buildtree phpmaster
git clone https://github.com/php/php-src.git && cd php-src
, or fetch a zipballphpsdk_deps --update --branch master
, use phpsdk_deps --update --branch X.Y
for a non master branchbuildconf && configure --enable-cli && nmake
More extensive documentation can be found on the wiki.
git clone https://github.com/Microsoft/php-sdk-binary-tools.git c:\php-sdk
A script called phpsdk-local.bat has to be put into the PHP SDK root. If present, it will be automatically picked up by the starter script. A template for such a script is included with the PHP SDK. This allows to automatically meet any required preparations, that are not foreseen by the standard PHP SDK startup. Be careful while creating your own phpsdk-local. It's your responsibility to ensure the regular PHP SDK startup isn't broken after phpsdk-local.bat was injected into the startup sequence.
The starter scripts can be also easy integrated with the consoles other than standard cmd.exe. For the reference, here's an example ConEmu task
C:\php-sdk\phpsdk-vc15-x64.bat -cur_console:d:C:\php-sdk\php72\vc15\x64\php-src
An elementary functionality to run unattended builds is included. See an example on how to setup a simple unattended build task in the doc directory.
Be aware, that starter scripts always start a new shell. Scripts intended to run as a task need to be passed with -t
argument to a starter script.
If the PHP SDK is kept as a git checkout, merely what is needed instead is to git fetch and to checkout an updated git tag.
The SDK tools are based on the KISS principle and should be kept so. Basic tools are implemented as simple batch script. The minimalistic PHP
is available for internal SDK purposes. It can be used, if more complexity is required. A suitable PHP binary is bound with the PHP SDK. If you have an idea for some useful tool or workflow, please open a ticket or PR, so it can be discussed, implemented and added to the SDK. By contributing an implementation, you should also accept the SDK license.
As of the version 2.1.0, the SDK includes a tool for the PGO optimization. Several training cases are included by default, which are based on the real life opensource applications. The PGO optimization can give an overall speedup up to 30%. The work on adding more training scenarios for the widely used opensource apps is ongoing. If you have a training scenario to share, please create a PR to this repo. Any new training cases are thoroughly validated through the extensive performance tests.
phpsdk_pgo --init
. Note that composer requires huge amounts of memory, so
it may be necessary to set the environment variable COMPOSER_MEMORY_LIMIT=-1
.
The PGO initialization may not succeed in x86 enviroments.--enable-pgi
phpsdk_pgo --train
nmake clean-pgo
--with-pgo
A custom scenario can be used to produce a custom PHP binary dedicated to an arbitrary application.
The existing training cases can be found in pgo/cases. Assumed the case would be named myapp
, the general steps to setup were
pgo/cases/myapp
pgo/cases/myapp/phpsdk_pgo.json
with the necessary definitions pgo/cases/myapp/nginx.partial.conf
with a partial NGINX templatepgo/cases/myapp/TrainingCaseHandler.php
with a class as defined in the interfaceAfter a training case is implemented and put under pgo/cases
, the work environment needs to be reinitialized. The tool puts all the training data and necessary applications under pgo/work
. Rename or remove that directory and rerun phpsdk_pgo --init
.
To skip a training case, add a file named inactive
into the case folder.
This part covers debugging possibilities for the builds produced by the native VS compilers. For the cross compiled builds produced with toolsets other than VC++, please check the documentation for the corresponding toolsets. In any case, general principles on debugging native programs apply.
Either a debug build of PHP or enabled debug symbols are required to be able to debug PHP.
A debug build is usually more suitable for the development process and can be produced by
adding --enable-debug
to the configure options. A release build with debug symbols can
be produced by adding --enable-debug-pack
. These options are mutually exclusive.
--enable-debug
or --enable-debug-pack
.nmake run ARGS=yourscript.php DEBUGGER=1
, that will open a Visual Studio window.Debug -> New Breakpoint -> Function Breakpoint
and add a function where the debugger should break.Start
.Adding a breakpoint before starting debugging might be not necessary, if a crash is debugged. When such a script runs under the debugger, the debugger will stop at the crashing point. In that case, a breakpoint can be added around the crashed code directly.
The Microsoft Child Process Debugging Power Tool plugin for Visual Studio is required. After installing it, following these steps
nmake test TESTS=ext/myext/tests/sometest.phpt DEBUGGER=1
Debug -> Other Debug Targets -> Child Process Debugging Settings
and enable child process debugging.PHP can also be debugged with the tools from the WinDbg package. There is currently no way implemented in the Makefile to start the WinDbg integrated, so it needs to de done manually. Either a debug build or a release build with debug symbols is still required, as described previously.
#winphp-dev
on Freenode to discuss any ideas or questionscore.autocrlf
configuration directive set to false
is recommended.task.exe
is not a console application, some systems might not propagate exit code except the batch is explicitly run from cmd /c
, etc.7za
should be preferred over unzip
and zip
for compatibility reasons.This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments.