Prima del rilascio di macOS Monterey, PHP era preinstallato nel sistema operativo. Adesso, invece, PHP è stato rimosso ma il web server Apache è stato mantenuto per ragioni di compatibilità con lo sharing delle risorse di macOS.

La soluzione più semplice ed efficace per risolvere questo problema è utilizzare un sistema integrato come MAMP o AMPPS.

Una soluzione alternativa è quella basata sull'installazione di PHP tramite Homebrew. Tuttavia Homebrew dipende interamente da XCode per poter compilare ed installare PHP sul nostro sistema. Poiché XCode si rivela essere estremamente impegnativo in termini di risorse impiegate (l'installazione di base supera i 10 Gb), tale soluzione appare decisamente sovradimensionata per lo scopo che si vuole ottenere.

Un'altra soluzione, più scalabile e molto usata in termini di sviluppo nel Cloud, consiste nell'utilizzare un'immagine Docker di PHP. Dopo aver scaricato ed installato Docker Desktop, creiamo la seguente struttura di directory (a titolo di esempio):

/php
    - app

All'interno della directory php creiamo il file Dockerfile:

FROM php:8.1-rc-zts-alpine3.15
COPY . /usr/src/app
WORKDIR /usr/src/app
CMD [ "php", "-S", "php:8000" ]

La prima istruzione effettua il download e la creazione dell'immagine di PHP scelta. La seconda copia tutti i file e le directory dalla nostra directory ad una directory creata dal medesimo comando all'interno del container Docker. La terza istruzione imposta la directory appena creata come directory di lavoro. L'ultima istruzione, infine, esegue il server web incorporato di PHP sulla porta 8000 nella directory di lavoro. Il nome dell'host, php, è una variabile simbolica che fa riferimento al nome del container che useremo nel file docker-compose.yml che creeremo subito dopo:

version: "3.8"

services:

  php:
    build: .
    ports:
      - 8000:8000
    volumes:
      - ./app:/usr/src/app

A questo punto la struttura dei nostri file sarà la seguente:

/php
    - app
docker-compose.yml
Dockerfile  

All'interno della directory app creiamo il file index.php:

<?php phpinfo(); ?>

La funzione phpinfo() ci mostrerà una schermata con tutte le informazioni sulla nostra installazione di PHP (8.1).

Digitiamo dal Terminale nella directory php:

docker-compose up -d

Quindi visitiamo l'indirizzo http://localhost:8000 per visualizzare la schermata che ci confermerà il fatto che la versione di PHP del container Docker sta funzionando correttamente.

Se vogliamo utilizzare anche MySQL con Docker, dobbiamo modificare il nostro file docker-compose.yml come segue:

version: "3.8"

services:

  php:
    build: .
    ports:
      - 8000:8000
    volumes:
      - ./app:/usr/src/app
    depends_on: mysql
  
  mysql:
    image: mysql
    restart: always
    environment:
        MYSQL_ROOT_PASSWORD: MYSQL_ROOT_PASSWORD
        MYSQL_DATABASE: MYSQL_DATABASE
        MYSQL_USER: MYSQL_USER
        MYSQL_PASSWORD: MYSQL_PASSWORD
      ports:
          - 3306:3306        

La sezione environment del servizio mysql definisce le variabili d'ambiente che potremo usare anche nel nostro codice PHP. Ad esempio, se nel nostro docker-compose.yml scrivessimo i seguenti valori:

environment:
        MYSQL_ROOT_PASSWORD: test
        MYSQL_DATABASE: php_test
        MYSQL_USER: php_test
        MYSQL_PASSWORD: php_test_1234

Nel nostro codice PHP avremmo:

$database_name = 'php_test';
$database_user = 'php_test';
$database_password = 'php_test_1234';
$database_host = 'mysql';

L'host è mysql in questo caso perché questo è il nome del nostro servizio nel file docker-compose.yml. Infatti, essendo PHP e MySQL all'interno della stessa rete creata da Docker, la risoluzione DNS interna avviene semplicemente attraverso il nome del container.

Per attivare la nuova configurazione, dobbiamo per prima cosa rimuovere le immagini create in precedenza:

docker-compose down

Quindi digiteremo:

docker-compose build --no-cache

E infine:

docker-compose up -d

Per maggiori informazioni sull'immagine ufficiale MySQL si può consultare la documentazione su Docker Hub.