减少加载许多资源的服务器响应时间

时间:2015-12-14 20:20:56

标签: php apache performance api server

我有两个PHP脚本从API加载许多可变资源,导致响应时间长达2.2秒到4秒。关于如何缩短响应时间和提高效率的任何建议都会非常感激吗?

FIRST SCRIPT

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();
}`
  

注意:$ result等于循环中每次的HTML信息。

     

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

SECOND SCRIPT

//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();
}`
  

注意:与第一个脚本类似,大部分时间都花在获取信息上   来自二级API。

     

注意:在第二个脚本中,第一个API将替换为单个API   来自第一个脚本页面的特定变量,因此$ varlist [$ i] [&#39; id&#39;] =   $查询[&#39; ID&#39]。

     

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

1 个答案:

答案 0 :(得分:1)

您还可以从正常的页面加载中移出API调用。使用通用页面响应用户以显示正在发生的事情,然后发出ajax请求以查询API并响应数据。真的没有办法加快个人外部请求。你最好的选择是:

  1. 尽量减少请求的数量(即使这意味着您需要一次更多的数据,然后过滤掉您的一方而不是发送一小部分数据的多个请求)。
  2. 缓存所有剩余请求并从缓存中提取。
  3. 以一个小页面回复,让用户知道正在发生的事情,并对查询的数据发出单独的ajax请求。