2017-05-06 34 views
2

我使用谷歌财务计算器来转换货币。我必须转换atleast = 2000数字一次转换。下面我在数组中只设置了10个数字。当我运行这个代码时,它运行良好,但它花费的时间太多。当我尝试使用大约5000个数字时,它有时会超时错误。任何人都可以帮助我如何使用我的代码修改大量数据。谢谢。以下是我目前使用的代码。谷歌货币转换器API的大量数据

$amounts= array(10, 20, 30, 40, 50, 60, 70, 80, 90, 100); 
$from_Curr ='USD'; 
$to_Curr = 'THB'; 
$convertedCurrency = convertCurrency($amounts, $from_Curr, $to_Curr); 
print_r($convertedCurrency); 

function convertCurrency($amounts= array(), $from, $to){ 
    $convertedCurrency = array(); 
    foreach ($amounts as $amount) { 
     $url = "https://www.google.com/finance/converter?a=$amount&from=$from&to=$to"; 
     $data = file_get_contents($url); 
     preg_match("/<span class=bld>(.*)<\/span>/",$data, $converted); 
     $converted = preg_replace("/[^0-9.]/", "", $converted[1]); 
     array_push($convertedCurrency, round($converted, 3)); 
    } 
    return $convertedCurrency; 
} 

回答

2

让我们想象一下一个请求将在50ms内anwered,你可以自己做计算的5000个请求......

变化接近问题的方法:汇率是线性的,所以你只需要一个答案,你可以在没有API的情况下进行交换计算。乘法操作比API请求快得多。向的API的1美元的计数器的值,然后通过将得到的值乘以每美元量:

$amounts = array(10, 20, 30, 40, 50, 60, 70, 80, 90, 100); 

$from_Curr = 'USD'; 
$to_Curr = 'THB'; 

$convertedCurrency = convertCurrency($amounts, $from_Curr, $to_Curr); 
print_r($amounts); 
print_r($convertedCurrency); 

function convertCurrency($amounts = array(), $from, $to) { 
    $convertedCurrency = array(); 
    $amount = 1; 

    $url = "https://finance.google.com/finance/converter?a=$amount&from=$from&to=$to"; 
    $data = file_get_contents($url); 
    preg_match("/<span class=bld>(.*?)<\/span>/", $data, $converted); 
    $converted = preg_replace("/[^0-9.]/", "", $converted[1]); 

    foreach ($amounts as $amount) { 
     $convertedCurrency[] = $amount * $converted; 
    } 

    return $convertedCurrency; 
} 

旁注:(?*)改变了正则表达式到非贪婪匹配,如果跨度被添加在页面中的页面。

+0

,虽然这是需要时间,但这次没有响应时间。谢谢 – nas

+1

@nas很高兴帮助。您仍然需要时间向API发出一个请求:通常在100-150ms内回答。你不能为此做很多事情。之后,5000个计算将快速完成。所花费的时间花在其他操作上,比如设置页面并将数据发送到浏览器...... – Zimmi

1

您正在使用免费服务吗?这可能是你得到超时错误的原因。 请求服务响应是有限制的,这就是为什么当达到该限制时出现错误。 EI多少个请求在一段时间

一个特定时期

你要么寻找一个付费服务,可以进你的要求(一次5000级的响应)

或更改您的要求在较小的次数(较少比5000 )。

对于代码本身,我知道foreach被认为是慢的,试试另一个循环解决方案。

+0

是的,我正在使用免费的。我尝试使用列表时,它在处理上有一些改进,但响应超时仍然存在 – nas

+0

很难判断延迟是来自响应时间还是来自代码。 fyi你可以试试这个免费的API,看看它是否有所作为每小时最多100个请求。 –

+0

非常感谢。我会记住你的记事 – nas