Pragmatism in the real world

Setting up PHP on OS X Leopard

In the vein of some of Lorna‘s articles, this is more a note for myself than anything else. Not everything is explained in detail as it assumes you know how to use a command line…

These are the steps I take to get the Apple supplied PHP working with GD, PDO_MySQL and Xdebug working on OS X 10.5.

/usr/local

Ensure that the following directories exist:

    sudo mkdir /usr/local/include
    sudo mkdir /usr/local/bin
    sudo mkdir /usr/local/lib
    sudo mkdir -p /usr/local/man/man1

Run Apache in 32 bit mode

This saves us having to compile our own MySQL as MySQL doesn’t offer a “fat” binary

  1. cd /System/Library/LaunchDaemons
  2. sudo vim org.apache.httpd.plist
  3. Immediately after the line containing <array> add:
        <string>arch</string>
        <string>-i386</string>
    
  4. Reboot

MySQL

  1. Download the 32bit version of MySQL 5.0.x for OS X 10.5 from mysql.com and install the pkg, the startup item and the pref pane.
  2. Add /usr/local/mysql/bin to the path: vim ~/.bash_profile and add:
        export PATH=~/bin:/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATH
        export EDITOR=vim
    

    at top of file. (Note that we set EDITOR whilst we are here so that svn is happy!)

  3. Set up MySQL root password:
        mysqladmin -u root password {new-password}
        mysqladmin -u root -p{new-password} -h localhost password {new-password}
        mysqladmin -u root -p reload
    

    Quit Terminal to flush the history to file. Restart Terminal and remove the history file: rm .bash_history so that {new-password} isn’t in plain text on the disk.

  4. Set the correct socket information for PHP. Ensure MySQL is running via the System Preferences panel then:
        sudo mkdir /var/mysql
        sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock
    

Rest of Apache setup

  1. cd /etc/apache2
  2. sudo vim httpd.conf
  3. Find #LoadModule php5_module libexec/apache2/libphp5.so and remove the leading #
  4. Find AllowOverride None within the <Directory "/Library/WebServer/Documents">section and change toAllowOverride All so that .htaccess files will work.
  5. Restart Apache: sudo apachectl restart
  6. Open Finder and navigate to /Library/WebServer/Documents/
  7. Create a new folder called “orig” and place all files currently in the Documents folder into it.
  8. Create a new file called info.php with <?php phpinfo(); inside it.
  9. Use Safari to navigate to http://localhost/info.php and check that the PHP version is displayed (5.2.6 at the time of writing).

php.ini

  1. cd /etc
  2. sudo cp php.ini.default php.ini
  3. sudo chmod ug+w php.ini
  4. sudo chgrp admin php.ini
  5. vim php.ini (assuming your user is a member of the admin group) and change settings appropriately. Change:
        error_reporting  =  E_ALL | E_STRICT
        extension_dir = "/usr/lib/php/extensions/no-debug-non-zts-20060613"
    

    You must set the extension dir correctly. (Commenting the line out also works…)

PHP extensions

The supplied PHP doesn’t come with pdo_mysql, pear or gd, so fix it.

  1. Download the correct version of PHP from http://www.php.net/releases/. (5.2.6 at time of writing)
  2. Create a directory called src in your home directory and unpack the PHP source. This creates /Users/rob/src/php-5.2.6/ in my case.

pdo_mysql

  1. cd ~/src/php-5.2.6/ext/pdo_mysql.
  2. phpize
  3. MACOSX_DEPLOYMENT_TARGET=10.5
    CFLAGS='-O3 -fno-common -arch i386'
    LDFLAGS='-O3 -arch i386'
    CXXFLAGS='-O3 -fno-common -arch i386'
    ./configure --prefix=/usr --with-pdo-mysql=/usr/local/mysql
  4. make
  5. sudo make install
  6. Edit /etc/php.ini and find the extension_dir line and add after it:
        extension=mysql.so
  7. Restart apache: sudo apachectl restart and check in the phpinfo that pdo_mysql is now loaded.

GD

Installing GD onto the stock PHP install that is supplied with OS X is slightly more complicated than you’d expect because you need to install libjpeg first.

Libjpeg

Libjpeg is available from the Independent JPEG Group.

  1. Download the source code: http://www.ijg.org/files/jpegsrc.v6b.tar.gz
  2. extract to ~/src
  3. cd ~/src/jpeg-6b
  4. cp /usr/share/libtool/config.* .
  5. ./configure --enable-shared
  6. sudo make install
  7. Libjpeg is now installed in /usr/local/lib

GD extension

  1. cd ~/src/php-5.2.6/ext/gd
  2. phpize
  3. MACOSX_DEPLOYMENT_TARGET=10.5
    CFLAGS='-O3 -fno-common -arch i386'
    LDFLAGS='-O3 -arch i386'
    CXXFLAGS='-O3 -fno-common -arch i386'
    ./configure --with-zlib-dir=/usr --with-jpeg-dir=/usr/local/lib --with-png-dir=/usr/X11R6 --with-freetype-dir=/usr/X11R6 --with-xpm-dir=/usr/X11R6
  4. make
  5. sudo make install
  6. Edit /etc/php.ini and find the extension_dir line and add after it:
        extension=gd.so
  7. Restart apache: sudo apachectl restart and check in the phpinfo that GD is now loaded.

PEAR

  1. cd ~/src/.
  2. curl http://pear.php.net/go-pear > go-pear.php
  3. Accept defaults, except for installation prefix (1) should be /usr/local
  4. Check that the include_path in /etc/php.ini is correct and includes the PEAR directory (/usr/local/PEAR).

Xdebug

Can’t have a PHP development environment without xdebug!

  1. sudo pecl install xdebug
  2. Edit /etc/php.ini and add
        zend_extension="/usr/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so"

    after the other extension lines.

  3. Restart apache: sudo apachectl restart and check in the phpinfo that xdebug is now loaded.

PHPUnit

  1. sudo pear channel-discover pear.phpunit.de
  2. sudo pear install phpunit/PHPUnit

It all works on this machines, anyway :)

Updatesee Marc Liyanage’s PHP5 packages

24 thoughts on “Setting up PHP on OS X Leopard

  1. Thanks for this Rob. Just for the record if anyone is looking for the "easy way" to get a zend framework dev environment working on osx leopard, I use xamp:-

    http://www.apachefriends.org/en/xampp-macosx.html

    it provides a "standalone" apache/mysql/php setup which includes pdo_mysql. click and run installer :)

    Things can get a bit thorny if you have already installed mysql seperately, as things can get a bit confused with paths, but otherwise it is a convenient way to get going

  2. Rob, does this process keep the ability for the OSX GUI to control the start/stop process of Apache? That was the one hangup I had when I did this myself (albeit with different install path settings).

  3. Brendon,

    Yes, I use System Preferences -> Sharing and tick/untick the Web Sharing box to start and stop Apache.

    Regards,

    Rob…

  4. Rob, thank you very much for posting this. It's very important for new developers to understand the innards of their PHP installation and how to build one properly, and it doesn't get explained well very often in a simple platform/version specific way. Because of all the shortcuts with good press, new PHP users (particularly Mac users) often become afraid of modifying their installations (and sometimes even applying patches and updates) because they think it's difficult. Providing details like these give them the confidence to tweak.

    I would like your permission to duplicate these instructions on the DallasPHP.org User Group web site (fully linked and credited, of course), as part of a library of detailed installation instructions (both traditional and shortcuts) for all members on various platforms. With your permission, the article would go online with our next site revision (planned for late this month).

  5. A few corrections for my install running OS X 10.5.6:

    pdo_mysql step #3, the configure command should be (the hyphens don't past well):
    ./configure –prefix=/usr -with-pdo-mysql=/usr/local/mysql

    pdo_mysql step #6:
    extension=pdo_mysql.so

    Apache repeatedly crashed. After tailing the apache error log, I noticed this line:
    dyld: Library not loaded: /usr/local/mysql/lib/mysql/libmysqlclient.15.dylib

    Sure enough the file didn't exist. However, I was able to find the file in the parent directory, /usr/local/mysql/lib

    Creating a symbolic link named mysql in /usr/local/mysql/lib fixed the problem:
    cd /usr/local/mysql/lib
    ln -s ../ mysql

    Thank you very much for this guide. The other guide online are much more intensive.

  6. Yikes, seems like your form data sanitizer escapes the hypens a bit too aggressively!

    I meant to say:
    ./configure (double-hyphen)prefix=/usr -with-pdo-mysql=/usr/local/mysql

  7. Thanks Makea,

    The double hyphens are correct when I edit it, so it must be WordPress' output layer that's the issue!

    Rob…

  8. Hey Rob,

    Nice how to, although I won't use it ;) What was the reason to install it manually instead of using xampp or mamp?

    I myself have been using xampp for a while and really like it. I already used it on my windows machine and after going mac last year I stayed with my beloved xampp ;)

  9. Gauke,

    No especial reason – they just don't "fit" for me.

    One problem I've found with MAMP/XAMPP/ZendServer is that they all include more than I actually want. e.g. Xammp and Mamp still ship PHP 4!! ZendServer has some sort of weird optimizer included an old version of Zend Framework!

    They all use weird places to store their htdocs – what's wrong with /Library/WebServer/Documents/ and ~/Sites?

    Rob…

  10. The last time I upgraded OS X I found that everything in /Library/WebServer/Documents/ had #$%%^ disappeared!
    So that's why I don't use the default location of anything and prefer to manually backup up stuff before an upgrade/move to new hardware instead of using their data/settings transfer process.

    Just to be fair….
    Back in Windows ME I booted my pc one morning and was met with the message "There is something wrong with your my documents folder. Windows is attempting to fix the problem."… or something along those lines. When I was finally able to log in I found my My Documents folder had reverted to the way it was after doing a fresh install. All MY files were gone. So I don't use that f#$^#$ location either.

  11. Rob, I see what you mean. You can just disable php4 though and use php5 (5.2.6 is shipped).

    The htdocs thing is annoying, but can be changed to :) I use ~/htdocs which works fine. You can change these things in xampp-dir/etc/httpd.conf

    And that's the end of my xampp promo tour :)

  12. I'm going to translate that material to russian. I hope it will be interesting 4 my visitors, and i hope you don't mind…

  13. Hi Rob,
    Thanks for this but it doesn't seem to be working for me on Mac 10.5.6 here's what's happening when I try and configure mysql_pdo I get this error:

    checking for mysql_config… /usr/local/mysql/bin/mysql_config
    checking for mysql_query in -lmysqlclient… no
    checking for mysql_query in -lmysqlclient… (cached) no
    configure: error: Try adding –with-zlib-dir=. Please check config.log for more information.

    Any help would be brilliant!

    K

  14. Hi Rob,
    MySQL is installed as per your instructions and is functioning normally.

    K

  15. Great article!

    After curl pear i had to run:
    php -q go-pear.php
    to start the installation.

  16. There is a note at:

    http://www.gigoblog.com/2008/10/08/install-gd-for-php-on-mac-os-x-105-leopard/

    NOTE: Check the output of the last command. If you get an error similar to this –”/usr/X11/lib/libpng.3.0.0.dylib: No such file or directory” — you should create a symbolic link with a name matching the file referred to in the error message. For example, the above error indicates that no libpng.3.0.0.dylib file exists. Simply create a link named libpng.3.0.0.dylib pointing to libpng.3.dylib:
    sudo ln -s /usr/X11/lib/libpng.3.dylib /usr/X11/lib/libpng.3.0.0.dylib

    Likewise, if your error refers to libpng12.0.##.#, you should create a symbolic link to libpng12.0.dylib.

    Then, recompile GD.

  17. Kieran,

    It looks like you're compiling 64-bit. Changing 'i386' as the arch to 'x86_64' cleared up that error for me.

Comments are closed.