Как предотвратить передачу на стороне сервера AJAX?

Не спрашивая, как прервать AJAX.

В этом случае кто-нибудь знает, как запретить серверу передавать?

Например, при динамической нумерации страниц пользователь может быстро прокручивать по одной строке за раз, вызывая множество запросов.

Это можно легко отменить на клиентской стороне jQuery с помощью abort, но для тех из нас, кто экономит на выделении пропускной способности, как мы можем предотвратить передачу предыдущих запросов при получении нового?

Спасибо заранее!

Особенности

На самом деле, это потому, что я использую слайдер пользовательского интерфейса jQuery и установил событие slide для попадания на сервер.

Как и следовало ожидать, если вы сдвинете эту присоску на 10 %, сервер просто получит сумасшедший удар и все еще передает все эти данные, даже несмотря на то, что я aborted.

Это истинный источник проблемы, поскольку простое нажатие кнопки вверх или вниз, вероятно (на мой взгляд), не может быть остановлено.


person Community    schedule 30.12.2012    source источник


Ответы (2)


Я думаю, что я слишком много думаю об этом.

В случае с динамической нумерацией страниц я думаю, что могу установить $_SESSION равным microtime(true) в самом начале php, а также сохранить его в переменной.

Прямо перед передачей (или любым другим ресурсоемким шагом) я могу проверить, равны ли они. Если нет, exit.

Однако, если кто-то еще может придумать решение общего назначения, в котором вы можете разрешить несколько параллельных запросов, он получит от меня чек и +1.

person Community    schedule 30.12.2012
comment
Вы уже ознакомились с php.net/manual/en/features.connection-handling? .php? - person Rob W; 30.12.2012
comment
@RobW А, спасибо за дополнительные знания! Отправляет ли jQuery ajax требуемый код отмены? Является ли параметр PHP по умолчанию равным exit (или эквивалентному) после прерывания? Спасибо еще раз! - person ; 30.12.2012
comment
Вы должны прервать сам запрос. Для этого вам нужно где-то сохранить результат вызова $.ajax() и вызывать .abort() всякий раз, когда вы создаете новый запрос (при условии, что переменная существует). Всякий раз, когда запрос выполняется успешно или не удается, аннулируйте переменную, чтобы освободить ресурсы. - person Rob W; 30.12.2012

В этом случае вы можете рассмотреть возможность использования событий, отправленных сервером. Это открывает постоянное HTTP-соединение для передачи данных с сервера на клиент. Это не позволяет клиенту быстро запрашивать данные и тратить пропускную способность. Пример кода:

На стороне сервера: (PHP)

<?php
@set_time_limit(0);
header('Content-type: text/event-stream');
header('Transfer-encoding: chunked');
while(true){
    echo 'data:'.$data."/n/n";//todo: send data here
    ob_flush();
    flush();
}
?>

Клиентская сторона: (javascript)

var ev = new EventSource('path/to/script');
ev.onmessage = function(e){
    var data = e.data;
    //todo: handle data here
};

Надеюсь, это поможет вам.

person Licson    schedule 30.12.2012
comment
Кстати, SSE не поддерживается в IE10. Кроме того, SSE не решает основной проблемы, заключающейся в обнаружении прерывания запроса. caniuse.com/#feat=eventsource - person Rob W; 30.12.2012
comment
Если вы хотите, чтобы соединение было двунаправленным, вы можете использовать веб-сокет, но его сложно настроить в php. - person Licson; 30.12.2012
comment
Но SSE может отправлять данные, когда это необходимо, и использует только одно соединение. - person Licson; 30.12.2012