PsySH: La shell interattiva per il debug delle applicazioni PHP


Introduzione a PsySH

PsySH è una shell interattiva pensata per facilitare
il debug e l’esplorazione di codice PHP. Si tratta di uno strumento potente e versatile, ideale per sviluppatori che
vogliono testare snippet di codice in un ambiente sicuro e interattivo. È particolarmente utile in fase di sviluppo,
consentendo di eseguire comandi e ottenere risultati immediati.

Caratteristiche principali

  • Esecuzione interattiva di codice PHP.
  • Supporto per il caricamento di file e classi personalizzate.
  • Funzioni di autocompletamento per variabili, metodi e classi.
  • Integrazione con debug_backtrace e stack traces per una migliore diagnostica degli errori.
  • Possibilità di esplorare il contesto delle applicazioni in runtime.

Installazione

PsySH è distribuito tramite Composer.

Puo essere installato localmente tra i vendor di un progetto php, ad esempio con il seguente comando:

                
composer require psy/psysh --dev
                
            

Oppure puo essere installato globalmente a livello di sistema con il comando:

                
composer global require psy/psysh
                
            

Una volta installato, PsySH può essere avviato eseguendo il comando:

                
vendor/bin/psysh
                
            

PsySH apre una shell interattiva, da utilizzare un po come la console degli strumenti di sviluppo del browser.

                
Psy Shell v0.12.4 (PHP 8.3.14 — cli) by Justin Hileman
?> 
                
            

Esempio pratico

PsySH puo esere usata come la shell interattiva di php che si avvia con il comando php -a. Supponiamo di voler testare una funzione PHP per calcolare la somma di numeri. Apri PsySH e inserisci il seguente codice:

                
function somma($a, $b) {
    return $a + $b;
}
somma(5, 7); // Output atteso: 12
                
            

Dopo aver premuto Invio, PsySH restituirà l’output della funzione, confermando il corretto funzionamento del codice.
Tuttavia notiamo che PsySH genera un output ad ogni istruzione inserita, infatti PsySH è un Read-Eval-Print Loop (o REPL).

Debug di un’applicazione

PsySH può essere utilizzato anche per esaminare variabili e oggetti durante l’esecuzione di un’applicazione. Per fare ciò, dopo avere importato il file autoload dei vendor, aggiungere il seguente comando nel codice dove inserire il “breackpoint” ed interrompere l’esecuzione per il debug:

                
eval(\Psy\sh());
                
            

Quando l’applicazione raggiunge questa riga, entrerà automaticamente nella shell interattiva, permettendoti di esplorare il contesto in tempo reale.

Il comando help ti darà la lista di comandi di PsySH e le loro spiegazioni:

>>> help

– help Show a list of commands. Type `help [foo]` for information about [foo]. Aliases: ?

– ls List local, instance or class variables, methods and constants. Aliases: list, dir

– dump Dump an object or primitive.

– doc Read the documentation for an object, class, constant, method or property. Aliases: rtfm, man

– show Show the code for an object, class, constant, method or property.

– wtf Show the backtrace of the most recent exception. Aliases: last-exception, wtf?

– trace Show the current call stack.

– buffer Show (or clear) the contents of the code input buffer. Aliases: buf

– clear Clear the Psy Shell screen.

– history Show the Psy Shell history.

– exit End the current session and return to caller. Aliases: quit, q

Il comando ls in PsySH

Il comando ls in PsySH elenca tutti gli elementi disponibili nel contesto corrente, inclusi:

  • Variabili: Mostra tutte le variabili attualmente definite.
  • Classi: Elenca tutte le classi dichiarate, comprese quelle caricate tramite autoload.
  • Metodi: Elenca i metodi di una classe o di un oggetto specificato.
  • Costanti: Elenca tutte le costanti disponibili.

Utilizzo di base

Per utilizzare il comando ls, basta digitare il seguente comando nella shell PsySH:

                
ls
                
            

Questo restituirà un elenco completo delle variabili, classi e altri elementi nel contesto corrente.

Esempi pratici

Elenco delle variabili nel contesto corrente

Supponiamo di avere le seguenti variabili definite:

                
$nome = "Mario";
$eta = 30;
                
            

Digitando ls, vedrai un output simile al seguente:

                
Variables:
  $nome
  $eta
                
            

Esplorare i metodi di una classe o oggetto

Se hai un oggetto, come ad esempio una nuova istanza della classe DateTime, puoi utilizzare
ls per elencare i suoi metodi:

                
$data = new DateTime();
ls $data
                
            

Questo mostrerà tutti i metodi disponibili nella classe DateTime, ad esempio:

                
Methods:
  __construct
  format
  getTimestamp
  setDate
  ... (altri metodi)
                
            

Esplorare classi definite

Se vuoi esplorare tutte le classi attualmente dichiarate nel contesto, usa:

                
ls --classes
                
            

Questo mostrerà un elenco di tutte le classi disponibili, comprese le classi PHP standard e quelle definite dall’utente.

Opzioni aggiuntive

Il comando ls supporta diverse opzioni per filtrare i risultati:

  • --vars: Mostra solo le variabili.
  • --constants: Mostra solo le costanti.
  • --methods: Mostra solo i metodi di una classe o di un oggetto.
  • --classes: Mostra solo le classi definite.

Il comando show in PsySH

Il comando show consente di visualizzare informazioni dettagliate su:

  • Variabili: Mostra il tipo e il valore di una variabile.
  • Classi: Visualizza la definizione di una classe, inclusi metodi e proprietà.
  • Funzioni: Mostra la definizione e i dettagli di una funzione.
  • Costanti: Elenca e descrive le costanti disponibili.

Utilizzo di base

Per utilizzare il comando show, basta specificare il nome dell’elemento da ispezionare. Ad esempio:

                
show $variabile
                
            

Oppure:

                
show NomeClasse
                
            

Esempi pratici

Ispezionare una variabile

Supponiamo di avere la seguente variabile:

                
$nome = "PsySH";
                
            

Utilizzando il comando show:

                
show $nome
                
            

L’output sarà simile al seguente:

                
Name: $nome
Type: string
Value: "PsySH"
                
            

Ispezionare una classe

Supponiamo di avere la seguente classe:

                
class Esempio {
    public $proprieta = "valore";
    public function metodo() {
        return "ciao";
    }
}
                
            

Per visualizzarne la definizione, utilizza:

                
show Esempio
                
            

L’output includerà i dettagli delle proprietà e dei metodi della classe:

                
Class: Esempio
Properties:
  public $proprieta
Methods:
  public metodo()
                
            

Ispezionare una funzione

Puoi anche ispezionare una funzione PHP definita nel contesto attuale o una funzione nativa:

                
show strlen
                
            

L’output mostrerà la firma e una descrizione della funzione:

                
Function: strlen(string $string): int
Description: Get the length of a string
                
            

Riferimenti

Configurazione di LEMP Stack con Docker e Certificati SSL


Questo tutorial ti guida passo dopo passo nella configurazione di uno stack LEMP con Docker e Docker Compose, integrando la protezione SSL tramite Let’s Encrypt.

Prerequisiti

  • Un server Ubuntu con un utente non root abilitato a sudo e un firewall attivo.
  • Docker e Docker Compose installati.
  • Un dominio registrato con i record DNS configurati (A e www).

Fase 1: Configurazione del Server Web

Crea la directory di configurazione del progetto e il file nginx.conf:


mkdir -p webserver_www/nginx-conf
nano webserver_www/nginx-conf/nginx.conf

            

Inserisci il seguente blocco di configurazione:


server {
    listen 80;
    server_name your_domain www.your_domain;
    root /var/www/html;

    location ~ /.well-known/acme-challenge {
        allow all;
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php_fpm:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
        deny all;
    }
}

            

Nota: Ricordati di sostituire your_domain con il tuo dominio effettivo.

Fase 2: Definizione delle Variabili Ambientali

Crea un file .env per definire variabili sensibili:


nano webserver_www/.env

            

Inserisci i seguenti valori:


MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_USER=your_php_fpm_user
MYSQL_PASSWORD=your_php_fpm_password
MYSQL_DATABASE=your_database

            

Fase 3: Configurazione di Docker Compose

Crea il file docker-compose.yml per definire i servizi:


version: '3'
services:
  db:
    image: mysql:8.0
    env_file: .env
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - app-network

  php_fpm:
    image: php:8.2-fpm
    volumes:
      - php_fpm:/var/www/html
    networks:
      - app-network

  nginx:
    image: nginx:1.21-alpine
    ports:
      - "80:80"
    volumes:
      - php_fpm:/var/www/html
      - ./nginx-conf:/etc/nginx/conf.d
    networks:
      - app-network

  certbot:
    image: certbot/certbot
    volumes:
      - certbot-etc:/etc/letsencrypt
      - php_fpm:/var/www/html
    command: certonly --webroot --webroot-path=/var/www/html --email you@example.com --agree-tos --no-eff-email --staging -d your_domain -d www.your_domain

volumes:
  dbdata:
  php_fpm:
  certbot-etc:

networks:
  app-network:
    driver: bridge

            

Fase 4: Configurazione Certificati SSL

Esegui il comando per ottenere i certificati:


docker-compose up -d certbot

            

Verifica la presenza dei certificati con:


docker-compose exec nginx ls -la /etc/letsencrypt/live

            

Fase 5: Modifica della Configurazione Nginx

Modifica nginx.conf per abilitare HTTPS:


server {
    listen 443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
}

            

Fase 6: Rinnovo Automatico dei Certificati

Crea uno script di rinnovo:


#!/bin/bash
docker-compose run certbot renew && docker-compose kill -s SIGHUP nginx

            

Configura un cron job:


crontab -e
# Aggiungi la seguente riga
0 12 * * * /path/to/ssl_renew.sh >> /var/log/cron.log 2>&1