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

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);

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.

 

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;
        
    }
Filtro Zend o PHP per nomi propri di persona

Filtro Zend o PHP per nomi propri di persona

Problemi con Zend Framework o php? Contattaci!

Riportiamo di seguito un utile filtro scritto in PHP e predisposto all’uso con Zend Framework per filtrare una stringa e renderla grammaticalmente corretta alle regole che afferiscono ai nomi propri di persona nella grammatica Italiana.

/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_Filter
 * @copyright  Draco Corporation (http://www.draco-corporation.com)
 * @license    Draco Corporation (http://www.draco-corporation.com)
 * @version    PersonName.php 1 2013-04-25 11:17
 * @author     Draco Corporation (http://www.draco-corporation.com)
 */

/**
 * @see Zend_Filter_Interface
 */
require_once 'Zend/Filter/Interface.php';
/**
 * @see Zend_Locale
 */
require_once 'Zend/Locale.php';

/**
 * @category   Zend
 * @package    Zend_Filter
 * @copyright  Draco Corporation (http://www.draco-corporation.com)
 * @license    Draco Corporation (http://www.draco-corporation.com)
 */
class Zend_Filter_PersonName implements Zend_Filter_Interface
{
   
    /**
     * Defined by Zend_Filter_Interface
     *
     * returns the name of the person with the first letter capitalized
     *
     * @param  string $value
     * @return string
     */
    public function filter($value)
    {
        

        //reduces all characters enlarging only the first character of each word
        $value = ucwords(strtolower($value));
        
        //If the name is an accent is enlarged after the first letter of this
        $value = preg_replace('/'(w+)/e', "'''.ucfirst('$1')", $value);

      
        return $value;
    }
}

Includere HTML in HTML

In un nostro recente lavoro ci è stato richiesto il collegamento ad una porzione di html da un sito esterno. Solitamente questo tipo di estensione viene effettuata utilizzando la tecnologia fornita dagli Iframe che, sostanzialmente, concede sul nostro sito l’apertura di una finestra (delle dimensioni volute) che si affaccia sul sito esterno. Il problema di questa tecnica è la gestione html del sito incluso.

Quando non siamo i proprietari del sito esterno diventa difficile, se non impossibile, gestire le funzioni del codice. Nel nostro caso specifico dovevamo includere il codice HTML da un sito, cercando di carpirne una serie di news, e ri-pubblicarle sul nostro sito.

Utilizzando gli Iframe abbiamo ottenuto un buon risultato ma, cliccando sui collegamenti ipertestuali, questi si aprivano all’interno della stessa finestra Iframe, rendendo impossibile la consultazione. L’unica soluzione possibile è stata la cattura dell’intero codice HTML utilizzato e, effettuando parsing riga dopo riga, siamo riusciti non solo a catturare la porzione di codice interessata, ma anche a modificarla introducendo, ad esempio, il target _blank agli url delle notizie, per evitare la dispersione dei nostri utenti.

Ad esempio, se volessimo includere la porzione di codice presente sul sito www . sitodaincludere . yyy:


In tal caso dobbiamo includere una lista di elementi che possiedono immagini e collegamenti ipertestuali, riferiti con path relativo, quindi non utilizzabili dal nostro sito. Vediamo ora il codice PHP utilizzato per scaricare la pagina, parserizzare e stampare a video la porzione di codice che ci interessa, sostituendo le parti da settare in base al nostro sito:

',$r)){
	$bool=true;
        $codice=$codice.$r
  }
 
  //Fin tanto che la variabile di controllo è vera
  if($bool){
        //Sostituiamo nella riga corrente, i path relativi con quelli assoluti
        $r=eregi_replace("/images/arrow_red.png", "http://www.sitodaincludere.yyy/images/arrow_red.png", $r);
        $r=eregi_replace("',$r)){
           $codice=$codice.$r;
           //Settiamo a false la variabile di controllo
	   $bool=false;
	}		
    }

}

//Stampiamo a video il risultato ottenuto
echo $codice;

?>

Includendo questo script PHP nel punto preciso della nostra pagina otterremo:


Buona programmazione a tutti!