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

Тема в разделе "PHP", создана пользователем tulvit, 12 фев 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. tulvit

    tulvit Создатель

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

    PHP:
    for($i 0$i<100$i++){
    f();
    }
    Но необходимо при каждой итерации цикла выводить в браузер какую-то информацию. Реализовать это можно с помощью ajax

    PHP:
    function go() {
    for(var 
    1i<1000i++){
    url "f.php"//пхп файл с нашей функцией f()
    XMLHttp.open("GET"urlfalse);
    XMLHttp.onreadystatechange some_function;
    XMLHttp.send(null);
    }
    }
    Все вроде хорошо, функция выполняется нужное количество раз, страница в браузере не перегружается, при каждой итерации можно выводить в браузер любую информацию.

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

    Доп. информация
    Сама функция относительно тяжеловесна, а не просто там сложить/вычесть два числа.
    Временные потери не критичны, т.к. скорее всего задержка между двумя итерациями будет установлена в 1 секунду и выше.
     
  2. Abliganto

    Abliganto Постоялец

    Регистр.:
    30 ноя 2009
    Сообщения:
    111
    Симпатии:
    46
    Если это относительно простой скрипт (не тянет за собой тяжёлый фреймворк), то накладные расходы на запросы будут не велики. Главное чтобы эти запросы не накладывались друг на друга: т.е. выполняется один запрос и пришёл следующий запрос (если клиент один, то такое вряд ли случится).

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

    Обычно на вирт. хостинге есть ограничение на использование ресурсов, аккаунт могут просто засуспендить. Запустите скрипт и смотрите в консоли результат команд uptime / top.
     
    tulvit нравится это.
  3. Miraage

    Miraage Angular/Laravel

    Регистр.:
    3 июн 2008
    Сообщения:
    230
    Симпатии:
    51
    не уложит, если у тебя не будет гора fsockopen() и тому подобное
     
  4. betatest

    betatest

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

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

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    634
    Симпатии:
    1.421
    Более оптимальным решением было бы повесить демона и с клиентской части слать запросы к нему. Таким образом уменьшится нагрузка...
     
  6. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    Самый "человечный" по отношению к апачу способ был бы сгенерить php сразу все 100 итераций цикла, их результаты скинуть в javascript, и javascript отдать в броузер, а он уж там пусть выводит их юзеру по одному, имитируя деятельность.

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

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

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