I was quite delighted to find out recently (via AJ) that Apache and PHP was available by default on my Mac. Before I got my Mac, I thought that was the case, and then I couldn’t find it and supposed there was none and got living-e’s MAMP instead.
I quickly got annoyed, because just logging off and shutting down my computer after a bit of dev tweaking meant typing in my account password. Sometimes I ended up forgetting I had it running, and Logout would stop because MAMP needed something from me. It was quickly set up, but after a few weeks of getting it (and ending up too lazy to go through the whole startup-type-password-work-shut-down-type-password cycle…go figure) I was ready to brave whatever UNIX source compiling wizardly people go through to get their machines ready for web development.
And nope, it wasn’t! I’d initially envisioned needing to compile the source and all that scary stuff, but apparently (like I said) Apache and PHP was already built in, and MySQL had a Mac OS X binary. Yay! I spent an afternoon tweaking to my heart’s content, after finding gems like these:
- Enabling PHP in Mac OS X 10.5
- Working with PHP 5 in Mac OS X 10.5 (Leopard) (also has information on setting up PEAR)
- Apache, MySQL, and PHP on Leopard (Mac OS 10.5)
Here’s what I did.
Set up Apache’s configuration file.
Open up Terminal, and type
sudo vim /private/etc/apache2/httpd.conf. You’ll need to enter your password, since you’re running as root. Line 114 (or thereabouts) will be where Apache loads the PHP5 module. Remove the hash/pound sign (#) (type
ito enter insert mode, and
escapeto get out of insert mode when you’re done) at the start of the line.
Optional: You can keep going and customize your
httpd.conffile to your liking. For me, I did the following:
Sitesfolder (two lines to change).
index.phpin DirectoryIndex to automatically load
index.phpfiles ahead of
index.htmlwhen requesting a directory.
Save the file (type
:wqwhen in command mode).
Setup PHP’s php.ini
Leopard doesn’t have a
php.iniby default, but the default one is still there, named
php.ini.default. Make a copy of this by moving to the
/private/etcfolder and copying that file:
$ cd /private/etc $ sudo cp php.ini.default php.ini
You might need to enter your password again. After that, you can edit
sudo vim php.ini…this is read-only, so remember to override vim’s warning when you’re saving and use
:wq!) to change error reporting and other things you like to have PHP do when you’re developing.
Note: The mysql and mysqli extensions are not enabled by default. You probably want to change that. (See lines 625 and 626.)
Now it’s time to test your web server and PHP together. Fire up System Preferences, and under the Internet & Network section, click on Sharing. Check the check box next to Web Sharing. Once it’s on, you can go to the URL there, or try the ever-trusty
http://localhost, to test if your settings are as they are.
Of course, if you feel like you want to do it the geeky way, you can always run
sudo apachectl start.
Now let’s get MySQL up and running.
MySQL isn’t included, so we’ll have to install that. Download a binary package and install MySQL, the StartupItem, and the preference pane. I haven’t actually gotten the preference pane to actually stop and start the MySQL daemon, but I figure it will work eventually, and it’s always nice to see it in System Preferences.
Once they’re installed, hit
sudo /usr/local/mysql/support-files/mysql.server startto start the daemon. You can try doing this via the preference pane (and let me know if it works). The preference pane also lets you toggle if you want the daemon to start automatically when you log in (which is the whole point of this exercise…but again, for some reason it doesn’t like me ;( sob).
MySQL socket problems in PHP
As of the time of this writing, just installing MySQL and enabling the appropriate extensions in
php.iniisn’t enough. PHP won’t be able to find the MySQL socket and won’t be able to talk to your database server. This post has a good explanation why, but to summarize the fix for this:
- Create a
$ cd /etc $ sudo vim my.cnf
- Type the following in the file:
[client] socket = /var/mysql/mysql.sock [mysqld] socket = /var/mysql/mysql.sock
- Save the file and exit to the shell (
:wqin command mode).
- Type the following commands for the sock file’s directory:
$ sudo mkdir /var/mysql $ sudo chown _mysql /var/mysql
PHP should be able to connect to MySQL now. A word of caution:
One drawback to this is that if you have installed the MySQL GUI tools, they will look for the mysql.sock file at the old location. You can enter the new socket in the connection dialog under More Options, there is a box labeled “connect using socket.” Just enter /var/mysql/mysql.sock.
Another solution is to change the php.ini file to expect the socket in a different location. I’m going with the my.cnf option because I expect the MySQL will have a Leopard version out in a few days that changes the default location.
- from Professional PHP
- Create a
That’s all there was! You should be up and running in no time. I ended up taking a bit longer because of the following (which might help you):
- My files all had wrong permissions. They were all just readable and writable by myself (the owner) and hence my web server couldn’t read them. A quick recursive
chmod 755 *helped, although of course I’m wondering if there’s an easier way to get this all done. (Let me know?)
- I installed CocoaMySQL for my database management needs. It looks pretty spiffy. I’ll give it a whirl and if it isn’t enough, I might try out Navicat, although I’d rather not need to pay for a management tool.
Edited to add: I found out that the MySQL preference pane really wasn’t working, and that MySQL is aware of this issue. I found a patch for it via Natron Designs; and yes, now, it works!