
Avendo la necessità di eseguire PHP via command line (per poter eseguire degli script php) su una macchina batocera, ci si accorge che il problema è più complesso del previsto: batocera nel suo repository di pacchetti non ha la possibilità di installare PHP, e anche facendo delle ricerche non ho trovato nulla a riguardo. Illustro qui 2 soluzioni possibili al problema.
Soluzione preferita: entware
Dopo aver usato per un paio di anni la soluzione tramite flatpak (vedi sotto), e considerando che è onerosa (su disco tiene più di 10Gb!) e macchinosa (bisogna entrare nell'ambiente flatpak) ho cercato una soluzione più snella, e l'ho trovata: Entware.
https://github.com/Entware/Entware/wiki
Entware è un repository software, usato principalmente per i sistemi embedded, ma che in generale permette di avere un repository di pacchetti installabili, con un proprio layer di compatibilità. E' semplice da installare e ampia notevolmente le possibilità di batocera.
Vediamo i passi di installazione (consiglio comunque di guardare la guida per eventuali aggiornamenti).
Per prima cosa eseguiamo:
wget -O - https://bin.entware.net/x64-k3.2/installer/generic.sh | /bin/sh
Il sistema base si installa in /opt, che su batocera è libero. Dal momento che /opt è nel file system immodificabile, se vogliamo che entware resista al boot abbiamo 2 possibilità.
Utilizzare il solito comando batocera-save-overlay per persistere il tutto. Se scegliamo questa strada dobbiamo però ricordarci di usare quel comando ogni volta che faremo una modifica (ad esempio tra poco andremo ad installare i pacchetti di php). Inoltre in caso di upgrade di batocera perdiamo tutto.
Io ho preferito rilocare tutto in /userdata/opt, inserendo un link simbolico da /opt, che funziona bene. Anche il link simbolico deve essere persisitito con batocera-save-overlay, ma poi non dovrete fare più nulla. Se volete scegliere questa strada:
mv /opt /userdata/ ln -s /userdata/opt /opt batocera-save-overlay
L'installazione prevede anche che all'avvio della macchina venga eseguito "/opt/etc/init.d/rc.unslung start". In batocera ci sono vari modi per avviare cose al boot, dal momento che io uso già /boot/postshare.sh ho inserito il tutto li. Se volete anche voi seguire questa strada, per prima cosa rendete scrivibile /boot con il comando mount -o remount,rw /boot, quindi editate (o create) /boot/postshare.sh inserendo un contenuto del tipo:
#!/bin/bash if [ "$1" == "start" ] then /opt/etc/init.d/rc.unslung start save; fi
Altra cosa da fare è aggiungere nella variabile PATH le bin di entware, in modo da poterne eseguire velocemente i comandi da shell. Per questo editate (o create) /userdata/system/.bash_profile e aggiungete:
export PATH=$PATH:/userdata/bin:/opt/bin:/opt/sbin alias php=/opt/bin/php8-cli
(L'alias di "php" l'ho aggiunto per portarmi avanti, in modo da poter usare via command line direttamente "php").
Entware è installato, possiamo riavviare la macchina per essere sicuri che tutto sia a posto.
A questo punto per installare php è sufficiente eseguire:
opkg update
opkg install php8-cliOvviamente vedete voi se avete bisogno di installare estensioni aggiuntive, su entware ci sono tutte. Io ad esempio ho aggiunto php8-mod-mbstring php8-mod-simplexml.
Tramite l'alias impostato sopra, ora se da riga di comando eseguite "php" si avvierà la shell di php.
Da notare che con questa soluzione potete installare un sacco di comandi linux. Con "opkg list" potete vederli. Fate riferimento alla guida di entware per altre informazioni.
Alternativa: flatpak
In passato ero riuscito tramite tramite flatpak (supportato nativamente da batocera) e l'ambiente org.freedesktop.Sdk.
Come scritto sopra, è un metodo un po' pachidermico e più macchinoso di entware, ma comunque gestibile. Per prima cosa installiamo i flatpak che servono (la prima riga serve per aggiungere il repository standard):
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo flatpak install flatpak install org.freedesktop.Sdk flatpak install org.freedesktop.Sdk.Extension.php83
A questo punto eseguendo questo comando possiamo entrare nell'ambiente SDK:
flatpak run org.freedesktop.Sdk
Ci accorgeremo subito però di alcuni problemi:
La guida dell'estensione php per freedesktop.sdk ci spiega che l'eseguibile si trova in "/usr/lib/sdk/php83/bin", e che è possibile eseguire il comando ". /usr/lib/sdk/php83/enable.sh" per modificare l'ambiente in modo da avere il comando "php" eseguibile direttamente.
Come fare per velocizzare questa operazione e quindi creare un ambiente che, con un solo comando, sia già pronto per l'uso?
Creiamo un file eseguibile, da mettere in una cartella che poi sarà condivisa con l'ambiente SDK, che faccia da "inizializzatore" (tipo un "bash_profile"). Io ad esempio ho creato "/userdata/bin/php-sandbox-init-env" con questo contenuto:
. /usr/lib/sdk/php83/enable.sh alias gamelist.php='php /userdata/bin/gamelist.php' echo "Initialized"
La prima riga abilita l'ambiente PHP, la seconda è un esempio per fare in modo che un mio script PHP (nella stessa cartella "bin") sia eseguibile semplicemente richiamandolo (come detto sopra, la riga "#!/bin/php" che c'è all'inizio degli script non funzionerà). La terza riga è solo per essere sicuri che l'inizializzatore abbia funzionato (quando entriamo scriverà "Initialized").
A questo punto possiamo avviare l'ambiente inizializzato con il comando sottostante (che io ho messo in uno script "php-sandbox.sh" cosi' faccio prima a richiamarlo):
flatpak run --filesystem=/userdata/bin/ --filesystem=/userdata/roms/ --command=bash org.freedesktop.Sdk --init-file /userdata/bin/php-sandbox-init-env
Questo comando avvia l'sdk, specificando 2 folder che sono condivisi con l'ambiente esterno: "/userdata/bin/" (che contiene gli script) e "/userdata/roms/" (questo è solo un esempio per permettere all'ambiente sdk/php di accedere alle rom batocera, ma potete mettere quello che vi serve).
"--command=bash" permette di eseguire la shell all'avvio, mentre "--init-file /userdata/bin/php-sandbox-init-env" dice di eseguire come prima cosa per inizializzare l'ambiente lo script preparato prima.
Tutto fatto, a questo punto avviando dalla shell batocera "php-sandbox.sh" si entra in una shell con il comando "php" disponibile, con gli script che mi servono e con la possibilità di operare nelle roms.
A me non interessa, e quindi non sono andato oltre, ma immagino che eseguendo l'sdk dandogli i permessi di accedere alla rete, e avviando nell'ambiente sdk un server web (penso ce ne siano a disposizione, anche minimali) poi si possa avere un ambiente web php... chissà!
Riferimenti:
https://wiki.batocera.org/systems:flatpak#using_the_terminal_ssh
https://docs.flatpak.org/en/latest/sandbox-permissions-reference.html
https://github.com/flathub/org.freedesktop.Sdk.Extension.php83


Aggiungi un commento