PHP and MacOS big Sur are not good friends
If we look for where PHP is installed in MacOS big Sur we find it in
/etc/ directory. If you don’t know where you have it you can run the following command.
ls -l $(which php)
If we list the files that we have in
/etc/ directory we have the following files.
ls -la | grep php -r--r--r-- 1 root wheel 145 1 ene 2020 php-NOTICE-PLANNED-REMOVAL.txt -rw-r--r-- 1 root wheel 5331 1 ene 2020 php-fpm.conf.default drwxr-xr-x 3 root wheel 96 1 ene 2020 php-fpm.d -r--r--r-- 1 root wheel 71553 28 mar 19:23 php.ini -r--r--r-- 1 root wheel 71554 28 mar 19:22 php.ini.default
We can notice a
php-NOTICE-PLANNED-REMOVAL.txt file warning us that PHP will be removed from newer versions of the operating system.
WARNING: PHP is not recommended. PHP is included in macOS for compatibility with legacy software. Future versions of macOS will not include PHP.
To know which version of PHP we have installed on our computer we can run the following command
Intl extension is not loaded
When trying to use the PHP version that comes within MacOs Big Sur we’ve got
Intl extension is not loaded error. If we look for the
php.ini file that we can find using the command
php --ini we can uncomment the line where the
intl extension is defined. This file was on the following path
; - Many DLL files are located in the extensions/ (PHP 4) or ext/ (PHP 5+) ; extension folders as well as the separate PECL DLL download (PHP 5+). ; Be sure to appropriately set the extension_dir directive. ; ;extension=bz2 ;extension=curl ;extension=fileinfo ;extension=gd2 ;extension=gettext ;extension=gmp extension=intl
After uncommenting the extension I got the same error as before
intl extension is not loaded, so I decided to install a separate version of PHP using Homebrew.
Installing PHP through Homebrew
With the following command we can list which versions of PHP are available to install using
brew list | grep php
Then we proceed to install version 7.2 of PHP
brew install email@example.com
Then using the link command of brew we can force the usage of the version that we have previously installed.
brew link --force firstname.lastname@example.org
Adding newly installed PHP version to the PATH
The next thing to do is to add in the
.zshrc file the path to the installation directory
sbin of new PHP installation.
echo 'export PATH="/email@example.com/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="/firstname.lastname@example.org/sbin:$PATH"' >> ~/.zshrc
Now that we have installed a new version of PHP using Homebrew we can execute again the following command to find where the
php.ini file is located. If the previous steps were successfull we will see that php is now inside
php --ini Configuration File (php.ini) Path: /opt/homebrew/etc/php/7.2 Loaded Configuration File: /opt/homebrew/etc/php/7.2/php.ini Scan for additional .ini files in: /opt/homebrew/etc/php/7.2/conf.d Additional .ini files parsed: /opt/homebrew/etc/php/7.2/conf.d/ext-opcache.ini
For CakePHP the first thing that I had to do was execute the following command to install
brew install composer
Updating captcha-com plugin
This point is really specific to my CakePHP application. The thing is that I’m using a captcha plugin. After
composer is installed we are able to update the captcha plugin to filter spambots from forms using the following command.
composer update captcha-com/cakephp-captcha --no-plugins
To run a CakePHP application locally we can use a built-in server going to the
bin/ folder and executing
bin/cake server command. If we have done the previous installation properly we will be able to run the previous command good and we will see the following output in the command line.
bin/cake server Welcome to CakePHP v3.6.7 Console --------------------------------------------------------------- App : src Path: /path-to-your-application/src/ DocumentRoot: /path-to-your-application/webroot Ini Path: --------------------------------------------------------------- built-in server is running in http://localhost:8765/ You can exit with `CTRL-C`
Creating a docker-compose.yml
My CakePHP application is using a relational database to store data. To avoid having to install MariaDB in our local computer we can use docker to run an instance of MariaDB. Here we can see the
docker-compose.yml file where we specify a MariaDB service and a adminer to be able to see the tables that are created and run some queries (similar to phpmyadmin)
version: '3.1' services: db: image: mariadb restart: always environment: MYSQL_ROOT_PASSWORD: example adminer: image: adminer restart: always ports: - 8080:8080
Connection refused to MariaDB
I was trying to connect to MariaDB from the CakePHP application but I was getting connection refused. I didn’t understand why, because MariaDB was starting successfully.
SQLSTATE[HY000]  Connection refused cakephp
Then I realized that was not defining the database ports in the yaml file of
version: '3.1' services: db: image: mariadb restart: always environment: MYSQL_ROOT_PASSWORD: example ports: - 3306:3306 adminer: image: adminer restart: always ports: - 8080:8080
In this post, we have seen how to:
- install new version of PHP
- run CakePHP application
- run MariaDB database using docker-compose
all this in a Macbook Air M1. Let me know if you found this useful.