You are on page 1of 8

How to install PHP 5.

x on Windows Server 2003 with IIS 6

http://www.peterguy.com/php/install_IIS6.html
A detailed and hopefully helpful step-by-step guide, based on my experience.
Last updated 22:00 2008/02/08 GMT
questions/props/corrections/etc... > Peter Guy (take out "TheGarbage" to email)
flames > /dev/null ;-)
0. Notes before we start
0.1 This guide does not cover the initial setup of IIS, or general configuration
of Windows Server 2003.
It is assumed that you have already successfully installed and configured Windows
Server 2003 and setup IIS 6.
0.2 This guide is divided into 5 main steps:
1. install PHP (the easiest step, like having a baby is to raising a child)
2. Configure PHP (lots of php.ini editing)
3. Configure IIS (lots of pointing and clicking in IIS Manager)
4. Test it! (checking to make sure PHP is working on your server)
5. Troubleshooting (let's hope you don't need this section :-P)
0.3 YMMV
If you have already done basic configuration of IIS6 on Windows Server 2003, and
have an otherwise functional setup, then exactly following these steps should give
you a fully-functioning installation of PHP. However, since I cannot know the
combination of hardware and software you are running, or any of the environment
factors within which you work, I cannot gaurantee that these steps will work for
you. They have worked for me and others who have followed them.
0.4 No more Internet Guest Account permissions (almost)
I recently made some pretty radical changes to this guide by removing all
instructions that involved setting permissions for the Internet user on files and
folders. PHP is a server-side processing language so the Internet user (IUSR_ on
most W2k3 servers) does not need permission to access any of the files or folders
involved with PHP. I had been unthinkingly following the advice of others when I
configured my system that way, and it wasn't until I had experimentally removed
all those permissions and noticed that everything still worked that I started
thinking about it.

More recently, I added a special-case troubleshooting tip in the case of session


files not being created. I don't really like it because I don't understand why it
should work, but it was the solution for one person so it's in here until I can
find a logical solution. As always, feedback is welcome!
1. Install PHP
1.1 Download and unzip the latest version of PHP (5.2.5 at this time - this guide
was tested against 5.2.3) to C:\PHP
Download the latest zipped distribution, not the Windows installer, of PHP from
the "Windows Binaries" section of http://php.net/downloads.php.
Unzip it somewhere on your hard drive.
You can pick any drive, and any folder, but the recommendation is to put all the
PHP stuff in a folder just off of the root drive (avoid whitespace), like C:\PHP,
and this guide will follow that recommendation.
Download the PECL Win32 binaries zip file (should be just below the link to the
PHP zip file - DON'T download from the "Non-thread-safe" links) and extract the
contents of that archive into C:\PHP\ext. It contains more extensions.
Move php5servlet.dll and php5activescript.dll from C:\PHP\ext into C:\PHP.

NOTE on php5servlet.dll and php5activescript.dll:


Neither of these are strictly PHP extensions, so when you get to step 2.4, DO NOT
add them to the list of extensions in php.ini. If you do, you'll get an "Invalid
access to memory location" error on step 4.2.
php5servlet.dll is a JNI library that Tomcat uses to connect to PHP. We're using
IIS, not Tomcat, so we don't need to do anything with this file.
php5activescript.dll is a COM server that allows PHP code to be executed by an
ActiveScript engine, like Windows Script Host or ASP/ASP.net. As far as I can
tell, it's not commonly used. Dr. Evil has an old post that you can read for more
information if you're interested.
1.2 Rename/copy php.ini-recommended to php.ini
In your PHP folder, you'll find a couple of php.ini-* files. They are pre-
configured settings for a PHP install that you can use as an initial setup.
php.ini-recommended is the, well, recommended one; rename it to php.ini.
2. Configure PHP mainly editing php.ini
2.1 Uncomment cgi.force_redirect in php.ini and set equal to 0
*** This is a very important step, don't neglect it. ***
2.2 Install a browscap.ini file
You don't have to install a browscap file, it's just for those who want to use the
browser identification features of PHP, but it is recommended that you install it
because it's pretty widely used by scripts.
It's fairly straightforward: download php_browscap.ini from
http://browsers.garykeith.com/downloads.asp to the extras folder under your PHP
install folder (C:\PHP\extras\browscap.ini, for example), and change the browscap
variable in php.ini to be the full path to the file
(browscap=C:\PHP\extras\browscap.ini).
If you are going to use Mr. Keith's browscap file, be sure to abide by his Terms
of Use. He has licensced his work (and it is a lot of work) under a Creative
Commons Attribution Non-Commercial licensce, so if you plan to use it for
commercial use, be sure to contact him for permission first.
2.3 Create a session state folder and point the session.save_path php.ini variable
to it.
This is another optional but recommended step. PHP does not need sessions, but
it's something that will most likely be useful.
Create a session folder somewhere on the server. I created C:\PHP\Sessions. This
folder will hold many small files with session variable information for PHP. They
probably won't take up a whole lot of room, but if you need to keep your data off
your system drive, then you can put the folder anywhere else.
Now change the value of the session.save_path variable in php.ini to be the full
path to that folder (session.save_path=C:\PHP\Sessions).
2.4 Setup the PHP extensions.
PHP extensions are libraries that extend the functionality of PHP. For example,
the file php_gd2.dll provides dynamic image creation and manipulation functions
that go beyond what PHP itself does. For information on extensions, visit
http://ca3.php.net/manual/en/install.windows.extensions.php and
http://pecl.php.net.

The typical, basic PHP installation doesn't require you to do anything with
extensions: if you're unsure about extensions you can set extension_dir then
continue to step 2.5. Once you get PHP working, you can revisit extensions.
Point PHP to the correct folder:
Set extension_dir in php.ini to "C:\PHP\ext"
If you're feeling adventurous, now add any PECL extensions you want to php.ini,
un-comment extensions you want to use and rearrange the list of extensions so that
they'll load w/out throwing errors.
Massage the list of extensions so that most of them will load w/out throwing
errors.
The following is a list of the extensions that come with PHP combined with the
PECL extensions. I have commented out the ones that either did not work well on my
system or that require external software, like the extensions for different
databases. I've provided comments about some of them; for more information, refer
to the link above. If you want as many extensions available w/out having to use
dl() as possible, start with this list and refine it to match your system.
Remember, though, that the more extensions you have uncommented in php.ini, the
more resources PHP will need to run. I'm not running my server with all of these
extensions uncommented, this list just reflects what I found to work.

Final notes on using extensions:


I left uncommented all the ones that I got to work on my system with no additional
software.
If you have not downloaded and extracted the "Collection of PECL modules for PHP
5.2.3" archive, not all of the files in the list will exist on your system, so
many of the uncommented ones will not work.
Most of the ones that won't load rely on other software being present, like
oracle, informix and sybase.
Actually using php_openssl.dll requires you to follow the instructions in
C:\PHP\extras\openssl\README-SSL.txt.
See the BIG FAT NOTE in section 4.2
The MySQL connector has to be mysqli for MySQL 4.1.5 or later
(extension=php_mysqli.dll). If you copied in the list of extensions above, that
line will be in there. If you didn't, well, then it won't.
I could continue for a few more pages commenting on extensions. If you have some
particular question, a little google-grease goes a long way. If you're here
because of some google grease and don't see the answer to your question, shoot me
an e-mail. The worst thing that could happen is that I'll ignore you, and you
won't be any worse off than you are now. :-)
2.5 Do one of two things:
a. Copy all non-php dll files from C:\PHP to C:\Windows\System32 (or
somewhere else in the server's PATH)
- OR -
b. Add "C:\PHP" to the server's PATH environment variable
(b) is the preferred method (ok, it's my preferred method, but since I'm writing
this guide, it's the preferred method ;-) ) since not only does it keep the
installation in one place, making upgrading or uninstalling easier, but it also
allows you to more easily run PHP from the command line.
right-click on My Computer, choose Properties
flip to the Advanced tab
click the Environment Variables button
Double-click the Path variable in the list of System variables.
Add "C:\PHP;" (sans quotes) to the beginning. See step 5.9 for an explanation of
why it should go at the beginning of the PAH.
The new PATH will be available to any new command prompt, but not to existing
ones; bounce the server if you want to be sure that it will take effect.
2.6 Add to the registry HKEY_LOCAL_MACHINE\SOFTWARE\PHP\IniFilePath = C:\PHP
This is so that PHP can find its configuration file (php.ini). To make it easy on
you, modify the following text so that "C:\\PHP" is the folder in which you've
unzipped PHP, then copy the text and paste into a new text file (anywhere; the
Desktop is a good place to create it). Rename the file to inifilepath.reg, then
double-click on it, click "Yes" to the confirmation dialog, and the value will be
in place. You can then delete inifilepath.reg.
Make sure all backslashes are escaped in the .reg file (ie. \\ instead of just \)

NOTE: PHP also uses other settings to find its configuration file; one of the most
notable being the PHPRC environment variable. I prefer using the Registry because
by varying the key, you can configure different versions of PHP to run side-by-
side on the same machine. See http://us2.php.net/configuration for more
information.
3. Configure IIS
For these steps, open IIS Manager
(Start -> Control Panel -> Administrative Tools -> Internet Information
Services (IIS) Manager).
3.1 Add and allow the PHP ISAPI Extension to IIS Web Service Extensions:
C:\PHP\php5isapi.dll
When you open IIS Manager, it should connect to the local computer automatically.
Expand the local computer in the left pane
Click on "Web Service Extensions" in the left pane
In the right pane, click the blue underlined text, "Add a new Web service
extension..."
Enter "PHP ISAPI Extension" as the "Extension name"
Click the "Add..." button and browse to the php5isapi.dll file in your PHP install
folder
Check the "Set extension status to Allowed" checkbox and click "OK"
There are two ways to setup PHP for the web: ISAPI and CGI. ISAPI is typically
more efficient and secure. If you want to add the CGI extension, in addition to or
instead of the ISAPI, repeat the above, but enter "PHP CGI Extension" as the
"Extension name", and enter the full path to php-cgi.exe (it will be in your PHP
install folder along with php5isapi.dll).
Note that I have seen the CGI module misbehave several different ways and
recommend that you stick with the ISAPI module.
The following two steps are suggested to apply to the "Web Sites" root folder in
IIS Manager, but they can be applied to individual sites, instead. When applying
changes to "Web Sites", note that a dialog might come up asking if you want to
apply changes to a list of specific websites, too. The listed sites will be ones
that have overridden any default values, so be careful about applying changes to
them. Especially be careful of applying changes to the Microsoft SharePoint
Administration site (thus speaks painful experience).
3.2 Add new extension (.php)
Expand the local computer in the left pane
Right-click on "Web Sites" in the left pane, then click "Properties" in the menu
that pops up
Flip to the "Home Directory" tab
Click "Configuration"
Flip to the "Mappings" tab
Click "Add..."
Enter the full path to php5isapi.dll in the "Executable" textbox (Browse... to
find it more easily if you need to)
Enter ".php" in the "Extension" textbox
Select radial button "Limit to", enter "GET,POST,HEAD"
Click "OK" all the way out
This will apply to every website.
This sets up IIS to actually respond to requests for php files. Until now, IIS
hadn't know what to do with php files, you just told it to pass them through
php5isapi.dll.

Replace php5isapi.dll with php-cgi.exe if you chose the CGI extension in the
previous step.
Again noting that I don't recommend using the CGI module...
3.3 Turn on scripting permissions for your websites
Right-click on "Web Sites", goto Properties -> Home Directory.
Change the "Execute permissions" dropdown to "Scripts only".
3.4 Restart IIS or Reboot Server
Right-click the local computer in the left pane of IIS Manager, click on All Tasks
-> Restart IIS... -> OK
- OR -
reboot now.
4. Test your setup
4.1 Create a new file named test.php in one of the websites
Expand the "Web Sites" folder in the left pane of IIS Manager to see a list of
existing websites. Right-click on a website -> Properties -> Home Directory ->
Local Path will show you where the website root folder is.
Contents of test.php:

If you did not setup session or browscap support as outlines in steps 2.2 and 2.3,
then remove the sections that test them.
4.2 Point browser there to test.
*** BIG FAT NOTE: If you uncommented extensions, be sure to test this while logged
in to the server's console. If some of the extensions throw errors when loading,
an error dialog will pop up on the server console telling which one didn't work.
You have to be able to click "OK" to the dialog for the page to finish loading.
The dialog will pop up ONLY on the server's console; not even Terminal Services
will show it. Take note of the extension that didn't work, click "OK", and then
comment out the extension in php.ini until you can figure out how to get it to
work.
IMPORTANT TIP: if you can't get physical access to the server, you can connect to
the console via RDC. Click on Start, then Run... and enter the following in the
text box: "mstsc -console" (sans quotes) to start RDC in "console mode". Once you
login, you will be able to see the console message dialogs. If you're using the OS
X RDC client, hold down the Apple (Command) key when you click Connect. A dialog
will pop up asking if you want to connect to the console. Click Yes and you're on
your way. ***

Addendum to the BFN: Kristopher Hom was kind enough to point out to me that the
extension errors will be logged in System Event Log (Right-click on My Computer,
choose Manage..., System Tools, Event Viewer, System). The error he saw was,
"Application popup: Warning : PHP Startup: Unable to load dynamic library
'C:\PHP5\ext\php_mysql.dll' - The specified module could not be found." See step
5.3 for more information about mysql errors.

Another addendum to the BFN: An alternate way to test extension loading is to run
PHP from the command line (Start -> Run -> type "cmd" and hit Enter). If you
followed my suggestion in step 2.5, just type "php" and see if any errors appear.
Comment out the offending extension and repeat.

After loading test.php, you should see some ugly-looking information about your
browser spewed across the top of the page (if you setup browscap support),
followed by some nicely-formatted information about your PHP installation. Be sure
to scroll all the way down to the bottom to see that there were no errors. I
noticed with my installation that if I used CGI, the last several modules wouldn't
load and a bunch of error messages would print at the bottom of the test page.
Also go check your session folder (if you setup session support) for a 0-byte
file. That's the file to hold session data for the session you started by using
the command session_start().
5. Troubleshooting
5.1 It won't work!
If you setup IIS to use the ISAPI extension, then try this: right click on
WebSites > Properties > ISAPI Filters > Add
filtername = PHP
executable = php5isapi.dll

It seems that since we've added an ISAPI extension, we would need to add an ISAPI
Filter, but I never had to. I added one to see what happened, and couldn't tell if
it made any difference in performance, or even if it was being used.
5.2 I get an error about browscap.ini
Make sure that the value of the browscap variable in php.ini is the full path to
the browscap.ini file, not a relative path.
5.3 My browser just hangs when I try to open test.php
Did you uncomment any extensions in step 2.4? If an extension errors while
loading, PHP throws up a dialog box to the console of the server displaying the
name of the extension and the error. In order for PHP to continue processing
(e.g., in order for the page to continue loading), you have to click the "OK"
button on the dialog box.
I know, I know, pretty stoopid, but that's the way it is.
Go login to your server's console (not just Terminal Services, the dialog doesn't
show up there) and click "OK" to the 50 million dialogs that have popped up there
(one for each time you frustratedly restarted IIS and tried to load the page
again).
Then go re-comment out the troublesome extension(s) and try it again, this time
keeping an eye on the server console.
Make sure you have the extensions in the order specified in 2.4; that order has
been tested to load all the uncommented extensions w/out complaining.
Make sure you have downloaded and installed the "Collection of PECL modules for
PHP 5.0.3" as described in step 1.1
As mentioned in step 4.2, the extension errors will be logged in System Event Log
(Right-click on My Computer, choose Manage..., System Tools, Event Viewer,
System).
If you see any errors involving php_mysql.dll, be sure you have followed step 2.5
and either copied the non-PHP dlls from your PHP install folder to
%systemroot%\windows32, or have added your PHP install folder to the PATH and
either bounced the server or bounced IIS. The mysql errors typically come from
PHP's inability to find the supporting mysql library (libmysql.dll) when it loads
php_mysql.dll. Making sure libmysql.dll is in the PATH somewhere ensures that PHP
can find it.
5.4 I'm getting 404 errors
Even if you followed my recommendation in step 2.5 and added the PHP install path
to the server's PATH environment, try putting the dll files - php5ts.dll
especially - in the system32 folder. Several people have written in to say that's
what they had to do.
5.5 I'm getting 401 authorization required or 403 permission denied errors
A few things could be going on:

You may have spaces in you PHP install folder path. Try changing the PHP install
folder to be simply "C:\PHP" and see if that will get it working.

I've seen this happen when trying to use the CGI module (php-cgi.exe). Don't use
the CGI module. Use the ISAPI module.
I have seen several problems with the CGI module, and do not recommend that you
use it.

If your website is set up to run in a special Application Pool, our the user of
your default pool is a non-standard one, you may need to give a different user
permission to the PHP files and folders.
1. In IIS Admin, go to Application Pools
2. Right click on the pool your site is running under and click properties.
3. Go to the Identity tab and see what user is selected.
4. Give that user permissions on your php files/folder:
Click on the "Add" button
Enter in the rather large text box the user name
Click on "Check Names" to have it find the user for you
If it can't find the username, a "Name Not Found" dialog box will display
In that case, "Cancel" the "Name Not Found" dialog
click the "Advanced" button
This will open another dialog, where you'll click on the "Find Now" button
scroll through the list of "Search results" to find the user whose listed in the
Application Pool
Jef Sodeman found that if he allowed all verbs instead of just GET,HEAD,POST in
step 3.2, he was able to fix this error on his server. He pointed me to another
page describing this problem and solution: http://www.s9y.org/194.html.
5.6 I loaded the test page, everything looks good, BUT, there's no 0-byte file in
my sessions folder.
I heard of this happening once so far, and it was fixed by granting the server's
Internet Guest account permission to access the sessions folder. I don't see any
logical reason to have to grant the Internet Guest account permission to a folder
that PHP should be accessing as the Network Service or some other more trusted
user, but in this one case, that was the fix. Might work for you, too. In Window's
Explorer, right-click on the session folder, then click on "Properties" in the
list that pops up. This will open a dialog box with several tabs. One of the tabs
is named "Security". Click on it. This tab shows a list of users who have
permission to access the folder.
Click on the "Add" button
Enter in the rather large text box, "IUSR_<SERVERNAME>" (Where <SERVERNAME> is the
name of your server)
Click on "Check Names" to have it find the user for you
If it can't find the username, a "Name Not Found" dialog box will display
In that case, "Cancel" the "Name Not Found" dialog
click the "Advanced" button
This will open another dialog, where you'll click on the "Find Now" button
scroll through the list of "Search results" to find the Internet Guest account
(Probably displayed as IUSR_<SERVERNAME>)
If you can't find the Internet Guest account, then make sure IIS is installed and
enabled, which is a whole 'nother subject. :-)

Once you find the Internet Guest Account, "OK" your way out of all dialogs. Before
you "OK" your way out of the Properties dialog, check the "Allow" checkbox for
"Modify". The default permissions are Read and Execute, and Read. You want the
Internet guest account to be able to create and modify files in that folder, too.

If you can shed more light on this, please tell me. :-)
5.7 Do you have any pictures illustrating what I'm supposed to do?
Not yet, but you can check out http://www.visualwin.com/PHP/ for quite a few
pictures detailing the process.
That is actually the website I used the most when figuring this all out.
I know, this isn't really a troubleshooting tip, but I don't have anywhere else to
put it now.
5.8 I'm installing on a 64-bit box and all I get is a 500 error page!
This just in, from Ryan Hubbard:
On 64 bit IIS loads all extensions in 64 bit mode by default. Since php5isapi.dll
is 32 it freaks out but doesn�t give an error, just a 500 error on php pages. So
in order to get it to work on IIS 6 64-bit you need to enable 32-bit by running
the following at the command line.
cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET
W3SVC/AppPools/Enable32bitAppOnWin64 1
This enables both 64 and 32 bit extensions.
5.9 I've gone through all the steps, but my php pages aren't rendering correctly!
I see some of my php code in the page when I view it, and when I view the page
source, I see all of the PHP code, complete with the open and close script tags
(<? ... ?>).
The newer versions of PHP are more strict about opening script tags, and short
open tags (<?) are turned of by default in php.ini. (short_open_tag = off). You
can either modify your php page(s) to use the long open tags (<?php ... ?>) or
modify php.ini to allow the short tags (short_open_tag = on). I recommend
modifying your php pages if you can because the longer open tags are standard now
and if you leave them short you'll probably run into the same problem when you
move your code to another server.
5.10 None of the mySQL extensions are loading! No errors when I run PHP, but
phpinfo() does not list any of the mySQL extensions.
Adam Carter worked through this problem and came to the insightful conclusion that
the problem was caused by his mySQL install's bin folder being inculded in the
PATH before PHP's install folder. That caused mySQL's libmysql.dll file to be
loaded before PHP's libmysql.dll file when PHP went looking for a libmysql.dll
file upon loading its mySQL extension. Putting PHP's install folder in the PATH
prior to mySQL's bin folder enabled PHP to find its own libmysql.dll file. Hence
the instruction in step 2.5 to add PHP's install folder to the beginning of the
PATH. Alternately, you can put PHP's libmysql.dll in %systemroot%\system32. That
will have the same effect of putting it in the PATH before mySQL's bin folder.
5.11 It works for my default website, but all I see in other websites are blank
pages.
You may have set doc_root to some value in php.ini. If you did that, only those
php files that are actually in that folder (or subfolders thereof) will work.
Remove that value, bounce IIS and it should work now.
Many thanks to:
Andrew Champion (remove "YourPants" to e-mail) for providing the extension
ordering tip, kickstarting me toward HTML-formatted goodness, and helping me test
parts of this guide.
Cody of apparition.Designs for expanding on a couple of steps, providing the major
framework for this HTML-formatted guide and helping me test several steps.
Doug Dossett for providing the Application Pool user permission tip
Rob Smith (remove "TheRoadBlock" to e-mail) for providing the tip on checking the
loading of extensions via RDC.
All those out there who posted instructions, answered questions, and generally
helped me along the path to PHP knowledge (not to imply that I've gotten there yet
:-P ).

You might also like