Configuring Apache With Php7 Fpm For Mac
Basic SAPI status info (similar to Apache modstatus). First of all, make sure your php-fpm.conf file is set up to create a PID file when php-fpm starts.
Second part in a multi-part blog series for Mac developers
Part 2: macOS 10/15 Catalina Web Development Environment
In Part 1 of this 3-part series, we covered configuring Apache on macOS to work better with your local user account, as well as the installation process for installing multiple versions of PHP.
In this Part 2, we will cover installing MySQL, Virtual Hosts, APC caching, YAML, and Xdebug. After finishing this tutorial, be sure to check out how to enable SSL in Part 3 of the series.
[Updated 12/02/2019] Updated to reflect the latest release of PHP 7.4 and the removal of PHP 7.1 from Official tap
[Updated 10/08/2019] Updated to reflect the release of macOS 10.15 Catalina
[Updated 01/10/2019] Updated to add back PHP 5.6 and PHP 7.0 from and external deprecated keg
[Updated 12/12/2018] Updated to reflect the latest release of PHP 7.3 and the removal of PHP 7.0 from Brew.
This guide is intended for experienced web developers. If you are a beginner developer, you will be better served using MAMP or MAMP Pro.
Although not required for development of Grav, there are times you definitely need an installation of MySQL. In the original guide, we used the Oracle MySQL installation package. However, we now have switched to MariaDB which is a drop-in replacement for MySQL and is easily installed and updated with Brew. Detailed information on the HomeBrew installation process can be found on the mariadb.org site but the essentials are as follows:
Install MariaDB with Brew:
After a successful installation, you can start the server ane ensure it autostarts in the future with:
You should get some positive feedback on that action:
You must change MySQL server password and secure your installation. The simplest way to do this is to use the provided script:
Just answer the questions and fill them in as is appropriate for your environment. You can just press return when prompted for the current root password.
Download SequelPro and install it. (it's awesome and free!). You should be create a new connection via Standard
or Socket
option after you enter a user of root
and your newly created password.
If you need to stop the server, you can use the simple command:
A very handy development option is to have multiple virtual hosts set up for you various projects. This means that you can set up names such as grav.mydomain.com
which point to your Grav setup, or project-x.mydomain.com
for a project-specific URL.
Apache generally performs name-based matching, so you don't need to configure multiple IP addresses. Detailed information can be found on the apache.org site.
Apache already comes preconfigured to support this behavior but it is not enabled. First you will need to uncomment the following lines in your /usr/local/etc/httpd/httpd.conf
file:
and:
Then you can edit this referenced file and configure it to your needs:
This file has some instructions already but the important thing to remember is that these rules are matched in order. When you set up virtual hosts, you will lose your older document root, so you will need to add back support for that first as a virtual host.
Record part of screen on Mac. Go to the File Open Capture Device Screen, input Subscreen Width and Subscreen Height to specify the screen size you want to capture. Record screen on Windows computer with VLC. If you are using VLC on PC other than Mac, you can follow these steps to record your PC screen with VLC. Vlc video editor.
Don't forget to change your_user
for your actual username on your Mac. For example: DocumentRoot '/Users/bernard/Sites'
As you set up your .test
virtual hosts, you may receive a warning such as Warning: DocumentRoot [/Users/your_user/Sites/grav-admin] does not exist
when restarting Apache. This just lets you know that the source directory listed for your virtual hosts is not present on the drive. It's an issue that can be resolved by editing this file with the corrected DocumentRoot
.
We used to recommend using .dev
domain name, but since Chrome 63 forces all .dev
domains to use SSL, this guide has been updated to use .test
In the example virtualhost we setup above, we defined a ServerName
of grav-admin.test
. This by default will not resolve to your local machine, but it's often very useful to be able to setup various virtual hosts for development purposes. You can do this by manually adding entries to /etc/hosts
ever time, or you can install and configure Dnsmasq to automatically handle wildcard *.test
names and forward all of them to localhost (127.0.0.1
).
First we install it with brew:
Then we setup *.test
hosts:
Start it and ensure it auto-starts on reboot in the future:
And lastly, add it to the resolvers:
Now you can test it out by pinging some bogus .test
name:
Voila! we have successfully setup wildcard forwarding of all *.test
DNS names to localhost.
Caching in PHP is a big part of the performance equation. There are two types of caching typically available, and both have a big impact on speed and performance.
The first type of cache is called an opcode cache, and this is what takes your PHP script and compiles it for faster execution. This alone can typically result in a 3X speed increase!.
The second type of cache is a user cache, and this is a entry that PECL adds to the top of your php.ini
. So edit this file and remove the top line:
Once that line is removed, we can add a new file with a proper entry to the recently bulit apcu.so
library:
In this file paste the following:
Marble Blast Platinum was first released in Christmas 2007. Made by a number of leading community members, it became an instant success. It takes community-created skills and gameplay and utilises them in levels which are much more difficult than Marble Blast Gold. Marble Blast Platinum is an exciting new mod for Marble Blast Gold. After over a year of hard work, Marble Blast Platinum was released to massive acclaim. Featuring 120 amazingly creative level designs, Marble Blast Platinum will challenge even the most experienced marbler! Features:-Leaderboards - Play against your friends and the world to see who the best marbler is.
Restart Apache with the standard sudo apachectl -k restart
command to pick up your changes.
APCu for other PHP versions
For PHP 7.0 and above you can use the latest 5.x
release of APCu, so the process is the same for all. First let's switch to PHP 7.0 and install the APCu library:
Restart Apache with the standard sudo apachectl -k restart
command to pick up your changes.
The uninstall -r
enables PECL to only remove registration, it does not actually uninstall anything.
Again if you are OK with the ACPu defaults, you can leave things as-is, but you can choose to repeat the Optional APCu Configuration steps to create an APCu configuration file fore each PHP version.
For PHP 7.1, just repeat these steps but use 7.1 instead of 7.0:
For PHP 7.2:
For PHP 7.3:
For PHP 7.4:
With recent versions of Grav, we now make use of the native PECL YAML library that allow YAML processing to be done by highly efficient libYAML C library rather than by they Symfony PHP library. This can result in a 5X improvement in YAML processing times! Luckily this is a simple process to install for any PHP version:
Switch to PHP 5.6 mode, then run the following brew
commands to install libyaml
:
Then you can install YAML via PECL.
For PHP 5.6 we have to install the latest 1.3.x
version of YAML, as this is the last version to provide PHP 5.6 support:
Answer any question by simply pressing Return
to accept the default values
Restart Apache with the standard sudo apachectl -k restart
command to pick up your changes.
YAML for other PHP versions
For PHP 7.0 and above you can use the latest 2.x
release of YAML, so the process is the same for all. First let's switch to PHP 7.0 and install the YAML library:
Restart Apache with the standard sudo apachectl -k restart
command to pick up your changes.
The uninstall -r
enables PECL to only remove registration, it does not actually uninstall anything.
For PHP 7.1, just repeat these steps but use 7.1 instead of 7.0:
and for PHP 7.2:
and for PHP 7.3:
and again for PHP 7.4:
[Optional] YAML Configuration
If you are feeling adventurous, or you like to keep things uniform, you can follow the same procedure as APCu and remove the default extension-'yaml.so'
entry in each PHP's php.ini
and instead, create a conf.d/ext-yaml.ini
file:
One of the most important aspects of any kind of development is the ability to debug and fix your code. PHP comes with limited support to dump variables or log to a file, but for more complex situations you need something more powerful.
Xdebug provides is a debugging and profiling extension for PHP that provides an HTML-friendly output for the var_dump()
method that improves the readability of the default version. It also provides other useful dumping methods as well as displaying stack traces. One of the best features however, is the ability to remote debug your code. This means you can set breakpoints, and step through your PHP code inspecting as you go. Full documentation on Xdebug contains extensive information about all the functionality available. Let's switch back to PHP 5.6 and get started.
Then you can install Xdebug via PECL. For PHP 5.6 we have to install the latest 2.5.x
version of Xdebug, as this is the last version to provide PHP 5.6 support:
[Required] Xdebug Configuration
Like the other PECL-installed modules, this will create a simple entry in the php.ini
file, but you really need to configure Xdebug for it to be useful. So let's just go ahead and create our configuration file as we'll need it shortly anyway.
You will now need to remove the zend_extension='xdebug.so'
entry that PECL adds to the top of your php.ini
. So edit this file and remove the top line:
Once that line is removed, we can add a new file with a proper entry to the recently bulit xdebug.so
library:
In this file paste the following:
Restart Apache with the standard sudo apachectl -k restart
command to pick up your changes. You should check the http://localhost/info.php
to ensure that Xdebug information is displayed:
W00fz created a great tool for quickly enabling/disabling xdebug. Install this with brew:
Using it is simple, you can get the current state with:
And then turn it on or off with:
if Xdebug still shows up in php -v
the most likely cause is you didn't remove the zend_extension='xdebug.so'
entry at the top of php.ini
Xdebug for other PHP versions
For PHP 7.0 and above you can use the latest 2.7.x
release of Xdebug, so the process is the same for all. First let's switch to PHP 7.0 and install the Xdebug library:
Afer this just repeat the Required Xdebug Configuration steps, with /usr/local/etc/php/7.0/php.ini
as the PHP configuration file to remove the existing entry, and /usr/local/etc/php/7.0/conf.d/ext-xdebug.ini
for the file you will create with the new Xdebug configuration.
Restart Apache with the standard sudo apachectl -k restart
command to pick up your changes.
For PHP 7.1, just repeat these steps but use 7.1 instead of 7.0:
For PHP 7.2:
And for PHP 7.3:
And again for PHP 7.4:
Again, repeat the Required Xdebug Configuration steps with the same info you used for 7.2 except use 7.3 or 7.4 as required.
Here's a hot tip if you have done this before and want to speed-up the installation process. Simply install everything (apcu
, yaml
, xdebug
) in one shot, and then perform the other non-installation steps. This is faster but less intuitive for newbies:
PHP 5.6
PHP 7.0+
Repeat the following 2 steps for PHP 7.0 through PHP 7.4:
Once you have created your configruation (conf.d/ext-[lbirary].ini
) files, you can also easily copy the configuration files from one version of PHP to another.
You should now be all set with a Rockin' PHP development environment! To find out how to enable SSL on Apache, check out Part 3 in the series.
NOTE: The brew installation actually creates configuration files in /usr/local/etc/php/5.6/conf.d
, /usr/local/etc/php/7.0/conf.d
, /usr/local/etc/php/7.1/conf.d
, /usr/local/etc/php/7.2/conf.d
, /usr/local/etc/php/7.3/conf.d
, and /usr/local/etc/php/7.4/conf.d
respectively. If you want to uninstall a PHP extension, simply rename the .ini
file to .ini.bak
and restart apache. Alternatively, you can simply use brew to uninstall it, and reinstall it again when you need it.