Emanuele ha rilasciato una nuova versione del plugin per visualizzare nella sidebar del vostro blog WordPress la posizione aggiornata nella classifica di BlogBabel: BlogBabel Rank Plus.

Piccolo problema: il plugin non funziona su DreamHost (o quantomeno non funziona su questo blog).

Questo è il codice originale del plugin utilizzato per leggere la posizione

function bbrp_getRank($blog) {
	$host = BB_API_URL.$blog.';f=txt';
	$contents = file_get_contents($host);
	if($contents != "") {
		$rankx = explode("rank: ",$contents);
		$ranky = explode("\n",$rankx[1]);
		$trend = explode(" ",$ranky[1]);
	}
	return array("$ranky[0]","$trend[1]");
}

La funzione file_get_contents con URL è disabilitata su DreamHost per motivi di sicurezza, per cui bisogna modificare il codice in questo modo:

  • utilizzare CURL al posto di file_get_contents
  • aggiungere il carattere / al termine dell’URL (variabile $host): in caso contrario non viene restituito alcun risultato

Per comodità ho scelto di creare una funzione file_get_contents_DreamHost e modificare solo la chiamata a file_get_contents nella funzione originale bbrp_getRank:

function file_get_contents_DreamHost ($host) {
	$ch = curl_init();
	$timeout = 5;
	curl_setopt ($ch, CURLOPT_URL, $host.'/');
	curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
	$file_contents = curl_exe_c($ch);
	curl_close($ch);
	return $file_contents;
}

function bbrp_getRank($blog) {
	$host = BB_API_URL.$blog.';f=txt';
	$contents = file_get_contents_DreamHost($host);
	if($contents != "") {
		$rankx = explode("rank: ",$contents);
		$ranky = explode("\n",$rankx[1]);
		$trend = explode(" ",$ranky[1]);
	}
	return array("$ranky[0]","$trend[1]");
}

Nota importante: nella prima funzione, c’è scritto curl_exe_c. Il secondo “_” va cancellato (questa è la funzione in questione): evidentemente su DreamHost ci sono delle protezioni che impediscono il salvataggio di un post contenente quella stringa (cercando di salvare si ottiene una pagina di errore 503).


6 commenti/trackback a “BlogBabel Rank Plus su DreamHost”

  1. dalco scrive:

    Un suggerimento, ma da ignorante dei sistemi di caching di WP. È pericoloso vincolare la creazione di una pagina web al download di una pagina su di un altro server: nel caso tale server si dovesse inceppare o risultasse non raggiungibile dalla rete di DH ne conseguirebbe un rallentamento notevole delle pagine del tuo blog (pari al timeout che hai impostato nella funzione di curl). Il caching di WP potrebbe mitigare notevolmente il problema, ma non sono esperto di ciò perché non so fino a che livello si spinga tale caching.

    Una soluzione più elegante e decisamente più robusta e performante è quella di utilizzare il crontab sul server, in modo che venga scaricato ogni tot di tempo la pagina in questione nel tuo spazio web, da un processo diverso da quello del php.

    Ad esempio mettendo tutto su di una riga nel tuo crontab:
    0 * * * * wget http://www.domainblogbabeel.com/script.php?someparams=somevalue;f=txt
    il cron del server scaricherà ogni ora la pagina desiderata nella home del tuo spazio. Giocando con le opzioni di wget puoi salvare la pagina col nome e nella posizione che più ti sembra opportuna.

    Potrai quindi usare quel file direttamente per la funzione file_get_contents che a questo punto, utilizzando un file in locale, funzionerà alla perfezione e senza rischio alcuno di rallentamenti.

    Sostituendo nel crontab al comando diretto del wget uno script di shell opportuno molto semplice da realizzare, potrai inserire ulteriori controlli su quanto scaricato: ad esempio utilizzando i codici di errore ottenuti da wget o tramite un’analisi sommaria del contenuto del file. Così facendo in caso di problemi al sito di Blogbabel potrai far decidere al server se mantenere la copia locale del file con il rank in modo da avere sempre un valore valido visualizzato nel sito.

    PS: Ovviamente se non ti piace wget puoi sempre usare curl.

  2. P|xeL scrive:

    L’aspetto più divertente è che, dalla 1.1, ho smesso di usare Curl nella connessione perché al contrario Tophost non le supporta ma accetta benissimo file_get_contents(). Da qui il primo problema di Matteo… 😉
    Ciao,
    P|xeL

  3. flod scrive:

    @Dalco: in realtà quella nel post è solo una minima parte del codice del plugin 😉

    Quella funzione viene chiamata una sola volta al giorno: l’immagine viene creata e salvata in locale (nella cartella degli uploads di WordPress), se l’immagine ha meno di 24 ore di vita non viene inviata nessuna richiesta a BlogBabel, se l’immagine è più vecchia viene rigenerata.

  4. P|xeL scrive:

    Preciso che l’immagine scade dopo 18 ore, in modo da assicurare un aggiornamento “al giorno” (i sistemi di BlogBabel effettuano l’aggiornamento dei rank tra le 23 e le 4 di notte, quindi quelle ore sono state scartate).
    L’idea di Dalco è carina, ma non tutti hanno la possibilità di gestire un cron sul loro server. Potrei realizzarne facilmente una versione per i più geek che vogliono questa gestione ma… si tratta in fin dei conti di beccare down i server di BlogBabel proprio al minuto esatto in cui scade l’immagine… il che è possibile ma molto da sfigati (per sdrammatizzare! :-D).
    Ciao,
    P|xeL

  5. Samask scrive:

    Non sarebbe meglio compilare un nuovo php5, cosí puoi fare praticamente quello che vuoi? L’ho fatto per avere IMAP e eAccelerator, e tutto funziona molto bene.
    http://wiki.dreamhost.com/PHP5_installscript

  6. flod scrive:

    @Samask: se il problema è solo con qualche script che puoi modificare (ad es. il plugin in questione), la soluzione di compilare php5 mi sembra un po’ eccessiva.

    Se mai dovessi avere altri problemi, terrò sicuramente conto del suggerimento 😉

Trackback e pingback

  1. Nessun trackback o pingback disponibile per questo articolo

Non è possibile inserire nuovi commenti. I commenti vengono disattivati automaticamente dopo 60 giorni.