2011-12-04 19 views
1

我正在玩Google Complete API,尋找一種快速方法來獲取各種問題前綴中搜索最多的26個最常用術語 - 每個字母一個字母。使用PHP向Google Complete API發出多個請求時提高了效率

我不會把自己算作程序員,但它看起來像一個有趣的任務!

我的腳本在本地工作正常,但它在我的共享服務器上花費太長時間,並在30秒後超時 - 並且由於共享,我無法訪問php.ini以延長最長執行時間。

這讓我不知道是否有發出請求到API的一個更有效的方法,這裏是我的代碼:

<?php 

$prep = $_POST['question']; 

for($i=0;$i<26;$i++){ 

    $letters = range('a','z'); 
    $letter = $letters[$i]; 
    $term = $prep . $letter; 

    if(!$xml=simplexml_load_file('http://google.com/complete/search?output=toolbar&q=' . $term)){ 
     trigger_error('Error reading XML file',E_USER_ERROR); 
    } 
    do{ 
     $count = 1; 
     $result = ucfirst($xml->CompleteSuggestion->suggestion->attributes()->data); 
     $queries = number_format((int)$xml->CompleteSuggestion->num_queries->attributes()->int);     
     echo '<p><span>' . ucfirst($letter) . ':</span> ' . $result . '?</p>'; 
     echo '<p class="queries">Number of queries: ' . $queries . '</p><br />'; 

    } while ($count < 0); 
} 

?> 

我還寫道,餵養問題到雅虎問答的幾行API工作得很好,雖然它使結果花費更長時間,但我無法通過API在搜索詞上進行完全匹配,所以我得到了一些奇怪的答案!

基本上,上面的代碼是多次調用API的最有效方式嗎?

感謝,

豐富

回答

2

你應該使用用戶的角度來重新考慮這個問題,問自己,

你會喜歡等待30秒,網頁加載?
顯然你逼債想

我怎樣才能使網頁加載速度更快?
你依賴於外部資源(谷歌API)
並不僅僅是調用一次,但異步26倍

所以,如果你改變上述同步,
總時間縮短形式26 1 (與網絡帶寬的費用)

看看http://php.net/manual/en/function.curl-multi-exec.php
這裏是優化的第一步

如果得到上面完成的,
您花在外部資源上的時間可能會減少高達95%

這會好嗎?
顯然尚未

到外部資源的任何調用是不可靠的,甚至是谷歌
如果網絡中斷,DNS無法解析,頁面會降得

如何防止?
你需要緩存,基本邏輯是: -

  • 搜索現有的緩存,如果找到了,從緩存中返回
  • 如果沒有,查詢谷歌API同步(從A到Z)
  • 店結果到緩存
  • 返回結果

然而,按需過程仍不理想(第一用戶發出請求必須等待最長的),
如果你知道用戶輸入的置換(但願不是那麼大),
你可以使用一個調度程序(的cronjob)定期拉從谷歌API造成的,
和本地存儲結果

+0

我已經做了一些閱讀和聽起來就像只會做的伎倆!感謝詳細的回答:) – RichieAHB

0

我建議使用cron作業進行這方面的工作。通過這種方式,您可以使用參數更改最大執行時間,也可以將工作分解爲多個操作,並更加規律地運行cron作業以逐個運行一個操作。