2015-12-14 62 views
1

我有两个PHP脚本正在从API加载许多可变资源,导致响应时间长达2.2秒到4秒。如何减少响应时间和提高效率的任何建议将非常感激?减少服务器响应时间加载许多资源

第一个脚本

require('path/to/local/API_2'); 

//Check if user has put a query and that it's not empty 
if (isset($_GET['query']) && !empty($_GET['query'])) { 
    //$query is user input 
    $query = str_replace(" ", "+", $_GET['query']); 
    $query = addslashes($query); 

    //HTTP Request to API_1 
    //Based on $query 
    //Max Variable is ammount of results I want to get back in JSON format 
    $varlist = file_get_contents("http://ADRESS_OF_API_1.com?$query&max=10"); 

    //Convert JSON to Array() 
    $varlist = json_decode($varlist, true); 

    //Initializing connection to API_2 
    $myAPIKey = 'KEY'; 
    $client = new APIClient($myAPIKey, 'http://ADRESS_OF_API_2.com'); 
    $Api = new API_FUNCTION($client); 

    $queries = 7; 
    //Go through $varlist and get data for each element in array then use it in HTML 
    //Proccess all 8 results from $varlist array() 
    for ($i = 0; $i <= $queries; ++$i) { 

     //Get info from API based on ID included in first API data 
     //I don't use all info, but I can't control what I get back. 
     $ALL_INFO = $Api->GET_FUNCTION_1($varlist[$i]['id']); 

     //Seperate $ALL_INFO into info I use 
     $varlist[$i]['INFO_1'] = $ALL_INFO['PATH_TO_INFO_1']; 
     $varlist[$i]['INFO_2'] = $ALL_INFO['PATH_TO_INFO_2']; 

     //Check if info exists 
     if($varlist[$i]['INFO_1']) { 
     //Concatenate information into HTML 
      $result.=' 
       <div class="result"> 
        <h3>'.$varlist[$i]['id'].'</h3> 
        <p>'.$varlist[$i]['INFO_1'].'</p> 
        <p>'.$varlist[$i]['INFO_2'].'</p> 
       </div>'; 
     } else { 
      //In case of no result for specific Info ID increase 
      //Allows for 3 empty responses 
      ++$queries; 
     } 
    } 
} else { 
    //If user didn't enter a query, relocates them back to main page to enter one. 
    header("Location: http://websitename.com"); 
    die(); 
}` 

注:$结果等于从角落找寻每一次循环中的HTML信息。

注意:几乎所有的时间都花在for ($i = 0; $i <= 7; ++$i) 循环中。

第二个脚本

//Same API as before 
require('path/to/local/API_2'); 

//Check if query is set and not empty 
if (isset($_GET['query']) && !empty($_GET['query'])) { 
    //$query is specific $varlist[$i]['id'] for more information on that data 
    $query['id'] = str_replace(" ", "+", $_GET['query']); 
    $query['id'] = addslashes($query['id']); 

    //Initializing connection to only API used in this script 
    $myAPIKey = 'KEY'; 
    $client = new APIClient($myAPIKey, 'http://ADRESS_OF_API_2.com'); 
    $Api = new API_FUNCTION($client); 

    $ALL_INFO_1 = $Api->GET_FUNCTION_1($query['id']); 
    $query['INFO_ADRESS_1.1'] = $ALL_INFO_1['INFO_ADRESS_1']; 
    $query['INFO_ADRESS_1.2'] = $ALL_INFO_2['INFO_ADRESS_2']; 
    $ALL_INFO_2 = $Api->GET_FUNCTION_2($query['id']); 
    $query['INFO_ADRESS_2.1'] = $ALL_INFO_3['INFO_ADRESS_3']; 
    $ALL_INFO_3 = $Api->GET_FUNCTION_3($query['id']); 
    $query['INFO_ADRESS_3.1'] = $ALL_INFO_4['INFO_ADRESS_4'];    
    $ALL_INFO_4 = $Api->GET_FUNCTION_4($query['id']); 
    $query['INFO_ADRESS_4.1'] = $ALL_INFO_5['INFO_ADRESS_5']; 
    $query['INFO_ADRESS_4.2'] = $ALL_INFO_6['INFO_ADRESS_6']; 
    $ALL_INFO_5 = $Api->GET_FUNCTION_5($query['id']); 
    $query['INFO_ADRESS_5.1'] = $ALL_INFO_7['INFO_ADRESS_7']; 
} 

$result = All of the $query data from the API; 
} else { 
    //If no query relocates them back to first PHP script page to enter one. 
    header("Location: http://websitename.com/search"); 
    die(); 
}` 

注:Similiarly的第一个脚本,大部分时间都花在正从次级API信息 。 $ varlist [$ i] ['id'] = $ query ['id']。注意:在第二个脚本中,第一个API由第一个脚本页面中的单个 特定变量替换,因此$ varlist [$ i] ['id'] = $ query ['id']。

注意:同样,$ result是HTML数据。

+1

API响应多长时间一次?我的意思是,如果这就像是你正在拉的新闻馈送,它不会经常改变。您可以使用cron来拉取和缓存请求,然后从缓存副本中提取。 –

+0

API响应在查询更改时发生更改,这是非常频繁的。尽管可能值得花时间查看是否有某些更常见的查询。 – John

+1

如果API2有一个可以获取多个结果的方法,那么您可以将http请求从8减少到2.除此之外,还可以缓存您所能做的所有事情。如果你仍然不能缩短时间,请确保你异步地调用这个代码(例如使用ajax),这样你可以向用户显示一些建议进度的信息(微调器,进度条等) – Steve

回答

1

您也可以将API调用从正常的页面加载移出。用普通页面回应用户,以显示正在发生的事情,然后发出ajax请求来查询API并响应数据。真的没有办法加速个别的外部请求。最好的办法是:

  1. 尽量减少请求数量(即使这意味着你要求多一点的数据一次,然后筛选出在你身边VS发送多个数据请求的一小部分)。
  2. 缓存任何剩余的请求并从缓存中提取。
  3. 响应一个小页面,让用户知道正在发生的事情,并为查询的数据分别发出ajax请求。
相关问题