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()).

En el apartado (Buscar de Forma automática el cambio de Divisa (II), vimos un programa en PHP que realizaba un búsqueda en Google,  recuperaba una página con la divisa y se extraía el valor de la divisa.

Mi experiencia en buscar el valor de la divisa en google, es buena pero mejor localizar el cambio de la divisa en sitios donde nos den más garantías, por ejemplo en Europen Center Bank.

En la página web del banco, podemos recuperar un fichero en formato xml y después tratarlo con un programa PHP.

La forma de recuperar el fichero es por mediación de la instrucción fsockopen() igual que en el post de la segunda parte, pero la diferencia de éste es que nos traemos un fichero xml y en el post anterior una página html.

El programa lo he realizado mediante una librería Open Source llamada DOMIT, el motivo es porque tengo un montón de programas integrados con dicha librería y de paso también veis la conexión con dicho software.

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.

class Currency {
public $decimal  = 5;
function __construct($p_decimal) {
if($p_decimal != 0)    $this->decimal = $p_decimal;
}

function getCurrencyXMLECB() {

$host     = ‘www.ecb.europa.eu’;                                        // Host
$page     = ‘/stats/eurofxref/eurofxref-daily.xml’;   // Pagina y fichero xml
$type     = ‘text/xml’;                                                             // Tipo fichero
$supplier = ‘European Central Bank’;                             // Nombre de la compañia
$t_time   = ”;                                   // Fecha del cambio divisa
$t_data   = array();                     // Matriz de todas las divisas y valor (Datos)
# Open Socker (ECB);
$file_info = ”;                                                                         // Fichero xml
$get_info = false;                                                                 // Variable primera lectura
# Open Socker (ECB)
if ($fsock = @fsockopen($host, $port=80, $errno, $errstr, $timeout=15)) {
# Pagina y valores a buscar en el servidor
$out = “GET $page HTTP/1.1\r\n”;
# DNS o IP del Host
$out .= “HOST: $host\r\n”;
# Tipo de Conexion y cierre
$out .= “Connection: close\r\n\r\n”;
@fputs($fsock, $out);
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;
echo(‘ Currency 01-Error : ‘ . $errstr );
return false;
}
}
}
@fclose($fsock);
}
}
# Si es todo OK en la variable $file_info tenemos el fichero eurofxref-daily.xml
# Libreria Domit (leer de forma muy rapida el fichero xml)
# en la Constante MPATH_LIBRARIES Colocamos la ruta de la libraria y Clase DOMIT
# Realizamos un requiere_once del xml_domit_lite_include.php
require_once( MPATH_LIBRARIES.’domit/xml_domit_lite_include.php’ );
# Creamos la clase y parse del fichero $file_info
$xmlDoc =& new DOMIT_Lite_Document();
if( !$xmlDoc->parseXML( $file_info, false, true ) ) return false;
# Extraemos la etiqueta Cube
$currency_list = $xmlDoc->getElementsByTagName( “Cube” );
// Leemos todas las etiquetas Cube para localizar la fecha, divisa y valor de la divisa
for ($i = 0; $i < $currency_list->getLength(); $i++) {
$currNode =& $currency_list->item($i);
// Preguntamos si el atributo es time = fecha Cambio divisa
if ($currNode->getAttribute(“time”) ) $t_time = $currNode->getAttribute(“time”);
// Preguntamos si el atributo es una divisa
elseif ($currNode->getAttribute(“currency”)) {
// Pasamos la divisa a $currency
$currency = $currNode->getAttribute(“currency”);
// Pasamos el Valor a $rate
$rate = $currNode->getAttribute(“rate”);
// Grabamos en una matriz $t_data con indice $currency y valor $rate
if ( $rate > 0 ) { $t_data[$currency]=round($rate,$this->decimal);
}
unset( $currNode );
} // end function convertecb
return $t_data;
}
}

// ———————————————————————–

Creamos el objeto $change indicando los decimales a extraer de la moneda del fichero xml, una vez creado el objeto llamamos a getCurrencyXMLECB y nos devuelve false (Si no ha recuperado las divisas) o una matriz con todas las divisas con sus valores.

$change  = new Currency($decimal=4);
$conver    = $change-> getCurrencyXMLECB(); 

Deja un Comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *