Цикл и нагрузка при разных реализациях, многократный вызов php файла

Статус
В этой теме нельзя размещать новые ответы.

tulvit

Создатель
Регистрация
26 Янв 2010
Сообщения
30
Реакции
6
Допустим, есть некоторая функция f(), которую надо выполнить некоторое количество раз, пусть 1000. Решение в лоб -

PHP:
for($i = 0; $i<100; $i++){
f();
}

Но необходимо при каждой итерации цикла выводить в браузер какую-то информацию. Реализовать это можно с помощью ajax

PHP:
function go() {
for(var i = 1; i<1000; i++){
url = "f.php"; //пхп файл с нашей функцией f()
XMLHttp.open("GET", url, false);
XMLHttp.onreadystatechange = some_function;
XMLHttp.send(null);
}
}

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

Смущает только то, что php файл будет запрошен 1000 раз. Соответственно вопрос, насколько это критично в плане производительности? Не уложит ли сия реализация дешевый виртуальный хостинг?

Доп. информация
Сама функция относительно тяжеловесна, а не просто там сложить/вычесть два числа.
Временные потери не критичны, т.к. скорее всего задержка между двумя итерациями будет установлена в 1 секунду и выше.
 
Смущает только то, что php файл будет запрошен 1000 раз. Соответственно вопрос, насколько это критично в плане производительности? Не уложит ли сия реализация дешевый виртуальный хостинг?
Доп. информация
Сама функция относительно тяжеловесна, а не просто там сложить/вычесть два числа.
Временные потери не критичны, т.к. скорее всего задержка между двумя итерациями будет установлена в 1 секунду и выше.
Если это относительно простой скрипт (не тянет за собой тяжёлый фреймворк), то накладные расходы на запросы будут не велики. Главное чтобы эти запросы не накладывались друг на друга: т.е. выполняется один запрос и пришёл следующий запрос (если клиент один, то такое вряд ли случится).

Сервер может положить то что делает Ваша функция либо если скрипт тянет за собой тяжёлый фреймворк.

Обычно на вирт. хостинге есть ограничение на использование ресурсов, аккаунт могут просто засуспендить. Запустите скрипт и смотрите в консоли результат команд uptime / top.
 
Допустим, есть некоторая функция f(), которую надо выполнить некоторое количество раз, пусть 1000. Решение в лоб -
PHP:
for($i = 0; $i<100; $i++){
f();
}
Но необходимо при каждой итерации цикла выводить в браузер какую-то информацию. Реализовать это можно с помощью ajax
PHP:
function go() {
for(var i = 1; i<1000; i++){
url = "f.php"; //пхп файл с нашей функцией f()
XMLHttp.open("GET", url, false);
XMLHttp.onreadystatechange = some_function;
XMLHttp.send(null);
}
}
Все вроде хорошо, функция выполняется нужное количество раз, страница в браузере не перегружается, при каждой итерации можно выводить в браузер любую информацию.
Смущает только то, что php файл будет запрошен 1000 раз. Соответственно вопрос, насколько это критично в плане производительности? Не уложит ли сия реализация дешевый виртуальный хостинг?
Доп. информация
Сама функция относительно тяжеловесна, а не просто там сложить/вычесть два числа.
Временные потери не критичны, т.к. скорее всего задержка между двумя итерациями будет установлена в 1 секунду и выше.

не уложит, если у тебя не будет гора fsockopen() и тому подобное
 
можно не запускать скрипт 1000 раз, а запустить один и пусть он пишет результат в лог файл какой нидь, а уже аяксом (можно + еще доп скрипт чтения) выводить информацию в браузер - это "легче" будет и "наложения" исключаются

ну и задержки 1 сек при запусках, в принципе - вполне достаточно, что бы не уложить сервак
исключая тот случай, когда скрипт сам его может положить
 
Смущает только то, что php файл будет запрошен 1000 раз. Соответственно вопрос, насколько это критично в плане производительности? Не уложит ли сия реализация дешевый виртуальный хостинг?
Доп. информация
Сама функция относительно тяжеловесна

Более оптимальным решением было бы повесить демона и с клиентской части слать запросы к нему. Таким образом уменьшится нагрузка...
 
Самый "человечный" по отношению к апачу способ был бы сгенерить php сразу все 100 итераций цикла, их результаты скинуть в javascript, и javascript отдать в броузер, а он уж там пусть выводит их юзеру по одному, имитируя деятельность.

Если же тебе надо реальное положение вещей показать, то открою секрет: вот те вот ajax-запросы не обязательно будут приходить на сервер в нужном порядке, у тебя иногда f() 51-й итерации выполнится раньше чем 50й. Имей в виду.

Вообще же обычная практика, когда делают подобные вещи, запускать их асинхронно, а бровзеру отдавать что-то типа "скрипт запущен, проверяйте <здесь>". И ссылочку, по которой юзер или ручками, или раз в пару секунд может проверять текущее положение дел.
Скрип, "показывающий положение дел" просто читает его из файлика, куда тот здоровый основной скрипт с сотней итераций сохраняет его после каждой f().

Но в твоем конкретном случае мне кажется что set_time_limit(3600) и flush() после каждой итерации будет и проще, и вполне гуманно к апачу. Вряд ли таких штук параллельно больше 20ти запустят.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху