info@fvg-informatica.it

Connettersi a Microsoft SQL Server con OSX e PHP

OSXPHPSQLSERVER
21/01/2020

Ho avuto la necessità di scrivere del codice per recuperare ed elaborare dei dati presenti su una tabella di un SQL Server di Microsoft da codice PHP girante tuttavia (almeno in produzione) su una macchina Linux.

Il mio ambiente di sviluppo è però configurato come segue:

  • Il codice PHP gira direttamente su un OSX Catalina usando PHP 7.3 e Apache preinstallati nel sistema (quindi senza orpelli intermedi tipo MAMP)
  • Ho una macchina Virtual Box con dentro un Windows 10 PRO su cui gira un’istanza di SQL Server Express

Lo scopo del codice PHP era quello di recuperare dei dati dall’SQL Express e utilizzarli per altre elaborazioni.

Di seguito i passi fatti per ottenere questo.

FASE 1: installazione dei driver Microsoft SQL Server su OSX

Scaricare il file .tar da questo link: https://github.com/microsoft/msphpsql/releases/download/v5.7.1-preview/Mac-7.3.tar

Espandete il file .tar, ne viene generata una cartella contenente alcuni file (ci sono le versioni PDO e standard, in formato Thread Safe e Non Thread Safe).

Controllate sul vostro phpinfo() se avete bisogno delle versioni TS o NTS. Lo determinata cercando la voce “thread safety“: se è configurata come “disabled” vi servono le NTS e viceversa.

Stabilito questo, i file .so e .signature relativi vanno copiati nella cartella delle estensioni di PHP. Anch’essa può essere determinata dal phpinfo(), alla voce “extension_dir”.

Fatto questo, bisogna istruire php a utilizzare l’estensione apposita appena copiata.

Bisogna quindi editare il file php.ini (il cui percorso ancora una volta va determinato attraverso il phpinfo alla voce “Loaded configuration file“) e aggiungere in un punto qualsiasi (ma per essere un minimo ordinati, io l’ho messo in coda a tutte le altre righe dello stesso tipo) la seguente riga:

extension="php_sqlsrv_73_nts.so"
extension="php_pdo_sqlsrv_73_nts.so"

La prima riga abiliterà l’estensione SQLSRV, mentre la seconda la variante di PDO che permette appunto l’interrogazione di SQL Server. Non sono correlate tra loro, le potete usare entrambe o solo una delle due come vi serve. Evidentemente poi, il codice dovrà far riferimento a quella effettivamente richiamata dalla configurazione.

A questo punto possiamo riavviare apache con

sudo apachectl restart

e la prima fase è fatta.

FASE 2: Installare il driver ODBC di Microsoft

Sembrava facile… invece no. I driver di cui sopra non sono in realtà veri driver, ossia non interrogano nativamente SQLServer, ma sono in realtà dei miserabili wrapper del driver ODBC (ebbene sì, facciamo un salto indietro nel passato di quasi un ventennio) che va anch’esso installato, altrimenti i succitati “driver” fanno assai poco (ossia niente).

A questo link: https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15#macos  potete trovare le istruzioni per l’installazione di tali driver. Il tutto avviene mediante l’utilizzo del famigerato package manager Homebrew. Se l’avete già installato, potete usare tranquillamente solo l’ultima riga dei comandi mostrati sul sito Microsoft.

Funziona ora?

Ancora no, siamo distanti dal risultato…. gosh Batman.

FASE 3: Abilitare SQLServer Express alle connesioni remote

Passiamo ora al lato Microsoft della cosa. Se abbiamo fatto un’installazione standard lasciando tutte le configurazioni sui valori di default non sarà possibile connettersi al nostro SQL Server, anche in presenza di tutti i requisiti lato PHP.

Questo perchè normalmente SQL Server Express non prevede di default di essere interrogato da connessioni remote.

I passi da fare sono:

  1. Creare un utente SQL Server e assegnarlo al database che vogliamo sia letto da remoto. Le connessioni remote non accettano in questa fattispecie la modalità Trusted
  2. Avviare e rendere automatico il servizio SQLBrowser (di default non è attivo)
  3. Dal management studio, nelle proprietà dell’istanza, assicurarsi che sia marcata la spunta “Permetti connessioni remote” nella scheda “Generale
  4. Aprire il Configuration Manager di SQL Server e abilitare il protocollo TCP/IP se non dovesse esserlo già
  5. Nelle proprietà del protocollo, nella sezione IPAll rimuovere il numero che trovate impostato nelle Dynamic Port (non mettere 0, lasciare proprio vuoto) e mettere il valore 1433 nella porta IP (è il valore predefinito per SQL Server, chiaramente se volete potete anche metterne altri)
  6. Aprire sul firewall 4 eccezioni: TCP 1433, UDP 1434 (serve per l’SQLBrowser) e software sqlserver.exe e sqlbrowser.exe (il primo si trova nella cartella binn dell’istanza, il secondo nella cartella 90/shared dell’istanza ma sotto i programmi x86)
  7. Riavviare il servizio SQL Server principale

FASE 4: Sistemare OpenSSL sul Mac….

Questa è la fase che mi ha fatto dannare di più, stavo per rinunciare, davvero. Il problema che si presentava era che al tentativo di connessione, il driver si lamentava della mancanza di OpenSSL e di assicurarsi che fossero installate le versioni 1.0 o 1.1. Niente di più strano, sul MAC difatti tutto regolare, openssl era perfettamente disponibile sul path.

Lo spunto è arrivato da questo articolo: https://github.com/microsoft/homebrew-mssql-release/issues/37

In particolar modo, l’ultimo post della discussione lamentava l’assenza di una particolare cartella. Vado a controllare pure io e… bingo! Ecco la rogna!

Homebrew ha creato un symlink alla cartella dove effettivamente ha installato l’openSSL come dipendenza del driver ODBC (vi risparmio un trattato su come funziona Homebrew, ma sostanzialmente lui si crea un suo ambiente di lavoro isolato dal resto del MAC dove si mette tutte le sue brave dipendenze), ma il nome della cartella sicuramente non era quello che il driver si aspettava.

La cartella infatti si chiama “OpenSSL@1.1“. Chiaramente ho intuito che il driver Microsoft mai più avrebbe accettato un nome simile. Controllato quindi con

ls -all

l’effettivo symlink, ne ho creato un altro alla stessa cartella vista col precedente comando ma chiamato semplicemente “openssl”, senza la decorazione della versione.

Ecco fatto, un pomeriggio di sudori freddi, ma spero sia utile anche a qualcuno la fuori.

  • Argomenti

  • Gabriele Pala, 2012-2019 P.IVA 01137470314 - C.F. PLAGRL77S16L424T info@fvg-informatica.it Strada delle Acacie, 5/A - Staranzano (GO) Privacy & Cookies