Wednesday, July 11, 2007

How to install PHP 5.x on Windows Server 2003 with IIS 6

A detailed and hopefully helpful step-by-step guide, based on my experience.
Last updated 8:27 PM 11/29/2005
questions/props/corrections/etc... > Peter Guy (take out "TheGarbage" to email)
flames > /dev/null ;-)
http://www.peterguy.com/php/install_IIS6.html
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 YYMV
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.1 Download and unzip the latest version of PHP (5.0.3 at this time) to C:\PHP
Download the latest zipped distribution, not the Windows installer, of PHP from http://php.net.
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 "Collection of PECL modules for PHP 5.0.3" zip file and extract the contents of that file into C:\PHP\ext. It contains more extensions.
1.2 Rename/copy php.ini-recommended to php.ini
In your PHP directory, 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 most secure, hence, the recommended one; just 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://www.garykeith.com/browsers/downloads.asp to the extras directory under your PHP install directory (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).
2.3 Create a session state directory 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 directory somewhere on the server. I created C:\PHP\Sessions. This directory 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 directory (session.save_path=C:\PHP\Sessions).
2.4 Setup the PHP extensions.
If you want to install extensions (For information on extensions, visit http://ca3.php.net/manual/en/install.windows.extensions.php), then you need to go through a couple of steps.

You need to point PHP to the directory that holds the extension libraries, you need to rearrange the list of extensions so that they'll load w/out throwing errors, and you need to uncomment the desired extensions.
  • Point PHP to the correct directory:
    Set extension_dir in php.ini to "C:\PHP\ext"
  • Massage the list of extensions so that most of them will load w/out throwing errors.
    The easiest thing to do is replace all the "extension=" lines in php.ini with the following (be sure to scroll down so you get everything):
  • Uncomment the ones you want to use.
Some 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.0.3" archive, not all of the uncommented ones will work.
  • Most of the ones that won't load rely on other software being present, like oracle, informix and sybase.
  • php_mcrypt.dll requires the mcrypt library, the source code for which can be found here
  • php_yaz.dll is a bit of a mystery to me. As far as I know, I have all the right files in all the right places (it requires yaz.dll to be in the PATH) and it still doesn't load. Not much help found via google, either. If you know why it won't load, let me know and I'll update this guide.
  • 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.
  • As a side note, phpBB2 does not currently work with MySQL 4.1.x or PHP 5.x.
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 it keeps the installation in one place, making upgrading or uninstalling easier.
  • 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.
  • Either add "C:\PHP;" to the beginning or ";C:\PHP" to the end (sans quotes, not both).
  • Re-boot the server for it to 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. To make it easy on you, modify the following text so that "C:\\PHP" is the directory 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 (ie. \\ instead of just \)
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 directory
  • 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 directory 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 top 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 -
If you modified the server's PATH environment variable in 2.5b and haven't rebooted yet, reboot now.
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 directory 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 -v:servername /F -console" (sans quotes). Replace servername with the name or IP address of your server. The login dialog will show, and once you login, you will be able to see the console message dialogs. ***

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 directory (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.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 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
5.4 I'm getting 401 authorization required or 403 permission denied errors
A couple of things could be going on:

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/directory:
  • 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
5.5 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.6 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.
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 ).


Pinpoint customers who are looking for what you sell.

0 Comments: