Повышена эффективность при выполнении нескольких запросов к Google Complete API с PHP - PullRequest
1 голос
/ 04 декабря 2011

Я играл с 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);
}

?>

Я такженаписал несколько строк, которые поставили вопрос в API ответов Yahoo, который работал довольно хорошо, хотя это делало результаты более длительными, и я не мог точно подобрать условие поиска через API, поэтому я получил несколько странных ответов!

По сути, является ли приведенный выше код наиболее эффективным способом вызова API несколько раз?

Спасибо,

Rich

Ответы [ 2 ]

2 голосов
/ 04 декабря 2011

Вам следует использовать пользовательскую перспективу, чтобы пересмотреть эту проблему, спросите себя:

Не хотите ли подождать 30 секунд для загрузки веб-страницы?
Очевидно ты не хочешь

Как я могу ускорить загрузку страницы?
Вы зависите от внешнего ресурса (google api)
, а не просто звонитеодин раз, но 26 раз асинхронно

Итак, если вы измените вышеприведенное синхронно,
общее время уменьшится с 26 до 1 (с учетом расходов на пропускную способность сети)

Посмотритена http://php.net/manual/en/function.curl-multi-exec.php,
вот первый шаг оптимизации

Если вы сделаете вышеуказанное,
ваше время, потраченное на внешний ресурс, может сократиться до 95%

Будет ли это достаточно хорошо?
Очевидно, еще нет

Любой вызов на внешний ресурс не является надежным, даже если Google
, если сеть не работает, DNS не разрешен,ваша страница тоже падает

Как это предотвратить?
Вы нуждаетесьed кеш, в основном логика такова: -

  • поиск существующего кеша, если он найден, возврат из кеша
  • , если нет, запросить google api синхронно (от a до z)
  • сохранить результат в кеше
  • вернуть результат

Однако процесс по требованию все еще не идеален (первый пользователь должен выполнить запрос дольше всего),
если вам известна перестановка пользовательского ввода (надеюсь, не такая уж и большая),
вы можете использовать планировщик (cronjob) для периодического извлечения результата из Google API,
и сохранения результата локально

0 голосов
/ 04 декабря 2011

Я рекомендую использовать задания cron для такой работы.Таким образом, вы можете либо изменить максимальное время выполнения с помощью параметра, либо разбить работу на несколько операций и более регулярно запускать задание cron для выполнения одной операции за другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...