Sviluppo software

Come creare script PHP a riga di comando

Un tipo di soluzione che i nostri clienti ci chiedono spesso è quella di script per l'importazione/esportazione dati da e verso un database.

Lo scenario tipico è quello di un database, magari di un gestionale proprietario closed source, dal quale vanno estratti dei dati oppure sul quale vanno aggiornati dei dati con quelli provenienti da una fonte esterna come per esempio un foglio excel o un altro database.

In questo caso l'esigenza è quella di avere una procedura da lanciare per effettuare questo aggiornamento sia da interfaccia web sia come lavoro schedulabile es.: una volta ogni notte.

Non tutti sanno che ilPHP, oltre ad essereil linguaggio web per eccellenza, può essere utilizzato anche per sviluppare script da lanciare a riga di comando.

Naturalmente se il nostro script viene lanciato dal web dovrà produrre un certo output (es. l'html di avanzamento), se invece viene lanciato da riga di comando ne dovrà produrre di diverso tipo (es. semplici righe di testo).

Il modo per capire in quale dei due casi ci troviamo è quello di interrogare la costante predefinitaPHP_SAPIla quale contiene la stessa stringa ritornata dalla funzionephp_sapi_name .

Se cioè la costantePHP_SAPIè uguale aclisignifica che il nostro codice sta girando da command line, in tutti gli altri casi significa che sta girando via web.

Quindi, per esempio, la nostra funzione di output avrà una struttura simile alla seguente:

function output($msg) { if (PHP_SAPI === 'cli') { echo '<div>' . htmlentities($msg) . '</div>'; } else { error_log($msg); }
}

Un altro accorgimento da tenere presente quando si vuole sviluppare un command line script è quello di impostare correttamente il path per le inclusioni dal momento che lo script può essere lanciato in modo assoluto o relativamente alla directory in cui è contenuto.

Il path cioè va impostato come segue nel file di avvio dello script e appena prima che vengano fatte le inclusioni di altri PHP:

define('BASE_PATH', dirname(__FILE__));
set_include_path(get_include_path() . PATH_SEPARATOR . BASE_PATH);
require_once 'lib/my_lib.php';
...

Se ci dimentichiamo di fare ciò non sarà possibile lanciare lo script con path assoluto come nell'esempio seguente:

root@myserver:~> php /var/www/vhosts/miosito.it/scripts/mioscript.php

Infine, trattandosi di uno script che potenzialmente può impiegare diverso tempo per completare il suo lavoro e consumare più memoria di quella che generalmente basta per una pagina web, è bene togliere il limite sul tempo di esecuzione e aumentare la memoria a disposizione:

<?php
/* lo script non ha limiti di tempo per completare la sua esecuzione */
set_time_limit(0);
/* lo script avrà a disposizione fino a 128 MiB */
ini_set('memory_limit', '128M');

Votazione pagina#

[Voti: 19 Media voto: 4.5/5]
Autore: Giovanni Chiodi
Senior software developer con più di 10 anni di esperienza nello sviluppo di soluzioni web based, enterprise, su misura. Dal 2011 socio fondatore di Garda Informatica Snc condivide questa avventura col fratello Lorenzo.

Promemoria sui Cookie e sulla Privacy

Leggi l'informativa
closeIcona closesearchIcona searchmore vertIcona more vertmenuIcona menulinkIcona link