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.