2017-05-06 104 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