Archivi tag: PHP

Migrare WordPress su nuovo dominio

Wordpress logo

Migrare un sito in WordPress da un dominio ad un altro potrebbe apparire un’operazione semplice ma in realtà le cose sono complesse. WordPress memorizza in diversi punti nel database alcuni parametri associati al dominio stesso o al percorso locale in cui WP stesso è installato. Tutti questi riferimenti risultano spesso annidati in array serializzati e memorizzati in campi di database. Un’eventuale modifica “a mano” via phpMyAdmin quindi risulterebbe abbastanza scomoda e assai lunga.

Allora ho creato uno script (parser_WP.php) in PHP che modifica ogni riferimento presente nel database in modo da agevolare le operazioni.

Ricapitolando quindi, per migrare un sito WordPress su un dominio diverso, dovete:

  1. Copiare tutti i file e cartelle da un server ad un altro (via FTP, a partire dalla root)
  2. Creare un dump del database
  3. Creare un database vuoto sul nuovo dominio
  4. Importare il dump precedentemente creato
  5. Copiare lo script di cui sopra nella root del nuovo dominio e lanciarlo via browser (dopo aver configurato i dati di accesso al database)

Le modifiche da apportare al database sono di 2 tipi: sul dominio e sul path.
Aprendo lo script noterete che nelle prime righe vi sono 2 variabili da impostare:

$lookFor = "domain-1.com";
$replace = "domain-2.com";

Sostituite domain-1 con il nome del vecchio dominio e domain-2 col nome del nuovo dominio.

WordPress però, come dicevamo, memorizza anche il path assoluto in cui è installato. Dovrete quindi lanciare nuovamente lo script sostituendo le 2 variabili con i path: vecchio e nuovo. Ad esempio:

$lookFor = "/home/myOLDuser/";
$replace = "/home/myNEWuser";

Lanciate nuovamente il file. In questo secondo caso il risultato restituito (lo script restituisce il numero di valori modificati) sarà molto basso rispetto al primo (anche se questo varia a seconda dei plugin, widget, ecc. installati).

Fatto, ricordatevi di rimuovere lo script php dalla root!!

PHP: Nascondere errori “DEPRECATED” via .htaccess

logo-PHP

Sto installando un’applicazione in ambiente di prova, giusto per guardamela un po’ e per approfondire un po’ le funzionalità implementate. Peccato che l’applicativo in oggetto su PHP 5.3 genera una marea di errori di “DEPRECATED” dovuti alla funzione eregi ormai dichiarata obsoleta dal PHP 5.3 in avanti. Per velocizzare il tutto ho pensato di non visualizzare tali errori.

Le alternative sono diverse ma preferisco sempre aggiungere l’impostazione tramite file .htaccess in modo da “non sporcare” il codice sorgente. Ho quindi aggiunto un file .htaccess nella root del progetto aggiungendo questa riga:

php_value error_reporting 22527

Il livello 22527 corrisponde a  “E_ALL & ~E_DEPRECATED“, appunto tutti gli errori tranne i deprecated. Nel file .htaccess non è possibile inserire il testo, si può solo configurare tramite bitmask corrispondente calcolata sulla base delle costanti predefinite per error_reporting.

Se non siete ferrati sull’argomento bitwise operators o non avete voglia e tempo potete rapidamente calcolarvelo tramite queste 2 righe in PHP, la prima imposta il valore che desiderate (utilizzando le costanti e gli operatori bitwise) la seconda stampa a video la bitmask corrispondente (un numero intero) che poi potrete utilizzare per configurare il tutto tramite file .htaccess:

error_reporting( E_ALL & ~E_DEPRECATED );
echo error_reporting(); die;

 

Zend_Validate, traduzione messaggi di errore

Come Adapter per Zend_Translate prediligo gettext, con Poedit si lavora molto bene!

In fase di deploy di un’applicazione, dopo aver tradotto i miei file, mi sono accorto che mancavano le traduzioni dei messaggi di errore di Zend_Validate (Alpha, EmailAddress, StringLength, ecc.). Dopo un po’ di ricerche ho scoperto che esiste una directory resources/languages (solo nella versione full di ZF) in cui risiedono tutti i file con le traduzioni dei suddetti messaggi di errore.

Il file però presenta le traduzioni in un array e quindi ho dovuto generare un testo da integrare nel file .po
Per fare ciò ho utilizzato queste semplici 2 righe di codice:

foreach($myAr AS $en => $it)
{
echo ‘msgid “‘ . $en . “\”\n”;
echo ‘msgstr “‘ . $it . “\”\n”;
echo “\n”;
}

Dove ovviamente $myAr è l’array che trovate nei vari file di traduzioni (i file si chiamano Zend_Validate.php).
Ho creato così un nuovo Catalogo di Poedit, poi l’ho aperto con un Editor di testo e ho incollato dentro il risultato visualizzato nel browser dalla suddetta procedura. Aprendolo con Poedit e salvando il gioco è fatto!

Potreste incontrare problemi (a seconda del SO e dell’Editor che usate) sulla codifica dei file. A me, ad esempio, Poedit è andato in errore perchè il file, una volta salvato con l’Editor, aveva perso la codifica UTF-8. Per fortuna l’editor del Mac (TextEdit) permette di scegliere la codifica in fase di salvataggio. Ripristinato l’UTF-8 tutto è filato liscio.

Esistono diversi metodi comunque per convertire la codifica dei file di testo (UTF-8).

Zend_Form e problema col quote (magic_quotes_gpc)

E’ da ieri che sbatto la testa su questo problema!
Sul mio server di sviluppo tutto ok, nessun problema. In ambiente di produzione invece riscontro un problema col quoting dei campi passati dalle form create con Zend_Form. Appena aggiungo le virgolette (“) la procedura di salvataggio dati me li quota (\”) e non capivo il perchè!

Il problema sta nell’impostazione magic_quotes_gpc del PHP.
Sul server in produzione infatti questo è settato a On. Ecco la differenza tra l’ambiente di sviluppo (su cui è Off, infatti monta PHP 5.3.x) e quello in produzione (PHP 5.2.x). A questo punto le alternative per risolvere il problema sono diverse.

Una soluzione è disabilitare tale impostazione via file .htaccess inserendo in questo file la riga:

php_flag magic_quotes_gpc Off

In alternativa, ove questo non sia possibile, consiglio l’utilizzo dell’ottimo Filter_StripSlashes creato e descritto da Phil Brown.

Caratteri in cinese, russo e arabo nel codice PHP con Eclipse

Che oggi la codifica Unicode (UTF8) risolva una marea di problemi sull’utilizzo delle diverse lingue è risaputo. Se impostate un sito con questa codifica è tutto più semplice.

Oggi però avevo necessità di scrivere alcuni caratteri direttamente nel codice tramite l’editor Eclipse. Scriverlo lo scriveva ma quando provavo a salvare mi dava questo errore:

Per risolvere basta cambiare la codifica del file in uso.
Dal menù Edit -> Set Encoding…
Si apre questa finestra (vedi sotto), selezionate Other e poi UTF-8.

Il “problema” è risolto!

Conversione da Binary 32 bit a Float IEEE754 in PHP

bit byte

Non è stato semplice saltarci fuori, per una serie di motivi. La conversione di un numero binario (o esadecimale) ad un numero in virgola mobile non l’avevo mai affrontato perchè in PHP, solitamente, si lavora con numeri “definitivi” (integer, float, ecc). Tale conversione può dipendere da diversi fattori.

Per prima cosa ho dovuto studiarmi un pò lo standard IEEE 754, in particolare i numeri a precisione singola (32 bit). Su Wikipedia è spiegato molto bene il metodo con cui effettuare la trasformazione (esponente, mantissa, ecc). Devo ammettere che prima di trovare il codice “giusto” mi sono imbattuto in diverse librerie che non davano l’esito atteso. Alla fine ho trovato una semplice funzione sul sito PHP nella pagina dedicata al Floating point numbers. Leggendo un po’ di commenti ho trovato l’ottimo intervento di info at forrest79 dot net.

Riporto qui di seguito la funzione completa:

function binToFloat($bin) {
if(strlen($bin) > 32) {
return false;
} else if(strlen($bin) < 32) {
$bin = str_repeat('0', (32 - strlen($bin))) . $bin;
}
$sign = 1;
if(intval($bin[0]) == 1) {
$sign = -1;
}
$binExponent = substr($bin, 1, 8);
$exponent = -127;
for($i = 0; $i < 8; $i++) {
$exponent += (intval($binExponent[7 - $i]) * pow(2, $i));
}
$binBase = substr($bin, 9);
$base = 1.0;
for($x = 0; $x < 23; $x++) {
$base += (intval($binBase[$x]) * pow(0.5, ($x + 1)));
}
$float = (float) $sign * pow(2, $exponent) * $base;
return $float;
}

Per testare il tutto dovreste poter effettuare la seguente conversione:

Bin: 1000011100010111110001111010101
(Bin Corretto: 01000011100010111110001111010101)
Float: 279.77993774414

N.B.: Come potete vedere la funzione aggiunge il primo bit (0) nel caso in cui l’intero binario sia composto da 31 bit e non 32.

Modbus e PHP

Sono alle prese da diversi giorni con un problema da risolvere per un nuovo progetto che porterò avanti nei prossimi mesi. Dopo aver sbattuto un po’ la testa sul Modbus, il protocollo di comunicazione dei PLC, sono alla ricerca di una soluzione che mi permetta di effettuare chiamate ad uno slave da ambiente PHP. Il risultato della chiamata Modbus quindi deve essere disponibile direttamente nel codice PHP.

Le diverse soluzioni che sto analizzando sono:

  1. Scrivere un’estensione per PHP che, grazie ad una libreria Libmodbus, possa effettuare chiamate direttamente dal codice PHP
  2. Utilizzare un Gateway Modbus TCP/IP- RTU. In pratica dal codice PHP potrei effettuare una chiamata al gateway tramite socket. Il gateway a sua volta gestirebbe la chiamata al device via Modbus e restituirebbe i dati alla mia procedura PHP.
  3. Utilizzare un software open source tipo SCADA. Ad esempio Likindoy o OpenSCADA.

La soluzione migliore, in termini di sviluppo, come sempre deve essere la più semplice da implementare e manutenere. Al momento sono orientato sulla 1, la 2 ho problemi a compilarla e la 3 l’ho parcheggiata in attesa di testarla.
Vi farò sapere…

Aggiornamento del 03/01/2011

Avendo ricevuto richieste di maggiori dettagli sull’estensione ho deciso di rilasciarla sotto licenza GPL v2, si sa mai che qualche altro sviluppatore si unisca al progetto per migliorarla.

Al momento l’estensione PHP implementa solo una parte delle funzioni Modbus esistenti:

  • Read holding registers (func. 03)
  • Read input registers (func. 04)
  • Write (func. 16, sviluppo terminato ma non testato)

Il tutto è implementato secondo il formato RTU.

Link al progetto su Google Code: Estensione PHP per Modbus – Wiki Reference

Aggiornamento del 11/10/2016

Il progetto è stato spostato su GitHub: https://github.com/Jazzo/PHP-Extension-Modbus