Installing PHP 5.3 with mysqlnd on Mac OS X with MacPorts

Projects and Code716 words4 minutes to read

Historically, I’ve always preferred to use Apple’s built-in Apache 2.2 and PHP 5.x that comes with Leopard. However, after trying to compile PHP 5.3 from scratch and connect it with Apache, I decided to just use the MacPorts installer instead. That did mean giving up control of a finely-tuned Apache installation, but in the end, I think I’ve ended up with a better localhost system.


Also, make sure that your MacPorts install is completely up-to-date with:

sudo port -d selfupdate


Now, I’ve never used MacPorts to install PHP or Apache before, so I’m starting with a clean slate. If you’ve already installed PHP or Apache with MacPorts, your steps may be different. As always, your mileage may vary. For me, I develop several open-source projects, so I need things that others may not. Adjust these steps as necessary.

  1. Using “Web Sharing” in your Sharing Preferences should be turned off. Currently this points to the (old) Apple Apache installation, although we’ll change that later.

  2. From Terminal, install PHP 5.3 + Apache, and some other stuff. This will likely take quite a while. I’m installing SQLite, MySQL, and PostgreSQL because of my work on CacheCore, so you may or may not need those. mysqlnd is the new PHP Native Driver for MySQL and is supposed to be better, so we’ll use that. We also need to enable non-default settings for cURL.

    sudo port install curl +ssl+ipv6+ares+idn+gss+openldap+sftp_scp \
    php5 +apache2+fastcgi+pear

    You can see all available options by running port variants php5.

  3. The new Apache configuration file is stored at /opt/local/apache2/conf/httpd.conf while the old one was at /etc/apache2/conf/httpd.conf. Take a moment to copy over any settings you’ll want to maintain into the new Apache installation.

  4. You’ll also want to include your extra settings. Toward the bottom of your httpd.conf file, add the following line:

    # All settings
    Include conf/extra/*.conf
  5. If you don’t have an SSL certificate, rename your SSL configuration:

    cd /opt/local/apache2
    sudo mv conf/extra/httpd-ssl.conf conf/extra/httpd-ssl.conf-disabled
  6. You’ll also want to enable PHP in Apache:

    sudo mv conf/extras-conf/mod_php.conf conf/extra/mod_php.conf
  7. The new PHP configuration file is stored at /opt/local/etc/php5/php.ini while the old one was at /etc/php.ini. Take a moment to copy over any settings you’ll want to maintain into the new PHP installation.

  8. You’ll need to tell Apache to enable PHP support. Open your new httpd.conf file, find where the extensions are loaded (with LoadModule), and add this to the end of the line:

    LoadModule php5_module modules/
  9. Restart Apache. If you were using apachectl before, it still points to the old Apache, so we’ll want to point specifically to the new one.

    sudo /opt/local/apache2/bin/apachectl restart

At this point, PHP 5.3 with Apache 2.2 and the new mysqlnd extension are all installed.

Extra stuff

  1. I generally prefer to have lots more stuff installed locally so that I can worry more about developing and less about installing. Because of this, I also install a few other things.

    sudo port install memcached \
        php5-apc \
        php5-curl \
        php5-gd \
        php5-http \
        php5-iconv \
        php5-imagick \
        php5-mbstring \
        php5-memcache \
        php5-mysql \
        php5-openssl \
        php5-postgresql \
        php5-sockets \
        php5-sqlite \
        php5-tidy \
        php5-xdebug \
  2. Restart Apache with:

    sudo /opt/local/apache2/bin/apachectl restart

Replacing older versions

Now, we want to continue using our command-line PHP scripts and the “Web Sharing” checkbox in the Sharing Preference Pane, so let’s make sure that those are all pointing to the new locations instead. We’ll be backing up and redirecting php, apachectl, and httpd.

  1. Open up your Sharing Preference Pane, and disable Web Sharing

  2. Run the following command on the Terminal:

    sudo mv /usr/bin/php /usr/bin/php.bak && sudo ln -s /opt/local/bin/php /usr/bin/php; \
    sudo mv /usr/sbin/apachectl /usr/sbin/apachectl.bak && sudo ln -s /opt/local/apache2/bin/apachectl /usr/sbin/apachectl; \
    sudo mv /usr/sbin/httpd /usr/sbin/httpd.bak && sudo ln -s /opt/local/apache2/bin/httpd /usr/sbin/httpd;
  3. Re-enable Web Sharing in the preference pane.


Lastly, I like to set up some shortcuts so that I can access all of my important localhost stuff from one place. I’ll create a new directory called www-config and then I’ll place symlinks into it for quick access to Apache and PHP configuration files.

sudo mkdir /www-config && \
cd /www-config && \
sudo ln -s /opt/local/apache2/bin/apachectl /www-config/apachectl && \
sudo ln -s /opt/local/apache2/conf/ /www-config/httpd-conf && \
sudo ln -s /opt/local/apache2/logs/ /www-config/logs && \
sudo ln -s /opt/local/var/db/php5/ /www-config/php-ini && \
sudo ln -s /opt/local/etc/php5/php.ini /www-config/php.ini

Ryan Parman

Ryan Parman is an experienced software engineer, open source evangelist, and passionate user advocate currently living in Seattle. He is the creator of and , and worked on DevOps and Security at . He is now bringing learning into the digital age as an Engineering Lead and Site Reliability Engineer at . Ryan's aptly-named blog, , is where he writes about ideas longer than .