Getting Started
You may want to recompile PHP on your Mac for a number reasons such as need a newer version, missing some features you need, testing, or whatever. Some of the most common reasons I found were people needing GD support because the version of PHP that comes with Mac OS X doesn't have it. In this I'll let you know what you need and how to get it done.
Apache
We'll need to recompile Apache even though it already comes with our system because for some unknown reason (to me) the compiled version of Apache that comes with our systems doesn't play too well when we compile PHP. Anyways without going into further details, read through this article real quick, Compiling Apache on Mac OS X, and come back here. Should only take ya like 5 minutes...
Time for PHP
Welcome back! Next, download the latest copy of the PHP source (5.2.5 as of this writting) compressed in tar.gz format from this URL, http://www.php.net/downloads.php. Once complete and you don't care about compiling PHP with any other options such as GD Support, MySQL, etc, and you just want the basic PHP then you can go back to your Terminal, cd into the directory where you downloaded PHP and run the following commands:
$ tar -xvzf php-5.2.5.tar.gz
$ cd php-5.2.5
$ ./configure --enable-layout=Darwin --enable-mods-shared=all --prefix=/usr --mandir=/usr/share/man --localstatedir=/var --infodir=/usr/share/info --disable-dependency-tracking --with-apxs2=/usr/sbin/apxs --with-kerberos=/usr --enable-cli
$ make
$ sudo make install
Like Apache, you would need your root password to install PHP with the last command. Once everything is complete you can go into Sharing from your System Preferences and restart Web Sharing and you will notice you are running the version of PHP that you downloaded!
Note: Whenever editing your apache configuration you will need to restart it in order to see the new changes.
If you do want to build PHP with additional features then proceed below and follow the setup of instructions for each and either feature. For starters we can unpack PHP.
$ tar -xvzf php-5.2.5.tar.gz
Later when I say to build PHP with whatever ./configure command I just mean running the command from your Terminal while being in the directory where you unpacked PHP.
GD Support?
I won't leave you hanging wondering how to install GD since I brought it up earlier and its quite easy so lets do it! If you want jpeg support with GD then you need to install libjpeg. You can download the latest stable source code from http://www.ijg.org/files/. Once you get it go back to your terminal and run the following commands:
$ tar -zxvf jpegsrc.v6b.tar.gz
$ cd jpeg-6b
$ cp /usr/share/libtool/config.sub .
$ cp /usr/share/libtool/config.guess .
$ env CFLAGS="-O -g -arch i386 -arch ppc" LDFLAGS="-arch i386 -arch ppc" ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --mandir=/usr/share/man --enable-shared --enable-static
$ make
$ sudo make install
$ sudo ranlib /usr/local/lib/libjpeg.a
That's that for libjpeg. Now if you also want png support we need to grab libpng from http://www.libpng.org/pub/png/libpng.html. When done, lets go back into our terminal and run the following commands:
$ tar -xvzf libpng-1.2.22.tar.gz
$ cd libpng-1.2.22
$ env CFLAGS="-O -g -arch i386 -arch ppc" LDFLAGS="-arch i386 -arch ppc" ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --mandir=/usr/share/man --disable-dependency-tracking
$ make
$ sudo make install
$ sudo ranlib /usr/local/lib/libpng.a
Alright all set! Now we just have to go back to PHP and configure it with the options for GD. Below is the command:
$ ./configure --enable-layout=Darwin --enable-mods-shared=all --prefix=/usr --mandir=/usr/share/man --localstatedir=/var --infodir=/usr/share/info --disable-dependency-tracking --with-apxs2=/usr/sbin/apxs --with-kerberos=/usr --enable-cli --with-jpeg-dir=/usr/local/bin --with-png-dir=/usr/local/bin --with-gd
All I added were the last 3 options. If you didn't add libjpeg or libpng then you can remove them from the options respectively. After done configuring just remember to make and make install and your done!
MySQL
What PHP build would be complete without MySQL support? This step is super easy, simply go to http://www.mysql.com and download the latest stable version (5.0.45 as of this writing) for your platform and install it. The installation will place the files in a mysql directory in /usr/local. You can see which directory it was installed in by running the following command:
$ ls -lah /usr/local | grep mysql
Now that you've got the MySQL installation directory its helpful to create an alias directory without the version number at the end that will point to your current working version. This is also helpful so you can install multiple versions of software and when you want to switch between them you could simply change where the alias points to. If your MySQL directory was installed to /usr/local/mysql-5.0.45-osx10.4-i686 then this would be your command to create an alias:
$ sudo ln -s /usr/local/mysql-5.0.45-osx10.4-i686 /usr/local/mysql
Also, if you would like to access MySQL from the command line without having to type the full path to the binaries each them then I'd recommend appending your MySQL path to your $PATH environment variable:
$ echo "export PATH=\$PATH:/usr/local/mysql/bin" >> ~/.profile
The above line appends MySQL to your $PATH environment variable and from here on every Terminal window you open will find its way to MySQL.
Continuing on with PHP, depending which MySQL support you want (MySQL, MySQLi, PDO, or all) then just pick out whatever you want and don't want from the line below:
--with-mysql-sock=/var/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-mysql=/usr/local/mysql --with-pdo-mysql=/usr/local/mysql
Conclusion
There are many more options you can add to the configure script to set certain features. To view all the options available you can run ./configure --help and that will spit out just about all the ways you can configure your build. Below is the configure command I used:
$ ./configure --enable-layout=Darwin --enable-mods-shared=all --prefix=/usr --mandir=/usr/share/man --localstatedir=/var --infodir=/usr/share/info --disable-dependency-tracking --with-apxs2=/usr/sbin/apxs --with-ldap=/usr --with-kerberos=/usr --enable-cli --with-zlib-dir=/usr --enable-trans-sid --with-xml --enable-exif --enable-ftp --enable-mbstring --enable-mbregex --enable-dbx --enable-sockets --with-iodbc=/usr --with-curl=/usr --with-config-file-path=/etc --sysconfdir=/private/etc --with-mysql-sock=/var/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-mysql=/usr/local/mysql --with-xmlrpc --with-xsl=/usr --with-pdo-mysql=/usr/local/mysql --enable-soap --with-pear --with-jpeg-dir=/usr/local/bin
--with-png-dir=/usr/local/bin --with-gd
Its also important to note that when doing system updates, not just little security updates or other application updates, but big critical system updates that brings you from something like 10.5.0 to 10.5.1 might rid your Apache and/or PHP setup. Nothing bad will happen, they will just overwrite your setup with their update. If you happened to keep your build then you can just go back and run sudo make install or you can just download the latest versions of the software we used here and redo the steps.