Relocatable Apache & PHP7 on Windows
Creating a Relocatable Apache 2.4 with PHP 7.2
Several packaged versions of Apache and PHP (often bundled together with MariaDB or MySQL) are available. You may, however, want more control, or to understand how to create your own version. This document describes the process to create a relocatable (portable) development environment with Apache and PHP.
REQUIREMENTS — You will need the following knowledge and/or functionality…
- General Windows command-line experience. Administrator rights are not required.
- Access to the internet for downloading files and 7-zip to extract them.
Due to changes in the Visual C++ runtime library versions and structure, you must make sure that all the executables and DLLs you download are compiled with the same version of Visual C++. You can choose between VC++11 (came with Visual Studio 2012), and VC++14/15/16 (Visual Studio 2015/2017/2019 or Visual Studio Build Tools 2015/2017/2019).
Official PHP 7.3 compiled with VC++14, or VC++15 can be used, but must be compatible with the compiler used for Apache. VC++14 dlls are compatible with VC++15, and VC++16.
You also need to choose whether to use 32-bit (
i686) or 64-bit (
amd64) versions of everything — you cannot mix 32-bit and 64-bit versions. This document will focus on 64-bit, but as long as you replace all 64-bit downloads with the corresponding 32-bit downloads, the instructions will remain the same.
In all cases, you will require the appropriate (VS2015/VS2017/VS2019) vcredist_x86/x64 redistributable runtime library (
VC_redist_x86.exe). This may already be installed on your system, but it will not cause problems if you try to re-install it.
In summary, we focus on: VC++16; Apache 2.4.39; PHP 7.3.6 — all 64-bit. Although PHP is compiled with VC++15, and Apache with VC++16, this will not be an issue.
Create a directory anywhere, e.g.
D:\rxapache. You can choose any name, but it should not contain spaces, to avoid potential issues. Subdirectories of this
rxapache directory will contain the various components. We will refer to this directory as your
rxapache directory (the
rx is our convention for relocatable AKA “portable” applications).
Download & Unzip Apache
The recommended build of Apache for Windows can be found on Apache Lounge. Navigate to the VC16 Windows Binaries page, and download the Apache 2.4.39 64-bit binary (or newer version). You may also want to download the extra modules on the same page if you are familiar with them, but you do not need to. This setup does not require extra modules; you may need them for your own purposes, however.
Extract the downloaded
httpd-2.4.39-win64-VC15.zip file to the
rxapache directory. Rename the resulting
Apache24 directory to
apa (we like 3-letter directory names). The
ReadMe.txt and version files can be deleted if you so choose, but will not interfere in any way.
Optional: For each additional module you want to use, extract the individual
*.so file from each of the downloaded files to the
apa\modules directory. Personally, we generally extract all of them, except for the
*.so files. For those interested, the Apache Tomcat connector module is called
Download & Unzip PHP
For PHP debugging, download the xdebug 2.7.2 extension. A later version may also work. Extract the XDebug-supplied
php_xdebug.dll file, and optionally, the
php_xdebug.pdb file, to the
ext directory, under the
php directory. In other words, in the
The ImageMagick extension, (imagick 3.4.4) can be useful. Download the Thread Safe VC15 x64 3.4.4 version. Copy all
*.pdb files (the
*.pdb files are optional) to the
php\ext directory inside
rxapache. This extension requires dependencies, specifically, the ImageMagick 7 zip file. This can be used without PHP, so create an
rxapache\utl directory, and under that, an
imagick directory. Now extract the
bin\* files from the ImageMagick zip file, to the
The PHP Manual can be downloaded in several formats, and is useful to include. We have chosen to download the Many HTML files version. Make the main web site directory called
rxapache. Make another directory under
php for miscellaneous PHP-related files. Extract the downloaded
php_manual.en.tar.gzip file contents to the
php subdirectory under the
www directory. Then, rename the extracted directory:
doc, so that you now have:
NOTE — PHP Manual Alternatives
The PHP manual, once extracted, is quite big, so only download and extract it if you really need it. The CHM version of the help on the PHP Documentation page, is generally more convenient; plus it has an index, which makes for quick lookups. Another excellent alternative is to use the Zeal offline documentation viewer; Zeal also offers a “portable” version.
If you followed all the above instructions, your directory structure should be as follows:
d:\rxapache ├───apa │ ├───bin │ ├───cgi-bin │ ├───conf │ │ ├───extra ┆ ┆ ┆ ├───log ├───php │ ├───dev │ ├───ext ┆ ┆ ┆ ├───tmp ├───utl │ └───imagick └───www └───php └───doc └───images
Several configuration files must be edited. For PHP, this only involves one file, but for Apache, several files need to be modified (and an extra file for PHP created).
rxapache\php directory, you will find a
php.ini-development file. Copy this to
php.ini, and open in an editor.
xdebug extension requires an absolute path. Just under the
[PHP] tag in the
php.ini file, add:
If you have a release or beta version, its name might be different, and you should change the above line accordingly.
Configure PHP to save its log file in the same directory as Apache's log files, relative to the
httpd.exe process. Search for a commented line:
;error_log = …, then change it by removing the comment and change the value:
Save PHP session files in a
tmp directory, relative to the
In order for PHP to display errors in HTML, and create references to functions locally, ensure the following three settings are enabled and set:
NOTICE — PHP Manual HTML Files
If you decided not to download and extract the PHP Manual as explained above, then you should omit setting the two
docref… configuration variables.
If you want to use PHP to run a Wiki, like DokuWiki (see the DokuWiki recommendations), you may want to consider increasing some upload limits. Just reconsider these settings if you intend to use this for a public server.
PHP does not seem to find extensions in the standard directory by default, so set it explicitly:
Enable the relevant extensions. The extensions required will depend on your personal preferences and intended use. We enabled the following extensions to ensure that we can use DokuWiki, or because we expect them to be useful for other purposes:
We have now finished the PHP configuration. We must still enable the Apache PHP module, but that is part of the Apache configuration below.
As with the PHP configuration, the settings described here are suitable for local development, and not necessarily for a public server.
rxapache\apa\conf\extra directory, create a
httpd-php7.conf file to enable PHP7 as an Apache module. This must contain the following:
The default Apache configuration file is
httpd.conf, inside the
apa\conf directory. Open this file with an editor to modify some settings.
Apache determines many defaults from the
ServerRoot setting. Although we can set it up on the command line as an argument to
httpd.exe, it is easier to set it here:
Let Apache listen on all IPV4 addresses, and the chosen port. This is useful for the
ServerName setting as well (although you can change it to your actual server name):
DocumentRoot is the “main web site” directory, i.e., the directory you get with
/ in the URL. To allow for
.htaccess files to override settings, the
AllowOverride must be set to
ExecCGI is not necessary if you do not intend to run CGI (
.exe for example) programs. It is not required for PHP.
In the section starting with
<IfModule mime_module>, add or enable (uncomment) the following:
AddEncoding x-compress .Z AddEncoding x-gzip .gz .tgz … AddType application/font-woff .woff AddType application/font-sfnt .ttf … AddHandler cgi-script .cgi AddHandler cgi-script .exe AddHandler cgi-script .cmd AddHandler cgi-script .py AddHandler cgi-script .pl … AddType text/html .shtml AddOutputFilter INCLUDES .shtml
Not all the above setting are mandatory, specifically:
- If you are not using CGI, none of the
AddHandlerlines are necessary.
- The last two lines control server-side includes. This is not common anymore and can be safely omitted.
- For Python CGI scripts, you may want to expose the follow environment variables (at the top level of the config file, somewhere after the
SetEnv PYTHONUNBUFFERED 1
For nice (fancy) directory listings, optionally include the
autoindex module's configuration file. The
httpd-manual.conf includes are also optional.
The default Apache modules are fine. As a minimum, you should enable the following extra modules:
Manual & Status
manual in the
httpd-manual.conf file, can be changed to a less generic name; we like:
apache-manual. For consistency, the
server-status names (only in the
<Location…> tags), should be changed to
apache-status respectively, in the
<Directory…> setting must be made relocateable:
The result is
/apache-status URLs you can use.
httpd-autoindex.conf must also be made relocateable:
Now all references to
/icons will point to the correct directory.
The following Command Prompt batch files (
.cmd) create the appropriate environment variables used in the configuration files above, and start or stop the server.
Environment & PATH
rxapache-env.cmd batch file is called by the others to set the environment variables and
PATH. It can be run from an existing
cmd.exe instance. It will also change the prompt to show that the settings are in effect.
rxapache-env.cmd — Set Apache Environment
@echo off & setlocal enableextensions :: Set Apache & PHP environment (also PATH). Does not open a new Cmd :: Prompt instance. Once this batch file has been executed in an :: existing Command Prompt, simply running `httpd.exe` should start :: Apache correctly, assuming the required settings have been made in :: `php.ini` & `httpd.conf`. :: :: LICENCE: MIT — https://opensource.org/licenses/MIT endlocal :: Get this batch file's directory, and strip trailing backslash. All :: other paths are set relative to this variable. Apache wants forward :: slashes, and PHP configurations prefer backslashes on Windows. These :: variables are used in the `php.ini`, `extras\httpd-php5.conf` and :: `httpd.conf` files to provide portablility. set rxPHP_BASE=%~dp0 set rxPHP_BASE=%rxPHP_BASE:~0,-1% set rxApa_BASE=%rxPHP_BASE:\=/% :: Set the preferred Port for Apache to listen to. This can be changed. set rxApa_PORT=8182 :: Prefix some directories to the current `PATH` variable. set PATH=%rxPHP_BASE%\utl;%rxPHP_BASE%\utl\imagick;%PATH% set PATH=%rxPHP_BASE%\apa\bin;%rxPHP_BASE%\php;%rxPHP_BASE%\php\ext;%PATH% :: Change the prompt to show the Apache & PHP environment is active. set PROMPT=[rxApache+PHP7] $p$_$g$s :EXIT
rxapache-cmd.cmd batch file is suitable for “double-clicking” from a file manager, and will open a new Command Prompt console, with the appropriate environment variables and path set. The prompt is modified to reflect the configuration.
rxapache-cmd.cmd — New Command Prompt with Relocateable Apache Environment
@echo off & setlocal enableextensions :: Opens new Command Prompt window with Apache+PHP environment and PATH :: :: LICENCE: MIT — https://opensource.org/licenses/MIT setlocal enabledelayedexpansion :: The following batch file only sets the environment and PATH. call %~dp0rxapache-env.cmd :: Open a new command prompt window, with appropriate title :: (notice trailing space after `$p$_$g `). set PROMPT=[rxApache+PHP7] $p$_$g start "rxApache+PHP7 [%rxApa_PORT%]" /D %rxPHP_BASE% cmd.exe /K "httpd ^-v & php -v" goto :EXIT :EXIT endlocal
rxapache-start.cmd batch file is used to start Apache in a minimised console. It calls the above
rxapache-env.cmd batch file.
rxapache-start.cmd — Start Apache Server
@echo off & setlocal enableextensions :: Opens new minimised Command Prompt window with running Apache+PHP :: :: LICENCE: MIT — https://opensource.org/licenses/MIT setlocal enabledelayedexpansion :: The following batch file only sets the environment and PATH. call %~dp0rxapache-env.cmd :: Open a new command prompt window, with appropriate title. start "rxApache+PHP7 [%rxApa_PORT%]" /D %rxPHP_BASE% /MIN httpd -e info -w endlocal
rxapache-stop.cmd batch file is used to stop the Apache server. Apache saves the process ID of the executable in the
logs directory, under the name
httpd.pid. This can be passed to the standard Windows utility
rxapache-stop-cmd — Stop Apache Server
@echo off & setlocal enableextensions :: Stops running Apache from `httpd.pid` file in `logs` directory. :: :: LICENCE: MIT — https://opensource.org/licenses/MIT setlocal enabledelayedexpansion :: The following batch file only sets the environment and PATH. call %~dp0rxapache-env.cmd if not exist "%rxPHP_BASE%\apa\logs\httpd.pid" ( echo. echo Cannot find running Apache (no %rxPHP_BASE%\apa\logs\httpd.pid^) goto EXIT ) set /p rxApa_HTTPD=<%rxPHP_BASE%\apa\logs\httpd.pid taskkill /PID %rxApa_HTTPD% :EXIT endlocal
You could alternatively consider just placing
apachectl stop in this batch file. If it works for you, it certainly will be much simpler.
Finally! You now have a working Apache, as long as you followed the instructions without errors. You can now create HTML and PHP files in
rxapache\www, or subdirectories under it. To test your new Apache web server, you can place the following in a
phpinfo.php file under
www, and navigate to it in your browser (
http://localhost:8182/phpinfo.php if you used the same port settings above). It should show all PHP configuration settings and loaded module information.
phpinfo.php — Traditional PHP Test
If not, make sure the server is running, that you are using the correct port, and that the URL is correct. Otherwise, retrace your steps or investigate the log files.
WARNING — Do Not Use in Production
A final reminder that this is a development setup on a local network. Do not run this configuration on a public IP address. Apart from configuration, it is perfectly viable as a public server, provided you make the configuration more secure.
2019-06-18: Updated for Apache 2.4.39 & PHP 7.3.6 [brx].
2018-10-27: Updated for Apache 2.4.37 & PHP 7.2.11 [brx].
2018-05-22: Updated for Apache 2.4.33 & PHP 7.2.5 [brx].
2018-01-11: Edited. [jjc]
2018-01-09: Updated for Apache 2.4.29 & PHP 7.2.1 [brx].
2017-09-14: Created. [brx]