Plataforma de código abierto para gobierno electrónico.Administración electrónica.
        Open Source Plattform for e-government.

"Las obras de conocimiento deben ser libres,
no hay excusas para que no sea así" (Richard Stallman)


Auto carga de objetos utilizando la función __autoload de PHP5

25/07/2008
Dar a conocer este artículo: Añade este link a delicius Menea esta noticia Enviar a technorati Enviar a Digg Enviar a Wikio Enviar a yahoo
Cuando desarrollamos con PHP sobre el paradigma Orientado Objetos, cada clase es definida en un script php. Por lo que para poder utilizar dichas clases, se deberán hacer los includes necesarios al principio de cada script. Dependiendo de la complejidad de la aplicación, puede terminar siendo, una larga y tediosa lista de includes.

En PHP5 esto se puede evitar. Sólo hay que definir una función llamada __autoload, la cual es llamada automáticamente en el caso de que se intente usar una clase que no haya sido incluida en el script. Es la última chance de cargar la clase antes de que PHP lance un error.

Otra de las ventajas de utilizar __autoload, es que evitamos se incluyan definiciones de clases que no utilizamos. Esto mejorará el rendimiento de nuestras aplicaciones ya que solo se cargan las clases que necesitamos. Por otro lado, se debe tener en cuenta de que la función __autoload será llamada recurrentemente, por lo que tendrá que ser definida lo más liviana posible.

<?php
function __autoload($className) {
if (file_exists("./lib/$className.class.php") ){
include_once("./lib/$className.class.php");
}
}

$instancia  = new unaClase();

?>

En el caso de que estemos desarrollando una aplicación web o escribiendo código que puede ser utilizado por terceros, no es buena idea usar la función __autoload, dado que podría generar eventualmente un conflicto con otra función __autoload definida por terceros. Esto sucede porque lógicamente no puede haber dos funciones con el mismo nombre registradas. Lo que conviene es o bien declararla dentro de una clase o llamarla con otro nombre y luego registrarla en ambos casos mediante la función spl_autoload_register

<?php
spl_autoload_register(array('OP', '__autoload'));

class OP{
private static
$dir_class= array('util',
'controller',
'model',
'session',
'i18n');


public static function __autoload($class) {
foreach(self::$dir_class as $dir){
if(file_exists("./lib/$dir/$class.class.php")){
include_once("./lib/$dir/$class.class.php");
}
}
}
}

function miAutoload($class) {
include_once("./$class.php");
return true;
}

spl_autoload_register('miAutoload');

//Registramos otra vez la misma función
spl_autoload_register('miAutoload');

//Mostramos las funciones registradas
var_dump(spl_autoload_functions());
?>

Podremos ver que la función miAutoload esta registrada solo una vez.

array(2) { [0]=> array(2) { [0]=> string(2) "OP"
[1]=> string(8) "__autoload" }
[1]=> string(10) "miAutoload" }

Integrar en tu web marcadores de del.icio.us con cURL y PHP5

25/07/2008
Dar a conocer este artículo: Añade este link a delicius Menea esta noticia Enviar a technorati Enviar a Digg Enviar a Wikio Enviar a yahoo
Antes que nada explicaré brevemente que es del.icio.us. Es un servicio de gestión de marcadores al estilo red social que permite agregar los marcadores que usualmente se guardan en los navegadores, categorizarlos con el sistema de Tags, compartirlos con otros usuarios, acceder a ellos desde cualquier ordenador conectado a internet, etc. Y además dispone una potente pero sencilla API que utlizaremos para el propósito de éste artículo, integrar los marcadores almacenados en del.icio.us en nuestra web utilizando PHP y cURL. De ésta forma conseguiremos mantener la lista de enlaces de nuestra web al mismo tiempo que mantenemos nuestra lista de enlaces particular.

¿Qué es cURL? PHP soporta libcurl, librería que permite conectar y establecer comunicación con diferentes tipos de servidores con diferentes protocolos como http, https, ftp, gopher, telnet, dict, file, ldap. Soporta certificados https, autenticación de usuarios, etc. En php dispone de una colección de funciones con el prefijo curl_* , así que vamos a utilizar ésta fantástica librería para comunicarnos con del.icio.us.

La API de del.icio.us es sencilla, consiste en peticiones HTTPS con autenticación HTTP-Auth. Utilizaremos el método POSTS (así denomina del.icio.us a los marcadores, así los denominaré a partir de ahora) que permite hacer diferentes acciones sobre éstos. La que nos interesa es la que obtiene el listado de posts, además con la opción de filtrarlos por un tag.

Está disponible en http://del.icio.us/help/api/.

Ésta sería la petición:
https://api.del.icio.us/v1/posts/get?tag=public

Nos devolvería en formato XML los posts etiquetados con public, que serán los que queremos que se muestren en la web. Pues vamos a ver como realizar está petición con cURL.
$peticion = https://api.del.icio.us/v1/posts/get?tag=public;

if (function_exists('curl_init')) {
$o_curl = curl_init($peticion);
curl_setopt_array($o_curl, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERAGENT => 'http://www.miweb.com',
CURLOPT_CONNECTTIMEOUT => 5, //segundos
CURLOPT_TIMEOUT =>10 //segundos,
CURLOPT_USERPWD => 'username:password'
));
if ($result = curl_exec($o_curl)) {
switch (curl_getinfo($o_curl, CURLINFO_HTTP_CODE)) {
case 200:
$posts = $result;
break;
case 503:
//lanzar error. Bloqueo de la petición temporalmente.
default:
//lanzar error de conexión a del.icio.us
}
curl_close($o_curl);
}

La función curl_setopt_array() setea las opciones de la petición.

  • CURLOPT_RETURNTRANSFER. Lo seteamos a TRUE para devolver el resultado como una cadena de texto que contiene el valor devuelto por la función curl_exec(), en vez de mostrar la salida directamente en la ventana del navegador.
  • CURLOPT_USERAGENT.El contenido de la cabecera "User-Agent: " enviada en las peticiones HTTP. Es un requisito de la API de del.icio.us. Por ejemplo podemos poner la url de nuestra web.
  • CURLOPT_CONNECTTIMEOUT. El número de segundos que se pueden esperar como máximo intentando establecer la conexión.
  • CURLOPT_TIMEOUT. El número máximo de segundos que cURL espera a que se ejecuten las funciones.
  • CURLOPT_USERPWD. La API requiere autenticación. Aquí seteamos el nombre de usuario y contraseña con el formato "username:password".
Con curl_getinfo obtenemos el codigo http para comprobar si ha habido algún error. Cabe destacar el error 503, devuelto cuando del.icio.us bloquea la petición por un tiempo si se realizan muchas en un corto intervalo de tiempo. Por lo que sería conveniente añadir un sistema de cache en un archivo de texto para limitar el número de peticiones. El resultado de la petición lo devuelve en formato XML, por lo que tendríamos que parsearlo para mostrarlo en nuestra web. Pero ésto ya es otro tema.

Obtención de Google Pagerank desde PHP5 usando sockets

18/07/2008
Dar a conocer este artículo: Añade este link a delicius Menea esta noticia Enviar a technorati Enviar a Digg Enviar a Wikio Enviar a yahoo
El pagerank de una página es un excelente indicador de la calidad de la misma, ya que por lo general Google asigna pageranks altos a las páginas con mejores contenidos. Utilizando PHP5 podemos obtener el pagerank de una página determinada usando el siguiente fragmento de código:

<?php

$googlehost='toolbarqueries.google.com';
$googleua='Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5';

function StrToNum($Str, $Check, $Magic) {
$Int32Unit = 4294967296;

$length = strlen($Str);
for ($i = 0; $i < $length; $i++) {
$Check *= $Magic;
if ($Check >= $Int32Unit) {
$Check = ($Check - $Int32Unit * (int) ($Check / $Int32Unit));
$Check = ($Check < -2147483648) ? ($Check + $Int32Unit) : $Check;
}
$Check += ord($Str{$i});
}
return $Check;
}


function HashURL($String) {
$Check1 = StrToNum($String, 0x1505, 0x21);
$Check2 = StrToNum($String, 0, 0x1003F);

$Check1 >>= 2;
$Check1 = (($Check1 >> 4) & 0x3FFFFC0 ) | ($Check1 & 0x3F);
$Check1 = (($Check1 >> 4) & 0x3FFC00 ) | ($Check1 & 0x3FF);
$Check1 = (($Check1 >> 4) & 0x3C000 ) | ($Check1 & 0x3FFF);

$T1 = (((($Check1 & 0x3C0) << 4) | ($Check1 & 0x3C)) <<2 ) | ($Check2 & 0xF0F );
$T2 = (((($Check1 & 0xFFFFC000) << 4) | ($Check1 & 0x3C00)) << 0xA) | ($Check2 & 0xF0F0000 );

return ($T1 | $T2);
}

function CheckHash($Hashnum) {
$CheckByte = 0;
$Flag = 0;

$HashStr = sprintf('%u', $Hashnum) ;
$length = strlen($HashStr);

for ($i = $length - 1; $i >= 0; $i --) {
$Re = $HashStr{$i};
if (1 === ($Flag % 2)) {
$Re += $Re;
$Re = (int)($Re / 10) + ($Re % 10);
}
$CheckByte += $Re;
$Flag ++;
}

$CheckByte %= 10;
if (0 !== $CheckByte) {
$CheckByte = 10 - $CheckByte;
if (1 === ($Flag % 2) ) {
if (1 === ($CheckByte % 2)) {
$CheckByte += 9;
}
$CheckByte >>= 1;
}
}

return '7'.$CheckByte.$HashStr;
}

function getch($url) { return CheckHash(HashURL($url)); }

function getpr($url) {
global $googlehost,$googleua;
$ch = getch($url);
$fp = fsockopen($googlehost, 80, $errno, $errstr, 30);
if ($fp) {
$out = "GET /search?client=navclient-auto&ch=$ch&features=Rank&q=info:$url HTTP/1.1\r\n";
$out .= "User-Agent: $googleua\r\n";
$out .= "Host: $googlehost\r\n";
$out .= "Connection: Close\r\n\r\n";

fwrite($fp, $out);

while (!feof($fp)) {
$data = fgets($fp, 128);
//echo $data;
$pos = strpos($data, "Rank_");
if($pos === false){} else{
$pr=substr($data, $pos + 9);
$pr=trim($pr);
$pr=str_replace("\n",'',$pr);
return $pr;
}
}
fclose($fp);
}
}

function pagerank($url) {
if (!preg_match('/^(http:\/\/)?([^\/]+)/i', $url)) { $url='http://'.$url; }
$pr=getpr($url);
return $pr;
}

?>

Geolocalización en PHP5 usando GeoIP de Maxmind

11/07/2008
Dar a conocer este artículo: Añade este link a delicius Menea esta noticia Enviar a technorati Enviar a Digg Enviar a Wikio Enviar a yahoo
Una de las principales ventajas de la red Internet es el alcance de la misma, ya que es posible conectarse a ella y utilizar los servicios que ofrece desde prácticamente cualquier país del mundo. Esto, que puede parecer una enorme ventaja, puede también suponer un problema a la hora de analizar con detalle el tráfico recibido en un sitio web.

Para ayudarnos en esa tarea podemos utilizar una herramienta que nos permita identificar la localidad y/o el país desde el que se producen las visitas a nuestra web. De esta forma seremos capaces de llevar a cabo acciones como esta:

  • Seleccionar automáticamente el idioma en el que se muestran los contenidos de la web en función del país de procedencia del visitante.
  • Mostrar páginas personalizadas para visitantes de diferentes regiones geográficas.
  • Preseleccionar automáticamente el país, provincia y ciudad de residencia en los formularios que precisen esa información.
Una base de datos de geolocalización es el elemento fundamental necesario para poder determinar la ubicación geográfica a partir de la dirección IP del visitante. Para el desarrollo de esta aplicación se ha utilizado la proporcionada por Maxmind que está localizable, junto con su API para PHP en la dirección http://www.maxmind.com/app/php.

El siguiente ejemplo de código muestra el procedimiento a seguir para determinar la ubicación geográfica del visitante de la página, que pasa por la obtención de la dirección IP real del visitante (sin tener en cuenta proxyes), la carga de la base de datos de geolocalización y la llamada a la función que se encarga de convertir esa dirección IP en código de pais.

<?php

include_once('geoipcity.inc');

if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$ip_address = $_SERVER["HTTP_X_FORWARDED_FOR"];
} elseif (isset($_SERVER["HTTP_CLIENT_IP"])) {
$ip_address = $_SERVER["HTTP_CLIENT_IP"];
} else {
$ip_address = $_SERVER["REMOTE_ADDR"];
}

$gi = geoip_open('GeoLiteCity.dat',GEOIP_STANDARD);
$record = geoip_record_by_addr($gi,$ip_address);
$pais = $record->country_code;

?>

Descarga de datos financieros en formato CVS

11/07/2008
Dar a conocer este artículo: Añade este link a delicius Menea esta noticia Enviar a technorati Enviar a Digg Enviar a Wikio Enviar a yahoo
Para el desarrollo del proyecto diariobolsa.com http://www.diariobolsa.com, una plataforma de consulta de información bursátil en tiempo real, se ha utilizado un mecanismo que permite llevar a cabo la descarga de los datos referentes a índices y empresas desde Yahoo Finance.

Este mecanismo se apoya en la plataforma Open Populi para abstraer el acceso a las bases de datos en las que se almacena la información de cotización de las empresas e índices.

A continuación se muestra un ejemplo en el que se realiza la carga en la base de datos de los datos referentes a la cotización de las divisas.

<?php

function get_url($url) {

$curld = curl_init();
curl_setopt($curld, CURLOPT_URL, $url);
curl_setopt($curld, CURLOPT_PORT, 80);
curl_setopt($curld, CURLOPT_VERBOSE, false);
curl_setopt($curld, CURLOPT_RETURNTRANSFER,1);
curl_setopt($curld, CURLOPT_TIMEOUT, 20);
$content = curl_exec($curld);
curl_close($curld);
return($content);
}

function __autoload($clase) {
$directorio = strtolower(str_replace('OP_','',$clase));
$fichero = "./$directorio/$clase.class.php";
include_once($fichero);
}

$fecha_actual = date('Y-m-d');

$db = OP_Database::factory('PgSql','pgsql:dbname=xx host=localhost','user','pass','');

$qrstr = "SELECT * FROM divisas WHERE divisa <> 'EUR'";

foreach ($db->executeQuery($qrstr) as $row) {
$divisa = trim($row['divisa']);
$url = 'http://es.old.finance.yahoo.com/d/quotes.csv?s=EUR'.$divisa.'=X&f=sl1d1t1c1ohgv&e=.csv';
$contenido = trim(get_url($url));
list($desc,$valor,$resto)= split(';',str_replace(',','.',$contenido));

$qrstr = "SELECT COUNT(*) AS total FROM historico_divisas WHERE ";
$qrstr .= "divisa='$divisa' AND fecha='$fecha_actual'";

$resultado_parcial = $db->executeQuery($qrstr);
$total = intval($resultado_parcial[0]['total']);
if ($total == 0) {
$qrstr = "INSERT INTO historico_divisas VALUES ";
$qrstr .= "('$divisa','$fecha_actual','$valor')"
$db->executePrepare($qrstr);
echo "$divisa:$fecha_actual:$valor\n";
} elseif ($total == 1) {
$qrstr = "UPDATE historico_divisas SET valor='$valor' WHERE ";
$qrstr .= "divisa='$divisa' AND fecha='$fecha_actual'";
$db->executePrepare($qrstr);
echo "$divisa:$fecha_actual:$valor (UPDATE)\n";
}
}


Las tablas en las que se apoya el script son la de divisas y el historico de divisas. La estructura de la primera de ellas es la siguiente:

  • divisa character(20) : Contiene el identificador de la divisa (EUR, USD, GBP, etc.)
  • descripcion character(150) : Contiene la descripción de cada divisa.
La estructura de la tabla historico_divisas es esta:

  • divisa character(20) : Contiene el identificador de la divisa (EUR, USD, GBP, etc.)
  • fecha timestamp : Fecha de actualización
  • valor numeric(10,2) : Tasa de cambio frente al Euro
Contenidos de la tabla divisas:

divisa | descripcion
--------+-------------------
EUR | Euro
USD | Dólar USA
GBP | Libra Esterlina
JPY | Yen Japonés
CHF | Franco Suizo
CAD | Dólar Canadiense
AUD | Dólar Australiano
ARS | Peso Argentino
MXN | Peso Mexicano
BRL | Real Brasileño

Ejemplo de los contenidos de la tabla historico_divisas:

divisa | fecha | valor
--------+---------------------+--------
AUD | 2008-07-18 00:00:00 | 1.63
CAD | 2008-07-18 00:00:00 | 1.59
CHF | 2008-07-18 00:00:00 | 1.62
ARS | 2008-07-18 00:00:00 | 4.80
USD | 2008-07-18 00:00:00 | 1.59
JPY | 2008-07-18 00:00:00 | 168.33
MXN | 2008-07-18 00:00:00 | 16.22
GBP | 2008-07-18 00:00:00 | 0.79
BRL | 2008-07-18 00:00:00 | 2.54
CAD | 2008-07-17 00:00:00 | 1.60
BRL | 2008-07-17 00:00:00 | 2.52
ARS | 2008-07-17 00:00:00 | 4.80
MXN | 2008-07-17 00:00:00 | 16.23
GBP | 2008-07-17 00:00:00 | 0.79
JPY | 2008-07-17 00:00:00 | 168.50
CHF | 2008-07-17 00:00:00 | 1.62
USD | 2008-07-17 00:00:00 | 1.59
AUD | 2008-07-17 00:00:00 | 1.63
USD | 2008-07-16 00:00:00 | 1.58
AUD | 2008-07-16 00:00:00 | 1.62
CHF | 2008-07-16 00:00:00 | 1.61
CAD | 2008-07-16 00:00:00 | 1.59
JPY | 2008-07-16 00:00:00 | 166.25
BRL | 2008-07-16 00:00:00 | 2.53

Live!


Instalaciones

Desgarga OP Application framework.Plataforma entorno web.Php 5

Últimas noticias RSS



Últimos scripts & snippets RSS