Переменная скорость ответа на запросы jQuery Ajax - PullRequest
1 голос
/ 12 июля 2009

Когда я выполняю асинхронный запрос с jQuery Ajax, иногда ответ возвращается быстро в течение 800 мс, иногда он медленный, а ответ возвращается в 2,50 с (avg), иногда он зависает и просто показывает загружаемые изображения. Я не уверен, что это из-за моего PHP-кода или jQuery Ajax-кода. Я отправляю некоторые значения, используя jQuery Ajax:

function get_detail_product(obj)
{       
    var id = obj.id ; 
    var $this = jQuery('#'+id); 
    var Thumb = jQuery('#Scroller div.Container') ;
    jQuery.each(Thumb , function(){
        jQuery(this).css('border' , '#ccc 2px solid');
    });
    $this.parent().css('border' , '#ff8500 2px solid') ;
    var load_area = jQuery('.detail') ;
    //ajax request 
    load_area.html("");
    load_area.html('<div id="loading" style="margin-top:60px;margin-left:350px;"><img src="../images/loading.gif"><br>Loding ... </div>');
    jQuery.ajax({
        url: 'index.php?module=product&popup=on ',
        type: 'POST',
        data: 'pid=' + id ,         
        success: function(result) {
            jQuery('#response').remove();
            load_area.html(result);
            jQuery('#loading').fadeOut(500, function() {
                jQuery(this).remove();
            });
        }
    });
}

и в файле PHP у меня есть следующий код для получения запрошенных данных:

//ajax requests 
if(isset($_POST['subcatid']) && is_numeric($_POST['subcatid']))
{
    $subcatid = $_POST['subcatid'] ;
    $products = $dbc->getAll("select * from xxproduct where xsubcatid='$subcatid'") ;
    //send result 
    echo '<table cellpadding="0" cellspacing="0" border="0" id="ScrollerTable"><tr>'; 
    foreach ($products as $p) : echo '<td><div style="border:#ccc 2px solid ; padding:0px;margin-top:20px ; margin-bottom:20px ; margin-left:8px ; margin-right:8px;" class="Container"><a href="javascript:void(0)" id="'.$p['xproductid'].'" onclick="get_detail_product(this)" ><img src="imgsize.phpw=100&h=100&img=../uploads/product/'.$p['xproductid'].'/'.$p['xproductid'].'__1.jpg" border="0"/></a><div style="background-color:#ccc ;text-align:center ; padding:5px; ">'.$p['xproductname'].'</div></div></td>';
    endforeach ;
    echo ' </tr></table>'; 
}

Интересно, можете ли вы найти какие-либо ошибки в моем коде, которые вызывают задержку; Кроме того, я использую объект PEAR DB для взаимодействия с базой данных.

Когда я набираю название моего вопроса на этой странице, предложения возвращаются примерно через 500 мс. Почему это взаимодействие ajax такое быстрое, а у меня нет?

Ответы [ 3 ]

0 голосов
/ 12 июля 2009

Возможно кэширование как в браузере, так и при любом php mem-кэшировании.

0 голосов
/ 12 июля 2009

Задержка в сети может оказать огромное влияние на ваши Ajax-звонки, особенно если одна или другая сторона не имеют постоянного интернет-соединения. Поскольку проблема кажется неустойчивой, я бы посоветовал рассматривать сеть или кэширование как вероятный источник.

0 голосов
/ 12 июля 2009

Я предполагаю, что вы получаете время отклика (800 мс - 2,5 с, которое вы упомянули) через FireBug?Если это так, то это время самого запроса.В этот момент весь ваш JS-сайт для разработчиков уже выполнен, и единственный JS, который работает, - это код jQuery в функции ajax().

Так что я думаю, вы можете быть достаточно уверены, что это ваш PHP-код.

Я бы использовал вызовы php microtime() и напрямую нажал на этот скрипт (из браузера или командной строки, а не через вызов ajax) и распечатал результат микротайма.

В частности, вы бы добавили это в начало вашего скрипта:

$start = microtime(true);

И это в конце:

echo "Time: " . (microtime(true) - $start);

Затем попытайтесь выделить то, чтопараметры / etc используются во время любых медленных запросов.Как и в большинстве случаев с приложениями CRUD, БД чаще всего является виновником.

Редактировать:

После более внимательного изучения вашего кода, нет ничего явно неправильного.Что мне интересно, так это то, что это единственный запрос с таким сумасшедшим временем ответа.Если это так, это говорит о том, что связь между вашим клиентом и сервером не является проблемой.Вот именно этот сценарий.

И выполнив то, что я упомянул выше - нажав скрипт непосредственно через браузер, а не вызов ajax, - вы можете изолировать код PHP, а затем, перемещая расположение этих операторов microtime, изолировать конкретныестроки кода.

Но если бы это был я, я бы сначала сосредоточился на этом SQL-запросе.Скорее всего, вы не используете никакого кэширования байт-кода, как APC.Это отличный инструмент, который сейчас не так широко используется.

Таким образом, единственный механизм кэширования, который использует код, это, вероятно, MySQL Query Cache.Если в поле subcatid нет индекса, возможно, MySQL выполняет сканирование таблицы.Но в следующий раз, когда вы запросите тот же самый запрос (с тем же значением подстроки), результаты будут в кеше запросов, и MySQL вернет их немедленно.

Вы можете проверить это, изолировав еще больше: забудьте код AJAX и PHP-код, просто скопируйте и вставьте этот запрос, вставьте некоторые допустимые значения подстроки и запустите его непосредственно вphpMyAdmin или MySQL CLI или ваш любимый инструмент MySQL.Если вы видите прерывистую производительность, когда вы подключаете новые и другие значения субкатода, то вы знаете, в чем заключается ваша проблема.

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