AJAX, сеансы PHP и одновременные запросы

Я сразу перейду к делу!

Мой javascript отправляет около 20 запросов AJAX к моему файлу PHP для ответа (через внешний веб-API), когда пользователь отправляет свой поиск. Результаты хранятся в массиве в массиве сеанса.

Я читал, что браузеры разрешают только 2 одновременных запроса к серверу.

Моя первая проблема заключается в том, что, хотя есть еще несколько запросов, все еще ожидающих ответа, запрос AJAX «добавить в корзину» не будет работать, поскольку он все еще ожидает завершения других запросов.

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

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

Есть ли решение для перезаписи этого сеанса, или я должен использовать совершенно другой подход?

Спасибо всем!


Edit:
It's for checking domain availability. The user searches for "mydomain" and results for com, net, org, etc are eventually presented.

Отправка одного запроса и выполнение сценарием поиска всех TLD за один раз означает, что ответ не возвращается, пока не будут получены все результаты. Результат для некоторых TLD, кажется, занимает до 30 секунд, в течение которых пользователь не получает обратной связи сохраните закрученный значок и «Подождите» (это то, что происходит, когда javascript не включен).

Отдельные запросы позволяют мне отображать доступность доменов по мере их поступления.

В настоящее время я думаю о том, чтобы отправить один запрос, а затем использовать setinterval javascript для многократной проверки сеанса, пока не будут получены все результаты.

Мне кажется, я не могу комментировать это, если вы не объясните, почему вам нужно 20 вызовов AJAX на поисковый запрос.

mepcotterell 08.12.2008 15:40

Вам действительно нужны сеансы поиска?

Ja͢ck 13.04.2013 04:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
5 503
8

Ответы 8

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

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

Извините, это не совсем тот ответ, который вам нужен, но 20 запросов - это слишком много для одного поиска. Реализовав нечто подобное, т.е. краткую историю поиска, хранящуюся в сеансе, мы решили вообще не использовать AJAX. Для этого есть время и место, но не в том случае, если он убьет ваш сервер запросами при увеличении вашего трафика.

Думаю, вам стоит приступить к рефакторингу своего решения:

  1. Во всех рекомендациях по производительности указано, что вы должны минимизировать количество HTTP-запросов. 20 - это уже слишком
  2. Если у вас есть общий ресурс, вам необходимо заблокировать и разблокировать части, которыми вы управляете, чтобы предотвратить его одновременное обновление двумя или более запросами.

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

Nick 08.12.2008 18:47

Это ОЧЕНЬ отличается с точки зрения производительности. Объем обработки, который должен выполнить ваш веб-сервер, чтобы ответить на запросы и вернуть содержимое 20 статических файлов (изображений или чего-то еще), является абсолютно минимальным по сравнению с тем, что он должен сделать, чтобы ответить на 20 дискретных запросов AJAX. Объем обработки, которую браузер должен выполнять для статических файлов, также сравнительно минимален. Существует внешнее сходство в том, что количество HTTP-запросов, отправленных от клиента, одинаково в обоих случаях, но на самом деле - это число не то, на чем вы должны основывать свои решения здесь.

glomad 23.07.2009 21:18

Было бы гораздо экономичнее отправить один запрос AJAX, позволить вашему бэкенду выполнять любое необходимое количество поисков, вернуть набор результатов в виде JSON или что-то в этом роде и обработать его в браузере. Представьте, что 500 пользователей одновременно используют вашу текущую систему - это 10000 запросов за очень короткий промежуток времени. По мере увеличения масштаба ваша производительность будет экспоненциально ухудшаться.

glomad 23.07.2009 21:19

Попробуйте создать очередь запросов для вызовов ajax. Каждый звонок будет совершаться после окончания предыдущего.

После того, как второй запрос сделан, вы не можете быть уверены в том, что произойдет, поскольку, как вы сказали, можно отправить только 2 одновременных запроса. После этого числа третий запрос, скорее всего, заменит второй и т. д.

http://php.net/manual/en/function.session-write-close.php

Сохраните данные из вашего сеанса в локальных переменных, а затем вызовите эту функцию, чтобы разблокировать ваш сеанс для других файлов. (хотя следует сказать, что 20 вызовов AJAX, вероятно, не лучшее решение)

Я предполагаю, что это своего рода окно поиска с автозаполнением. Если вы используете Scriptaulous Ajax.Autocompleter, вы можете просто указать параметр minChars. Он не отправит запрос AJAX, пока не будет набрано хотя бы такое количество символов.

Вы также можете настроить параметр «частота», который изменяет частоту (в секундах) опроса поля ввода на предмет изменений перед запуском запроса AJAX.

Подробнее здесь

Как указывали другие, ваш первый подход должен заключаться в уменьшении количества запросов. Если это не вариант, вы можете использовать поддомены для увеличения количества параллельных запросов.

Настройте свой DNS (например, mydomain.com), чтобы он принимал все поддомены * .mydomain.com и отправлял их на тот же сервер.

Затем вы можете отправлять разные запросы AJAX в разные домены (a.mydomain.com, b.mydomain.com, ...)

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

Проблема в том, что между одновременными запросами запускается сеанс. даже когда он открыт в другом контексте, из-за чтения сохраненного сеанса и того же файла cookie сеанс, открытый каждым запросом, остается одинаковым. Затем, если один из текущих запросов завершает свою задачу первым, он закроет сеанс, как это всегда происходит, когда сценарий завершил свою задачу, но поскольку другой сценарий (вызываемый другим) может все еще выполняться, он не знает, что сеанс уже был закрыт, поэтому есть некоторые решения. Перед завершением задачи скопируйте переменную сеанса в переменную держателя сеанса, перезапустите сеанс, восстановите значения просмотра session = sessionholder и session_write_close. Какая сессия начнется или закончится первой? иногда нет способа узнать, может быть, первый, кто запустил сеанс, займет больше времени, чтобы завершить его задачу, в то время как другой приходит и уходит, в любом случае, примите это как есть, сеанс - это не что иное, как сохранение переменной с именем сеанс, введите массив с ключевыми значениями, обработка восстановления сохраненных значений, а затем обновление сохранения этих значений в конце задачи сценария - вот что делает сеанс автоматическим в этом вопросе, поэтому нет никакой разницы, если вы начнете сеанс (восстановите его сохраненные значения, присвойте ему новые значения, затем сохраните их снова, процесс - запуск сеанса, присвоение значений, закрытие сеанса записи. Конечно, имейте в виду, что если вы перезапустите сеанс без сохранения его фактических значений, они будут потеряны (перезаписаны, если они существуют), поэтому вы должны сначала сохранить его фактические значения, восстановить, переназначить текущие значения, а затем написать close. Другой процесс, присущий этой конкретной переменной сеанса, которую выполняет php, - это присвоение ссылки (идентификатор сеанса), которую он отправляет клиент (обычно через cookie), поэтому, когда cookie возвращается с этим идентификатором ссылки, идентифицирует переменную сеанса, сохраненную для восстановления предыдущих значений. Помните, что один и тот же вызов может делать то же самое, поскольку ajax является асинхронным, если по какой-то причине один вызов задерживается, и пользователи щелкают снова, новый запрос не завершит текущий, и возникнет такая же проблема, поэтому при использовании ajax готовится обрабатывать сеансы по мере необходимости в зависимости от вашего приложения. И, наконец, помните, что вызов может относиться к другому файлу или одному и тому же файлу, один запрос вызова ajax price.php другой products.php, но оба будут использовать одну и ту же сохраненную переменную сеанса, переменная сеанса будет только одна все время для все скрипты у вас есть. Avenida Gez. Спасибо за чтение

Другие вопросы по теме