Optimización de cálculos financieros en PHP y Flash

  • Autor Autor ramonjosegn
  • Fecha de inicio Fecha de inicio
ramonjosegn

ramonjosegn

Sigma
Verificación en dos pasos activada
Verificado por Whatsapp
Hola

Diseñé una calculadora la cual estoy adaptando a las nuevas necesidades de los exchangers que realizamos, la calculadora funciona del siguiente modo:

a) toma variables de yahoo finance (horas de investigación)
b) toma datos bancarios de otro sitio web -ya que ese dato no lo da Yahoo Finance-
(gracias a un programador de forobeta)

c) imprime estos datos en el archivo php
d) los datos se cargan en flash (es lo único que sé programar, de php no sé nada), y se ejecutan las operaciones necesarias

el problema es que mientras Flash es instántaneo, PHP, para tomar las variables de Yahoo Finance e imprimirlas se demora a veces varios minutos

me gustaría saber si existe alguna forma de optimizar el código o conseguir que PHP cargue los datos de forma más rápida desde Yahoo Finance y la otra página de tipos bancarios

si fuera necesario pego acá el código pHP

gracias
 
Trabajar con XML es mas rápido en la mayoría de los casos, pero no sé a ciencia cierta hasta donde te dejan tomar datos de las entidades bancarias o yahoo.
 
Pero cuantas funciones estas utilizando para pedir los datos de YF.
 
Pasar de Yahoo Finance a XML es algo muy complicado creo yo, no encontré información al respecto

Yahoo finance dispone de una cantidad impresionante de variables para tomar, con respecto a los bancos tienen prohibido tomar datos financieros de sus sitios web, pero yo no los tomé de un banco, sino de un sitio web informativo, escaneando el sitio web que fue lo que le propuse al programador (claro que si cambian la página se perderá el código, soy consciente, pero así no robo variables ni programación)

Cuántas funciones? Ni idea, pego el código para ver si me podéis ayudar mejor:

PHP:
<?php

$contenido= file_get_contents("http://www.preciodolar.com/precio-del-dolar-en-mexico");
preg_match_all("|<td(.*)</td>|sU", $contenido, $datos);
$d = explode("&nbsp;", strip_tags($datos[0][93]));
$convers1 = str_replace("$","",$d[0]);
$convers1 = str_replace("\n","", $convers1);
$convers1 = str_replace("\r","", $convers1);

$url2 = 'http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s=MXNUSD=X';
$handle2 = @fopen($url2,'r');
if ($handle2) {
$result2 = fgets($handle2, 4096);
fclose($handle2);
}
$zarray2 = explode(',',$result2);

$url = 'http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s=USDMXN=X';
$handle = @fopen($url,'r');
if ($handle) {
$result = fgets($handle, 4096);
fclose($handle);
}
$zarray3 = explode(',',$result);

echo "&convers1=$convers1&convers2=$zarray2[1]&convers3=$zarray3[1]";
?>
las variables que usa Yahoo se pueden consultar en el siguiente enlace:

Yahoo data download
(existen otros por supuesto)

alguna idea, sugerencia o motivo por el que el código no esté corriendo fluido?

pd: ahora me quedé dudando si de pronto será el paso de PHP a flash lo demorado...
 
Última edición:
Has pensado en tener tu BBDD y meter manualmente los datos?
 
Creo que te conviene, es hacer a lo largo del código, indicadores de que ese código ya se procesó. Para ver los tiempos de demora (y normalmente ayuda a ver errores).

Pero dudo que te sirva en este caso, algo tan fácil como imprimir carteles de "Etapa I" etc.. Tendrías que buscar al forma. Eso es lo que yo hago cuando programo y tengo problemas.


Saludos!
 
Has pensado en tener tu BBDD y meter manualmente los datos?
claro que sí, todos los días por la nochem, a la hora justa del cierre de mercados de valores, tendría que meter el dato del valor del dólar para compra según Yahoo Finance, de venta de Yahoo Finance, de compra de Banorte, de venta de Banorete, de compra y venta de Moneygram, de compra y venta de Western Union... creo que no me saldría muy bien la bromita...

Creo que te conviene, es hacer a lo largo del código, indicadores de que ese código ya se procesó. Para ver los tiempos de demora (y normalmente ayuda a ver errores)

en el archivo PHP?
 
En eso ya me mataste 🙁 Por ejemplo, la etapa I sería donde toma los datos. Cuando se completa esto, podrías hacer que imprima algo (si es que se puede) un texto, una palabra, lo que sea. Y cuando termina de pasar a Flash, que se imprima otra cosa. Entonces, si tarda en imprimir "Etapa I" es que tarda al obtener los datos. Si imprime "Etapa I" pero tarda en la II. El porblema sería al pasar a Flash.

Me explico ? Lástima que mucho más no te puedo ayudar, recién el mes que viene empiezo el seminario de PHP en la facu 🙁
 
debería cambiar "echo" por "print"? alguien sabe la diferencia de velocidad entre ambos para procesar el resultado?

En eso ya me mataste Me explico ? Lástima que mucho más no te puedo ayudar, recién el mes que viene empiezo el seminario de PHP en la facu 🙁

realmente al pasar los datos a CSV directamente no se demora mucho (los datos se imprimen en un csv, que se puede descargar online, no voy a dar el dato para evitar más hackeos en el sitio web), creo que es posible que el problema sea del sitio web de Yahoo Finance, porque hoy sólo se está demorando unos 5 segundos, aún así me parece un tiempo exagerado para enviar un número de un archivo a otro...

va a ser que no es cosa del echo... Usos de print() y echo() | BaluArt.net

acá está la versión antigua para que podáis comprobar la demora: Enlace eliminado (estoy trabajando en nueva versión, por eso quería aprovechar y optimizar el código de una vez)
 
Última edición:
Hola, lo que debes hacer (me extraña que nadie lo haya sugerido :S) es cachear esa información en tu servidor, entonces solo una vez por día (o 3 o 4 veces, o las que quieras) tu sitio se conecta a los servidores, el resto de las veces el resultado será instantáneo.

Cualquier cosa me avisas y te ayudo, aunque no lo creas me es mas difícil explicarlo que hacerlo.
 
Actualmente estamos usando Cloudflare para cachear contenido, pero sólo para wordpress, no sé muy bien cómo podría cachear contenido en PHP o desde flash, para no volver a hacer la petición a Yahoo Finance... o sea, no sé muy bien desde dónde podría cachear el contenido, flash de por sí se cachea solo..
 
Cada vez que la calculadora "solicita" la información al servidor, el servidor corre un proceso PHP, el proceso PHP se conecta al servidor de yahoo y otros servidores, descarga la información de esos servidores, la procesa y la envía como respuesta a la aplicacion flash.

Lo que deberías hacer es que PHP se conecte una vez por día (a las 00:00 horas por ejemplo), descargue la información de los servidores de yahoo y otros, y esa información la guarde en un archivo de texto en tu propio servidor.

Entonces, durante el resto del día, cada vez que la calculadora le solicite a tu servidor esa información, tu servidor en lugar de conectarse a los servidores de yahoo y otros (lo cual tomaría demasiado tiempo), directamente abre el archivo que tiene almacenado en tu propio servidor, lo cual es instantáneo.
 
ok, ya entendí el proceso, pero no sé cómo podría hacer eso, realmente el archivo csv efectivamente siempre se genera con cada petición, pero no sé cómo hacer para guardarlo en el servidor... existe una instrucción php o algo similar para poder copiar el documento al servidor?

si alguien sabe hacerlo que avise, estoy dispuesto a pagar (enviar MP, acá no es sección de servicios)
 
Última edición:
Pueden ser muchas cosas, para empezar yo probaría con esto:

  • Usaría cURL en vez de fopen.
  • Cambiar las expresiones regulares (preg_match_all) por XPath
  • Usar proxies para hacer las consultas

No queda claro cuál es el problema con PHP. Quizá alguna configuración como el modo seguro puedan interferir en tu código.
 
Gracias Alan, lo cierto es que estos días ha estado corriendo bien (unos 3 segundos en la carga desde Yahoo Finance), por lo que creo que es saturación de solicitudes a la base de datos de Yahoo Finance
Un chico del foro me está desarrollando un script para cachear los resultados, espero que funcione
Con respecto a tus otros consejos, veré si son optimizables (y pagables)
Gracias
 
anda frenando el codigo en diferentes lugares y con el firebug o con el debug de chrome fijate cuanto tarda en cargar hasta esa parte, de esa forma vas a ver que es lo que demora...
Saludos
Cristian.
 
ok, no sé muy bien cómo mirarlo con Firebug, pero sí he visto que hay como 3 peticiones y tiene una demora de unos segudos cada una, aparte de que Cloudflare está interfiriendo (no sé si para bien o para mal), me tocaría meterlo en excepciones del plugin (si es que es posible), para ver cómo le afecta....
 
Atrás
Arriba