En el apartado (buscar de Forma automática el cambio de Divisa (I) , nos quedamos en la instrucción fsockopen() devuelve un puntero a fichero, el cual se puede usar junto con las otras funciones de ficheros (como fgets(), fgetss(), fputs(), fclose(), feof()).
Voy a colgar el programa en PHP que está funcionando desde hace muchos meses sin dar ningún tipo de error para localizar el cambio de divisa desde un Hosting con la instrucción fsockopen()
El programa php currency_class.php es una clase y la he llamado currency_class.php, ire comentando casi todas las instrucciones para su mejor comprensión.
PROGRAMA REALIZADO PARA PHP LLAMADO CURRENCY_CLASS.PHP SIENDO LA CLASE Currency.
<?php
/**
* @version $Id: currency_class.php
* @package mvmphp
* @copyright Copyright (C) 2009
* @comment Clase Currency (Buscar Valor de la Divisa)
*/
class Currency {
// Por defecto para toCurr es USD = Dólares y fromCurr es EUR = Euros
public $toCurr = ‘USD’;
public $fromCurr = ‘EUR’;
// Constructor de la Clase, si los parametros a pasar son diferentes de null, pasamos los valores a las variables de la clase
function __construct($p_curr=null, $p_from=null) {
if ($p_curr != null ) $this->toCurr = $p_curr;
if ($p_from != null) $this->fromCurr = $p_from;
$this->toAmount = 1; // Valor es siempre 1
}
/**
* Busca mediante la tecnica del Socker del puerto 80 en google el valor de la divisa
* Si es correcto devuelve una página para después localizar el cambio de la divisa
*/
function getCurrencyGoogle() {
$host = ‘www.google.com’;
$page = ‘/search?&q=’.$this->toAmount.’+’.$this->toCurr.’+in+’.$this->fromCurr;
$file_info = »; $get_info = false; $returnHtml = array(); $t_d=»;
# Open Socker (Google) y search con las dos divisas con valor 1
if ($fsock = @fsockopen($host, $port=80, $errno, $errstr, $timeout=15))
{
# Pagina y valores a buscar en el servidor
@fputs($fsock, «GET $page HTTP/1.1\r\n»);
# DNS o IP del Host
@fputs($fsock, «HOST: $host\r\n»);
# Tipo de Conexion y cierre
@fputs($fsock, «Connection: close\r\n\r\n»);
while (!@feof($fsock))
{
# A partir de la Segunda Lectura grabamos la informacion en $file_info para su posterior tratamiento
if ($get_info) $file_info .= @fread($fsock, 1024);
else
{
# Por primera vez eliminamos la cabecera y controlamos errores de conexion
$line = @fgets($fsock, 1024);
if ($line == «\r\n») $get_info = true;
else if (stripos($line, ‘404 not found’) !== false)
{
$errstr = ‘FILE_NOT_FOUND’ . ‘: ‘ . $host . $page;
error_log_event(‘ Currency 01-Error : ‘,$errstr );
return false;
}
}
}
@fclose($fsock);
}
else
{
if ($errstr) { $errstr = utf8_convert_message($errstr);
error_log_event(‘ Currency 02-Error : ‘,$errstr );
return false; }
else { $errstr = ‘FSOCK_DISABLED’;
error_log_event(‘ Currency 03-Error : ‘,$errstr );
return false; }
}
# Si es todo correcto en $file_info tenemos la pagina que nos devuelve el servidor, para poder extraer los datos
# realizamos un preg_match_all (Funcion Regular del PHP)
if ($file_info !=»)
preg_match_all(‘/<h2(.*)\<\/h2\>/Uis’, $file_info, $returnHtml, PREG_PATTERN_ORDER);
# Si existe la matriz $returnHtml es porte hemos encontrado el texto y su valor
if (isset($returnHtml[0][0])) {
# Quitamos todas las etiquetas html con la funcion strip_tags
$gRate = strip_tags($returnHtml[0][0]);
# Separamos el texto inicial y el valor de la divisa mediante la funcion explore;
$t_vd = explode( ‘=’, $gRate );
# Rastreamos los caracteres 0 a 9 y el . en segundo valor del vector $t_vd para localizar el valor del cambio
for ($i=0;$i<strlen($t_vd[1]);$i++) {
$t_chr = substr($t_vd[1],$i,1);
if ($t_chr >= ‘0’ && $t_chr <= ‘9’) $t_d .= $t_chr;
elseif ($t_chr == ‘.’ ) $t_d .= $t_chr;
elseif ($t_d != ») break ;
}
}
if ($t_d == » ) { $errstr = ‘No existe la Moneda de Cambio :’.$this->toCurr.’ From : ‘.$this->fromCurr;
error_log_event(‘ Currency 04-Error : ‘ , $errstr );
return false;
}
# Si todo el esfuerzo es correcto en la variable $t_d tenemos ya el cambio de Moneda.
$t_d = (float) round($t_d, 5);
return $t_d;
}
}
?>
En el programa cuando existe un error, lo envio a una funcion que graba en un fichero el tipo de error con un evento . Ejemplo : error_log_event(‘ Currency 04-Error : ‘ , $errstr ); , vosotros podeís colocar un echo y ver todo su funcionamiento con los errores.
Para llamar a la clase es de la siguiente forma :
Comprobamos que las dos divisas son diferentes (Ejemplo USD y EUR), después creamos el objeto $converter indicando las dos divisas a buscar el cambio, una vez creado el objeto llamanos a getCurrencyGoogle y nos devuelve el cambio de moneda.
if ( $p_curr != $p_from ) {
$converter = new Currency( $p_curr , $p_from );
$conver = $converter->getCurrencyGoogle();
if ($conver == false) $conver = 1;
}
Saludos y hasta la proxima ….