为什么我的表格需要这么长时间才能加载

问题描述 投票:0回答:2

我有一个网站将显示用户附近的企业。它使用 Google API 来执行此操作。它首先使用雷达搜索获取附近的企业,获取 place_id 并将其保存到数据库中(稍后我将需要),然后使用地点 ID 获取有关该地点的详细信息。如果满足某些条件,则会在表格中显示结果。但是,加载需要很长时间,我正在尝试找出原因。如果信息太多,那就是它必须的方式,那么就很好,但我觉得我正在代码中做一些事情来减慢它的速度。

<?php
$xml = simplexml_load_file("https://maps.googleapis.com/maps/api/place/radarsearch/xml?location=39.53,-89.33&radius=10000&type=establishment&key=MYKEY") or die("Error: Cannot create object");
foreach($xml->result as $get)
{
if($i==7) break;
$xml2 = simplexml_load_file("https://maps.googleapis.com/maps/api/place/details/xml?placeid=" . $get->place_id . "&key=MYKEY") or die("Error: Cannot create object");
$sql = "SELECT * FROM Places WHERE GoogleID = '".$get->place_id."'";
$records = $conn->query($sql);
$grab = $records->fetch_assoc();
if($records->num_rows > 0)
{
    //yay
}
Else
{
    $MakeNew = "INSERT INTO Places (GoogleID, ConfirmedHiring) VALUES ('".$get->place_id."', 'No')";
    if(mysqli_query($conn, $MakeNew))
    {
        $records = $conn->query($sql);
        $grab = $records->fetch_assoc();
    }
}
foreach($xml2->result->address_component as $item){if($item->type == "locality"){$placecity = $item->long_name;}}
echo "<tr>";
echo "<td data-title='Business'>" . $xml2->result->name . "</td>";  
echo "<td data-title='Location'>" . $placecity . "</td>";
echo "<td data-title='Confirmed Hiring'>" .$grab["ConfirmedHiring"]. "</td>";
echo "</tr>";
$i++;
}
?>
php mysql google-places-api
2个回答
3
投票

如果您使用附近搜索而不是雷达搜索,则无需事后单独获取地点详细信息,结果将包含所有详细信息。如果这不是一个选项并且您需要进行雷达搜索,您至少可以并行执行所有详细信息请求。

类似地,您可以使用

IN
查询从数据库中选择所有匹配的记录,而不是一次选择一条记录,并且您也可以通过单个查询插入所有发现缺失的记录。

最后,如果某件事很慢,请使用分析器找出缓慢的原因;它比在互联网上询问更快、更可靠。


1
投票
  1. 避免进行数据库插入/选择。由于可能会触发 7 (+7) 个查询,因此您可以将其减少为两个查询。
 $xml = simplexml_load_file("https://maps.googleapis.com/maps/api/place/radarsearch/xml?location=39.53,-89.33&radius=10000&type=builtment&key=MYKEY") 或 die("错误:无法创建目的”);
    $places[] = 数组();
    foreach($xml->结果为$get)
    {
        if($i==7) 中断;
        $xml2 = simplexml_load_file("https://maps.googleapis.com/maps/api/place/details/xml?placeid=" . $get->place_id . "&key=MYKEY") 或 die("错误:无法创建目的”);
        $places[] = $get->place_id;
        foreach($xml2->结果->address_component as $item){if($item->type == "locality"){$placecity = $item->long_name;}}
            回声“”;
            回声“”。 $xml2->结果->名称。 “”;
            回声“”。 $地点城市。 “”;
            echo "" .$grab["ConfirmedHiring"]. “”;
            回声“”;
            $i++;
        }
        如果(计数($地点)){
            $place_ids = 内爆(",", $places)
            $sql = "从 GoogleID IN ($place_ids) 的地点中选择 $place_id";
            $records = $conn->query($sql);
            $grab = $records->fetch_array();
            如果(计数($抢)){
                $new_place_ids = array_diff($place_ids, $grab)
            } 别的 {
                $new_place_ids = $place_ids;
        }
        $sql_values = "";
        foreach($new_place_ids 为 $index => $place_id)
        {
            if (!$sql_values) $sql_values .= ","
            $sql_values .= ('".$get->place_id."', '否')
        }
        如果($sql_values!=“”){
            $MakeNew = "插入地点(GoogleID、ConfirmedHiring)值 $sql_values";
            if(mysqli_query($conn, $MakeNew))
            {
                $records = $conn->query($sql);
                $grab = $records->fetch_assoc();
            }
        }
    }


  1. 将 xml 响应存储到文件中,并在服务器中缓存 24 小时。这样你就可以避免进一步的打击。在访问 Google 之前,您可以检查该文件是否存在以及是否不早于 24 小时。 而不是下面的
 $xml2 = simplexml_load_file("https://maps.googleapis.com/maps/api/place/details/xml?placeid=" . $get->place_id . "&key=MYKEY")
//做这个
    $contents= get_content("uploadfolder/".$get->place_id, "https://maps.googleapis.com/maps/api/place/details/xml?placeid=" . $get->place_id . "&key=我的钥匙”);

参考 - 如何在 https://davidwalsh.name/php-cache-function

获取 get_content 函数定义
© www.soinside.com 2019 - 2024. All rights reserved.