Compressione gzip senza il modulo apache mod_gzip

LA maggior parte dei servizi di shared hosting offrono la compressione gzip di default, come per esempio dreamhost dove al massimo è da disattivare non da attivare. Invece con lunarpages (che per la cronaca anche se non centra nulla ieri un attacco DoS lo ha fatto andare interamente down per un oretta) con il servizio base di shared hosting non consente di attivare il modulo di apache mod_gzip.

C’è un modo forse un po macchinoso ma comunque funzionale per ovviare a questo. Essendo che utilizzano suPHP è possibile tra le altre cose personalizzare il file di configuarazione php.ini per ogni cartella sul server. Ciò consente di abilitare zlib.output_compression ovvero l’estensione di PHP che a runtime “on-th-fly” al volo come recita il manule di php comprime l’html risultante da una pagina php prima di inviarlo ai browser. Per attivarlo quindi basta creare un file php.ini e scriverci:

zlib.output_compression = On
zlib.output_compression_level = 6

Per poter comprimere tutti i documenti, dai fogli di stile ai javascript, e non solo gli script php basta far processare a PHP tutti i file che vogliamo comprimere, pertanto andremo a scrivere nel file .htaccess

AddHandler application/x-httpd-php5 .css .html .js
suPHP_ConfigPath /home/username/public_html/

La direttiva AddHandler serve a far processare a PHP tutti i file con estensione .css, .html e .js potete aggiungere ogni estensione che vi pare, la seconda riga invece serve per specificare il percorso del file di configurazione php.ini, al posto di username va ovviamente il vostro username e dopo public_html potete specificare qualsiasi percorso dove sia presente un file php.ini.

Ora tutti i file prima di essere visualizzati verranno compressi, questo però può comportare dei grossi problemi, l’header di risposta per esempio di un foglio di stile potrebbe non essere più lo stesso, pertanto bisogna ristabilire gli header giusti. Un modo molto semplice è includere prima di ogni file questo script.

<?php
$path = pathinfo($_SERVER['SCRIPT_NAME']);
 if ($path['extension'] == 'css')  {
 header('Content-type: text/css');
}
if ($path['extension'] == 'js')  {
 header('Content-type: application/x-javascript');
}
?>

per farlo bisogna salvare questo script in un file denominato per esempio pre.php e aggiungere al file php.ini questa riga:

auto_prepend_file = "/home/username/public_html/pre.php"

Così ora i file con estensione .js, .css e .html prima verranno processati da php quindi compressi poi gli sarà restituito il giusto header e infine inviati al browser. Attenzione che se avete dell’xml all’interno di questi file tra i tag <?xml ... ?> verrà processato da php, per ovviare a questo basta aggiungere a php.ini il comando:

short_open_tag = 0

questo disabilita gli short tag <? ... ?> per php quindi come è giusto che sia tutto il codice php va messo assolutamente all’interno dei tag <?php ... ?>

Foto random del tuo album di Flickr sul tuo Blog

ATTENZIONE: Ho creato un plugin per WordPress con queste funzioni, maggiori informazioni le trovate nella pagina ufficiale. Ormai tutti conoscerete Flickr il social network che da la possibilità di gestire un album con le proprie foto e condividerle con amici o con l’intera rete. Per implementare Flickr in WordPress ci sono vari Plugin a disposizione ma fra tanti ho scelto FlickrRss che consente facilmente di integrare le foto direttamente dal Feed Rss di Flickr, in questo articolo analizzeremo ogni passaggio dall’installazione all’implementazione e in fine, per chi volesse, con una piccola modifica del codice (non servono grandi conoscenze di php) andremo a rendere casuale l’ordine e le foto pubblicate dal nostro album così anche se non aggiorniamo spesso il nostro album i lettori non vedranno sempre le stesse ultime foto inserite.

Installazione

Inazitutto partiamo scaricando il plugin da questo sito, un volta scaricato il file zip, possiamo scompattarlo e caricarlo nella cartella wp-content/plugins tramite ftp oppure da pannello di controllo nel menu di sinistra andare su plugin/aggiungi nuovo e caricare il file compresso.

Una volta caricato il plugin entriamo nel pannello di controllo, dal menu di sinistra clicchiamo su Plugin e nella lista dei plugin non attivi vedremo anche quello che ci interessa “FlickrRss”, lo attiviamo cliccando su “attiva” alla destra della descrizione.

Implementazione

Ora per implementarlo nel blog abbiamo due possibilità,

  • se il nostro tema è widgest ready (ovvero supporta i Widget), basta andare dal menu su Aspetto -> Widget a cliccare su “aggiungi” affianco a flickRss.
  • Oppure (consigliato) andando a modificare il nostro tema inserendo questo tag dove vogliamo che venga inserito il nostro album:[php toolbar="false"]<?php get_flickrRSS();?>[/php]

Nel pannello di controllo dopo l’installazione comparirà sotto la voce “impostazioni” la voce flickrRss dal quale potremmo configurare varie cose come:

  • il numero di foto da visualizzare,
  • la tipologia di album, se volte le vostre foto personali selezionate “user”
  • i tag delle foto da visualizzare (se lasciate in bianco visualizzate da tutto l’album)
  • l’user ID, se non lo conoscete potete cliccare affianco su “find yout ID” per ricavarlo dal vostro user name
  • il codice html da mettere prima dell’album
  • come impostare il tag di visualizazzione dell’immagine e il suo link
  • il codice html da mettere dopo l’album

Sulla destra potete vedere i metatag da inserire nel Item Html per poter personalizzare il funzionamento, di default il link dell’immagine rimanda alla pagina di Flickr ma nel mio caso ho voluto implementare con lightbox l’ingrandimento dell’immagine.(farò una guida anche su questo)
Per migliorare l’aspetto delle anteprime potete racchiudere il vostro album all’interno di un div con un “id” specifico nel tema oppure appunto definendo il before list e l’after list e andare a specificare i CSS per quel determinato div.

Versione random

Una cosa che mi piaceva poco di questo plugin è che ogni volta che viene visualizzato il blog si vedono sempre se solite ultime foto in ordine di inserimento. Quindi ho cercato il modo di rendere random sia la visualizzazione delle foto sia la scelta di quali visualizzare purtroppo il feed RSS di flickr è limitato a 20 foto. Anche se il modo per ovviare a questa cosa esiste ma la vedremo in un altro articolo.Ora tornando al random per poterlo implementare bisogna modificare “flickrrss.php” potete farlo andando dal pannello di controllo in plugin ? editor, sulla destra selezionate flickrRSS
cercate “function printGallery” (è circa a metà intorno alla riga 131 ma potete comunque utilizzare lo strumento di ricerca per trovarlo). Il codice che vi si presenta dovrebbe essere questo

[php]function printGallery($settings = array()) {
if (!is_array($settings)) {
$settings = $this->fixArguments(func_get_args());
}

$settings = array_merge($this->getSettings(), $settings);
if (!($rss = $this->getRSS($settings))) return;
# specifies number of pictures
$items = array_slice($rss->items, 0, $settings['num_items']);
echo stripslashes($settings['before_list']);
# builds html from array
foreach ( $items as $item ) {
[/php]

ora lo selezionate e lo sostituite interamente (attenzione a non sbagliare neanche una riga) con questo

[php]function appartiene($random,$foto){
$dim = count($foto);
for($j=0;$j<$dim;$j++)
if($foto[$j]==$random)return 0;
return 1;
}

function printGallery($settings = array()) {
if (!is_array($settings)) {
$settings = $this->fixArguments(func_get_args());
}

$settings = array_merge($this->getSettings(), $settings);
if (!($rss = $this->getRSS($settings))) return;

$numero_foto = 20; //numero di foto tra cui andare a random
$items = array_slice($rss->items, 0, $numero_foto);
echo stripslashes($settings['before_list']);

$foto=array($numero_foto); //tiene conto delle foto già messe

for($ji=0;$ji<$settings['num_items'];$ji++){
$random = rand(0,$numero_foto-1);
while($this->appartiene($random,$foto)==0){
$random = rand(0,$numero_foto-1);
}//controlla che la foto non sia già stata messa
array_push($foto,$random);
$item = $items[$random];[/php]

Nel caso che il vostro album contenga meno di 20 foto per non avere dei buchi dovete modificare $numero_foto che trovate alla riga n.146 (del codice qua sopra intendo) con il numero di foto presenti nel vostro album

In questo modo ad ogni visualizzazione del vostro blog le immagini cambieranno rendendolo più dinamico.

ATTENZIONE: Ho creato un plugin per WordPress con queste funzioni, maggiori informazioni le trovate nella pagina ufficiale.

Grafici Dinamici con PHP e MySql (1)

In questo articolo vi spiego come utilizzare PHPGraphLib un utilissima libreria in PHP per creare grafici dinamici da qualsiasi fonte di dati (in questo caso un databse MySql) che implemento in molte delle applicazioni web che mi trovo a sviluppare

Potete scaricare la libreria direttamente da questa pagina.
In questo zip trovate due file uno phpgraphlib.php è per creare i normali istogrammi invece con l’altro phpgraphlib_pie.php come suggerisce il nome potrete creare grafici a torta, in entrambi i casi avrete la possibilità di personalizzare dimensioni, colori e aspetto.
In questa guida vedremo come creare un istogramma.

Istogramma

Vi spiego riga per riga, poi infondo ho raccolto il sorgente intero. Iniziamo includendo la libreria

include("phpgraphlib.php");

ora creiamo un nuovo oggetto grafico di nome $graph di dimensionsi 600×500

$graph=new PHPGraphLib(600,500);

ora dobbiamo preparare i dati da mettere sul grafico in un array dove l’indice rappresenterà i valori delle ascisse (l’asse orizzontale) e i valori dell’array andranno sull’asse delle ordinate (l’asse verticale) quindi per esempio con l’array successiva avremo sulle ascisse 0, 1 ,2 ,3 , … e sulle ordinate il valore corrispondente 12124, 5535, …

$data=array(12124,5535,43373,22223,90432,23332,15544,24523,32778,38878,28787,33243,34832,32302);

invece in questo caso sull’asse orizzontale avremo i mesi e sull’asse verticale i valori, attenzione che con i valori negativi le barre dell’istogramma andranno verso il basso

$data=array("Jan"=>1324, "Feb"=>1200, "Mar"=>100, "Apr"=>1925, "May"=>1444, "Jun"=>-10, "Jul"=>364, "Aug"=>221, "Sep"=>-30, "Oct"=>848, "Nov"=>719, "Dec"=>114);

ma se vogliamo che il nostro grafico sia dinamico dobbiamo ricavare i dati da un database, per prima cosa ci connettiano al database (fra poco farò una guida al riguardo):

include('connection.php');

ricavando i dati dal database ovviamente abbiamo infinite possibilità come esempio vi riporterò un grafico in cui conteremo le persone presenti nel nostro database a seconda dell’anno di nascita. Supponendo che abbiamo una tabella di nome “elenco” andiamo a prendere tutti i valori del campo “AnnoNascita” in ordine decrescente e mano mano che li scorriamo finche non sono finiti per ogni dato incrementiamo il valore dell’array con indice l’anno di quel campo.

$query = mysql_query("SELECT AnnoNascita FROM elenco ORDER BY AnnoNascita DESC");
while($result_row = mysql_fetch_array($query))
$data[$result_row['AnnoNascita']]++;

ora che abbiamo preparato i dati, dobbiamo passarli al grafico:

$graph->addData($data);

poi possiamo impostare un titolo da assegnare al grafico

$graph->setTitle("Valori casuali per ogni mese");

impostiamo il colore del testo a rosso

$graph->setTextColor("red");

e infine creaiamo il grafico

$graph->createGraph();

ora vediamo il codice completo del file grafico.php, con questo codice la libreria deve essere nella stessa cartella di questo file:

include("phpgraphlib.php");
$graph=new PHPGraphLib(600,500);
$data=array("Jan"=>1324, "Feb"=>1200, "Mar"=>100, "Apr"=>1925, "May"=>1444, "Jun"=>-10, "Jul"=>364, "Aug"=>221, "Sep"=>-30, "Oct"=>848, "Nov"=>719, "Dec"=>114);
$graph->addData($data);
$graph->setTitle("Valori casuali per ogni mese");
$graph->setTextColor("red");
$graph->createGraph();

I grafici creati hanno il formato png, possiamo includerli nelle nostre pagine in questo modo

<img src="grafico.php" alt="grafico" />

di seguito alcune delle altre possibilità di personalizazzione a disposizione, per una più accurata spiegazione vi lascio alla documentazione ufficiale della libreria. Ma per ogni richiesta non esitate a chidermi. Prossimamente farà un altra guida per i grafici a torta.

$graph->setGrid(false); //con false nasconse la griglia di default è true
$graph->setBackgroundColor("black"); //imposta il colore di sfondo
$graph->setLine(true); //con true mostra una linea che unisce i valori delle ordinate di default è impostato a false
$graph->setLineColor("yellow"); //imposta il colore della linea appena descritta
$graph->setDataPoints(true);//con true mostra dei pallini in corrispondenza dei valori
$graph->setDataPointColor("yellow");//imposta il colore dei pallini appena descritti
$graph->setBars(false);//con false nasconde le barre
$graph->setGoalLine(0,0025);//mostra una linea orizzontale in corrispondenza del valore indicato
$graph->setGoalLineColor("red");//imposta il colore di questa linea

per ulteriori esempi di codice vi rimando alla pagina ufficiale ma non esitate a chiedermi spiegazioni. Se questa guida vi è servita, piaciuta o lo avete trovata noiosa o incomprensibile fatemelo sapere.

Update

Alcuni hanno riscontrato problemi nell’utilizzo di questa libreria, provate a scaricare l’esempio di prova per vedere se vi funziona.