Blog : PHP

Backend WordPress Lento: il problema di PHP

Backend WordPress Lento: il problema di PHP

Spesso mi sono trovato a dover trattare siti web in WordPress cui pannello di amministrazione backend (e talvolta anche il frontend) risultava estremamente lento.

Le ripercussioni di questa lentezza sono molte. Anzitutto si ha una notevole difficoltà nel gestire la piattaforma che può far spazientire e talvolta impedire l’operato saturando le risorse (soprattutto la CPU del server) facendoci uscire un bel errore 500 di Apache sul nostro Browser.

Altra grave ripercussione è che quando la lentezza riguarda anche il front end i motori di ricerca avranno un giudizio negativo sul nostro sito abbassando il posizionamento nei risultati di ricerca.

Sul web ci sono moltissime soluzioni o guide per velocizzare wordpress ma oggi voglio trattare una problematica meno trattata ma che spesso si rivela essere la principale: la versione di PHP su cui il nostro WordPress gira.

Il problema della Versione PHP per WordPress.

Molto spesso quando si ha un hosting condiviso la versione del linguaggio PHP installata sul server può risultare vecchia o addirittura obsoleta. Questo succede perchè i provider di servizi tendono ad utilizzare le versioni di PHP che sono “stabili” finchè qualcuno non si lamenta. Mi capita molte volte infatti, di vedere hosting o server dedicati che utilizzano la versione 5.2 di PHP. Vedendo però la documentazione di WordPress sul loro sito ufficiale ci si rende conto che tra i prerequisiti richiesti vengono menzionate versioni di PHP decisamente superiori. Nel momento in cui scrivo, la release di PHP suggerita è infatti la 7.2. Sempre nella stessa documentazione, viene sconsigliato l’utilizzo di versioni precedenti in quanto, ovviamente, espongono il sito web a falle di sicurezza anche se non menziona le ripercussioni in termini di velocità. Questo perchè il parametro non riguarda direttamente i core di WordPress ma i plugin o i temi che andremo ad installare e che sono scritto utilizzando nuove sintassi o strumenti forniti dalle più recenti versioni di PHP.

 

Verificare versione PHP WordPress

Per scongiurare questo problema, la prima cosa da fare è vedere la versione di PHP su cui il nostro wordpress sta girando. Per verificare la versione di PHP installata, si può procedere in 3 modi:

Metodo Facile: su wordpress è possibile installare il plugin “Display PHP Version” il quale andrà semplicemente ad aggiungere una stringa sul footer del nostro backend WordPress informandoci della versione attualmente utilizzata dal nostro Server.

Metodo Medio: E’ possibile accedere al pannello di amministrazione del nostro provider visualizzando la versione PHP installata. Nelle due immagini sottostanti sono visualizzate queste informazioni su un cPanel e su un pannello di amministrazione di Aruba.

Metodo Difficile (si fa per scherzare 😉 : è possibile creare un file denominato versionePHP.php, scriverci dentro la seguente porzione di codice:

<?php phpinfo() ;

e caricarla nella cartella FTP principale del sito eseguendo poi lo script andando sull’indirizzo www.tuosito.xyz/versionePHP.php

 

Scelta della Versione PHP per WordPress

Per scegliere la versione PHP più idonea del nostro WordPress dobbiamo accedere al backend di amministrazione e nella bacheca principale, a fondo pagina, troviamo la versione di WordPress utilizzata con una stringa tipo:

Versione 4.9.8

Ovviamente il sconsiglio spassionato è quello di mantenere wordpress e i plugin installati alla versione più recente in modo da ridurre le criticità di sicurezza. Nel caso in cui quindi stiamo utilizzando una versione vecchia di wordpress, procediamo al suo aggiornamento (dopo aver fatto un bel backup di file e database).

Ci rechiamo quindi nella documentazione ufficiale di WordPress estrapolando la versione di PHP consigliata relativa alla nostra versione del CMS:

Cambiare o Aggiornare versione PHP WordPress.

Il prossimo step è quindi quello di aggiornare la versione PHP di WordPress. Le immagini successive mostrano come  questa operazione può essere effettuata su cPanel o su pannello di Amministrazione Aruba:

Versione cPanel

 

Versione Aruba

 

 

Miglior Plugin Per Velocizzare WordPress

potresti anche essere interessato a velocizzare il tuo Worpdress basandoti su altri accorgimenti indipendenti dalla versione PHP. In tal caso di consiglio la lettura di questo articolo

Inserire Shortcode in PHP – Funzione WordPress

Inserire Shortcode in PHP – Funzione WordPress

Agli amanti di WordPress sarà capitato di aver necessità di inserire shortcode in php per personalizzare un tema o creare una nuova funzionalità. Il framework di WordPress mette a disposizione anche questa funzione molto semplice da utilizzare:

<?php echo do_shortcode("[ShortcodeQui]"); ?>

Questa funzione avrà come risultato di stampare a video il risultato dello shortcode utilizzato.

 

La funzione è pubblicata sulla documentazione ufficiale QUI

Importare Database mySql grandi dimensioni

Importare Database mySql grandi dimensioni

Può accadere di dovere trasferire un database mySql su un altro server o ripristinare un backup effettuato. Quando però ci troviamo di fronte al dover importare un database mysql di grandi dimensioni, questa operazione potrebbe non essere possibile utilizzando i canali convenzionali. Probabilmente, infatti, ti sarai recato sul tuo pannello di phpMyAdmin e dopo aver selezionato il tuo database e hai avviato la procedura di Import ma questa non è andata a buon fine in quanto il database è troppo grande con conseguente messaggio di errore ” stai probabilmente cercando di caricare sul server un file troppo grande”

Alcuni cominciano quindi a ricorre a pratiche masochiste come dividere database mysql cercando di avere file di dump più piccoli da caricare singolarmente. Altri, hanno sufficienti nozioni per effettuare l’import utilizzando un accesso SSH al database utilizzando quindi le funzioni di dump. Altri cominciano a smanettare con le variabili d’ambiente cercando di estendere i limiti di upload del database.

Vorrei però trattare un metodo molto semplice ed intuitivo per importare db mysql utilizzando un applicativo chiamato MySQLDumper.

Come importare un database troppo grande

Per utilizzare MySQL Dumper è sufficiente scaricare l’applicativo qui . Effettuata questa operazione, procediamo quindi a caricare il file all’interno della root principale del nostro sito web.

Scompattiamo quindi il file caricato e accediamo, attraverso il browser, alla pagina http://miodominio.xyz/msd1.24.4/install.php .

Ci verrà quindi richiesto di selezionare la lingua scelta e clicchiamo quindi su Installazione.

Nella schermata che compare, ci verrà richiesto di inserire i parametri di accesso al nostro database quali: host, nome database, user e password.

Se il server sarà raggiungibile con le informazioni date, comparirà il messaggio di connessione avvenuta con successo e passiamo quindi a salvare la configurazione.

Successivamente carichiamo il nostro database da importare (in formato sql o zip) nella cartella msd1.24.4/work/backup 

 

Nel pannello di controllo di MySQLDumper, clicchiamo sulla voce di menù Ripristina, selezioniamo il database che vogliamo caricare (quello inserito nella cartella backup) e clicchiamo sul tasto Ripristina.

In poco tempo la procedura verrà completata ed avremo il nostro database caricato con successo.

Codice PHP Download File: forzare il download per scaricare un file

Codice PHP Download File: forzare il download per scaricare un file

Realizzando una Web Application in linguaggio PHP, può essere necessario abilitare una funzione che consente di forzare il download per scaricare un file. Il Codice PHP per il download di file è molto semplice ma in rete si trovano diversi codici che spesso non funzionano o generano dei file corrotti quindi non apribili.

Inserisco quindi un codice testato e funzionante per il download di un file .ZIP o PDF o JPEG o JPG. Per altre tipologie di file, sarà sufficiente modificare la tipologia di file da scaricare:

 

$file_name = "nomefile.zip";
if( !is_file($file_name) )
exit();
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
switch(strtolower(substr(strrchr($file_name,'.'),1)))
{
case 'pdf': $mime = 'application/pdf'; break;
case 'zip': $mime = 'application/zip'; break;
case 'jpeg':
case 'jpg': $mime = 'image/jpg'; break;
default: exit();
}
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime ($file_name)).' GMT');
header('Cache-Control: private',false);
header('Content-Type: '.$mime);
header('Content-Disposition: attachment; filename="'.basename($file_name).'"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize($file_name));
header('Connection: close');
ob_clean();
readfile($file_name);

Modulo Danea Easy Fatt con Prestashop: dimensioni immagini

Modulo Danea Easy Fatt con Prestashop: dimensioni immagini

Utilizzando il modulo di integrazione tra Danea EasyFatt e Prestashop, sviluppato da 2beweb2, può rivelarsi necessario ottenere le  immagini ingrandite all’interno della scheda prodotto di dimensioni maggiori rispetto a quanto previsto dal modulo. Lo stesso infatti, di default, consente una dimensione massima di 900×900 px compensando eventuali margini aggiuntivi con il bianco.

E’ possibile ovviare a questo limite modificando la porzione di codice posta all’interno del file: uploadimages.php

Tra le prime righe, è necessario modificare le seguenti variabili che regolano la dimensione massima delle immagini:

$max_orig_x = 900;
$max_orig_y = 900;

inserendo al posto di 900 il valore desiderato.

Questa modifica è stata segnalata ai gentilissimi sviluppatori di 2beweb2 che mi hanno informato che aumenteranno il limite nelle versioni successive del modulo.

Quando Google Analytics non funziona in prestashop

Quando Google Analytics non funziona in prestashop

Per ottenere un buon monitoraggio dei risultati sulla nota piattaforma prestashop è fondamentale utilizzare il servizio di Google Analytics. Come è noto, dopo aver creato un profilo utente è necessario incorporare un codice Javascript inserendolo all’interno del sito realizzato in Prestashop.

Per rendere la vita semplice, esiste un modulo installabile da back end trovabile inserendo “Google Analytics” o “Ganalytics” dove come parametro di configurazione è necessario inserire solo l’id fornito da Google a esempio:  UA-0000000-3

Purtroppo però spesso questa procedura non si dimostra funzionante soprattutto con le ultime versioni di prestashop o dei temi.

E’ necessario quindi editare a mano il file header.tpl ed inserire il codice javascript.

Anche questa soluzione può rivelarsi non sufficiente in  quanto il framework Smarty con il quale sono realizzati molti temi non riesce ad interpretare alcuni caratteri contenuti nel codice. Per ottemperare a questa situazione è necessario iniettare il codice all’interno degli snippet {literal} e {/literal} diventando quindi

 

{literal}
<script>
 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
 })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-0000000-3', 'auto');
 ga('send', 'pageview');
</script>
{/literal}
Abilitare ZipArchive in PHP su Hosting Condiviso Aruba

Abilitare ZipArchive in PHP su Hosting Condiviso Aruba

Se stiamo realizzando, modificando o utilizzando una web application basata su PHP, potrà tornarci utile o obbligatorio abilitare l’estensione ZipArchive su Hosting Condiviso Aruba.

ZipArchive è l’estensione che consente ad uno script PHP di generare o estrarre archivi ZIP.

 

Abilitare ZipArchive su Aruba

Aruba di default non abilita ZipArchive per le soluzioni Hosting Condivisi per ovvie ragioni di sicurezza. E’ possibile però abilitare questa funzione in modo permanente o per il solo tempo necessario per eseguire un’operazione. Ho quindi preparato un video esplicativo.

 

Facebook needs the CURL PHP extension

Facebook needs the CURL PHP extension

Utilizzando le API di Facebook così come altre applicazioni, può accadere di imbatterci in questo messaggio di errore:

Facebook needs the CURL PHP extension

Il problema nasce dal fatto che per molte delle sue API, Facebook ha necessità di comunicare con il nostro server utilizzando le cURL. In soldoni, queste danno la possibilità di trasferire dati attraverso la sintassi delle Url.

Se ci siamo imbattuti in questo problema, vuol dire che il nostro server non ha le cUrl istallate. In ambienti Debian sarà sufficiente accedere al nostro server e installare con:
apt-get install php5-curl

services apache2 restart

Nel caso in cui stessimo ancora utilizzando php4 basterà sostituire il nome del pacchetto con php4-curl

Analizzatore Log Mail su Server

Analizzatore Log Mail su Server

Uno degli attacchi hackers più frecquenti, riguardandi hosting o server, sono quelli in cui viene caricato all’interno di una delle cartelle del sito o della web application, un file scritto in diversi linguaggi che è in grado di inviare email spamm mentendo in serio pericolo l’usabilità del sito ma soprattutto rendendoci responsabili di eventuali azioni legali.

Molte volte capita che su un solo server siano ospitati più siti e che quindi sia molto difficile trovare il file “infetto” che genera il traffico di spamm.

Con PHP 5.3 viene introdotta un’importante novità ovvero, è possibile specificare quale file può fungere da log mail e quindi memorizzare gli estremi di ogni email mandata dal nostro server. Utilizzando questa funzione, per ogni email inviata, troveremo il corrispondente file che l’ha generata consentendoci quindi di eliminarlo e successivamente di correre ai ripari cercando di trovare la falla che ha consentito la scrittura dello stesso.

Basta quindi editare il file php.ini e specificare le variabili alle righe:
mail.add_x_header = On
mail.log = /var/log/phpmail.log

La prima riga aggiunge al log mail X-Header Addizionali dandoci informazioni sul processo e sul nome e percorso del file che ha generato la mail.

La seconda riga specifica in quale file queste informazioni debbano essere inserite.

Nel caso in esempio, sarà quindi necessario creare un file phpmail.log nel persorso /var/log/phpmail.log e renderlo scrivibile dal processo di PHP

Per ogni email che partirà dal nostro server, avremo una linea di log simile a quella sottostante:

1
mail() on [/var/www/miosito.com/httpdocs/pages/formmail.php:50]: To: info@miosito.com -- Headers: From: "John Brown Smith: " <jsb@miosito.com>

Facile capire il percorso che ha generato la mail e apporre le dovute soluzioni.

Storable Random Password

Storable Random Password

Problemi con la sicurezza delle tue applicazioni? Contattaci!

Utile per molte applicazioni e per i processi di login, gli algoritmi in grado di generare password casuale sono molto utili al fine di generare credenziali di autenticazione o verificare un processo di corrispondenza di un indirizzo mail con un account. Un occhio di riguardo è sempre rivolto alla sicurezza che le password devono mantenere per proteggere tutto ciò che sta oltre il loro utilizzo. Inutile dire quindi che la miglior password utilizzabile è quella formata dall’unione di lettere maiuscole e minuscole, numeri e caratteri speciali per una lunghezza di almeno 8 caratteri.

Trattando di software rivolti ad un pubblico di vario genere, non sempre utilizzare la password più efficiente è la risposta giusta in quanto difficilmente memorizzabile e quindi conservata in mail, fogliettini o altri dispositivi non protetti.

Per ottenere un buon connubio tra sicurezza e semplicità d’uso è necessario poter generare password casuali che presentino una facilità di lettura, quindi di memorizzazione, data dallo pseudo utilizzo di costrutti grammaticali. Unendo infatti suffissi, prefissi, vocali prese una sola volta e consonanti ripetute secondo regole grammaticali, si può ottenere una password sicuramente insensata ma facile da ricordare.

Di seguito presentiamo un breve algoritmo scritto in PHP che restituisce una password casuale facile da ricordare o come spesso chiamate le SRP Storable Random Password.

La funzione può essere personalizzata in fase di chiamata aumentando/diminuendo il numero di sillabe da utilizzare e introducendo o meno i caratteri e la quantità numerica nonché l’utilizzo dei prefissi grammaticali:

  public function gen_mem_password($syllables = 3, $use_prefix = false, $use_numbers = true,$quantity_numbers=2){
            // Define function unless it is already exists
    if (!function_exists('ae_arr'))
    {
        // This function returns random array element
        function ae_arr(&$arr)
        {
            return $arr[rand(0, sizeof($arr)-1)];
        }
    }

    // italian prefix
    $prefix = array('an',       'ana',      'ante',     'anti',     'arci',
                    'avan',     'bis',      'circom',   'cis',      'con',
                    'contra',   'contro',   'de',       'di',       'dis',
                    'eu',       'extra',    'fra',      'in',       'infra', 
                    'inter',    'intra',    'iper',     'ipo',      'luxta',    
                    'meta',     'ob',       'oltre',    'post',     'pre',      
                    'pro',      're',       'sin',      'sopra',    'sotto',    
                    'stra',     'sub',      'super',    'sur',      'tra', 
                    'trans');

    // italian suffix
    $suffix = array('accio',    'aggine',   'aggio',    'aglia',    'aio',
                    'anza',     'astro',    'ata',      'ato',      'enza',
                    'eria',     'esco',     'etto',     'ezza',     'erla', 
                    'etto',     'ezza',     'fero',     'iere',     'ino',
                    'ismo',     'ista',     'mento',    'oide',     'one', 
                    'ota',      'oto',      'otto',     'tore',     'uccio',
                    'ucolo',    'zione',    'ale',      'ario',     'ese', 
                    'evole',    'issimo',   'oso',      'oto',      'mente',
                    'archia',   'filla',    'logia',    'mania',    'teca',
                    'iatra',    'scopia'); 

    //vowel sounds 
    $vowels     = array('a', 'o', 'e', 'i', 'u', 'ou'); 

    //sound consonants 
    $consonants = array( 'r', 't', 'p', 's', 'd', 'f', 'g', 'h', 'l', 'z','c', 'v', 'b', 'n', 'm','qu');
    //numbers
    $numbers    = array('1','2','3','4','5','6','7','8','9','0');

    $password           = $use_prefix?ae_arr($prefix):'';
    $password_suffix    = ae_arr($suffix);

    for($i=0; $i<$syllables; $i++)
    {
        //random consonant
        $doubles    = array('n', 'm', 't', 's','r','c','d','p','f','g','l','z','v');
        $c          = ae_arr($consonants);
        if (in_array($c, $doubles)&&($i!=0))
            if (rand(0, 2) == 1) 
                $c .= $c;
        
        $password .= $c;

        //random vowel
        $password .= ae_arr($vowels);

        if ($i == $syllables - 1) 
            if (in_array($password_suffix[0], $vowels))
                $password .= ae_arr($consonants);

    }

    // selecting random suffix
    $password .= $password_suffix;

    if($quantity_numbers>=0 && $use_numbers)
	for($j=0; $j<$quantity_numbers; $j++)
	 	$password .= ae_arr($numbers);
	
    

    return $password;
        
    }