Могут ли 1330316 AJAX-запросы аварийно завершить работу моего сервера? - PullRequest
0 голосов
/ 15 февраля 2010

Я создаю небольшое приложение PHP / Javascript, которое выполнит некоторую обработку для всех городов во всех штатах США. Это округляет до (52 x 25583) = 1330316 или менее элементов, которые необходимо обработать.

Обработка каждого элемента займет около 2-3 секунд, поэтому возможно, что пользователю придется смотреть на эту страницу в течение 1-2 часов (или, по крайней мере, минимизировать ее, пока он делает другие вещи). *

Чтобы дать пользователю максимальную обратную связь, я думал об управлении обработкой страницы с помощью javascript, в основном примерно так:

var current = 1;
var max = userItems.length; // 1330316 or less

process();

function process()
{
  if (current >= max)
  {
     alert('done');
     return;
  }

  $.post("http://example.com/process", {id: current}, function()
     {
        $("#current").html(current);
        current ++;
        process();
     }
  );
}

В html я получу следующее сообщение о состоянии, которое будет обновляться при каждом вызове функции process():

<div id="progress">
   Please wait while items are processed.
   <span id="current">0</span> / <span id="max">1330316</span> items have been processed.
</div>

Надеюсь, вы все увидите, как я хочу, чтобы это работало.

Мое единственное беспокойство заключается в том, что, если эти 1330316 запросов одновременно отправляются на сервер, существует ли вероятность, что это приведет к сбою / сбою сервера? Если так, если я добавлю дополнительное ожидание в 2 секунды на каждый запрос, используя sleep(3); в PHP-коде на стороне сервера, это улучшит ситуацию?

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

Ответы [ 2 ]

3 голосов
/ 15 февраля 2010

Если вы можете разместить cronjob на сервере, я думаю, он будет работать намного лучше. Как насчет использования cronjob для фактической обработки и использования Javascript для периодического обновления статуса (скажем, каждые 10 секунд)?

Тогда первым шагом будет запуск флага, который проверяет cronjob PHP. Если он активен, то задача должна быть выполнена (вы можете использовать некоторый временный файл, чтобы сообщить сценарию, какие записи должны быть обработаны).

Cronjob выполнит задачу, а затем, когда его итерация будет завершена, отключит флаг.

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

1 голос
/ 15 февраля 2010

Помещение сна в ваш php-скрипт на стороне сервера может только ухудшить ситуацию. Это приводит к увеличению числа процессов, что увеличивает количество параллельных рабочих / спящих процессов, что увеличивает использование памяти.

Не бойтесь, что столько процессов может выполняться параллельно. Обычно сервер apache настроен для параллельной обработки не более 150 запросов. Хорошо настроенный сервер не обрабатывает больше запросов параллельно, чем доступно ресурсов (хорошие администраторы делают некоторые вычисления заранее). Остальные запросы должны подождать - и, учитывая количество запросов, вполне вероятно, что они прекратят работу до истечения времени ожидания.

Однако ваши опасения должны касаться ресурсов на стороне клиента, но похоже, что ваш скрипт только начинает новый запрос, когда предыдущий возвращается. Кстати: HTTP-клиенты с хорошим поведением (которым должен быть ваш браузер) запускают не более 6 запросов параллельно к одному и тому же IP.

Обновление: Помимо вышесказанного, вам следует серьезно подумать над изменением своего подхода к массовой обработке (аналогично предложенному @Joel), но это должно перейти к другому вопросу.

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