使用PHP向Google Complete API发出多个请求时提高了效率

时间:2011-12-04 13:27:22

标签: php performance

我正在使用Google Complete API寻找一种快速方法来获取各种问题前缀的前26个最常搜索字词 - 每个字母对应一个字母。

我不认为自己是程序员,但这似乎是一项有趣的任务!

我的脚本在本地工作正常但在我的共享服务器上花了太长时间并且在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);
}

?>

我还写了几行将问题提交给Yahoo Answers API,虽然它使得结果花费的时间更长,但我无法通过API完全匹配搜索词,所以我得到了一个回答奇怪的答案!

基本上,上面的代码是多次调用API的最有效方法吗?

谢谢,

2 个答案:

答案 0 :(得分:2)

你应该使用用户视角来重新研究这个问题,问问自己,

您是否要等待30秒才能加载网页?
显然你不想要

如何让网页加载速度更快?
您依赖外部资源(google api)
而不是只调用一次,而是异步调用26次

因此,如果您同步更改上述内容,
总时间从26减少到1(带有网络带宽的费用)

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

如果你完成了上述工作, 你花在外部资源上的时间可能减少高达95%

这还不错吗?
显然尚未

对外部资源的任何调用都不可靠,即使是google 如果网络关闭,DNS无法解析,您的网页也会下降

如何预防?
你需要缓存,基本上逻辑是: -

  • 搜索现有缓存(如果找到),从缓存中返回
  • 如果没有,请同步查询google api(从a到z)
  • 将结果存储到缓存
  • 返回结果

然而,按需处理仍然不理想(第一个用户发出请求必须等待最长时间),
如果你知道用户输入的排列(希望不是那么大),
您可以使用调度程序(cronjob)定期从google api中提取结果,
并在本地存储结果

答案 1 :(得分:0)

我建议使用cron作业进行此类工作。这样,您既可以使用参数更改最大执行时间,也可以将工作拆分为多个操作,并使cron作业更加规则地运行,从而逐个运行一个操作。