глобальный признак

Тема в разделе "PHP Pro", создана пользователем horpah, 19 мар 2011.

Статус темы:
Закрыта.
  1. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    Господа гуру PHP. Прошу вашего мнения или совета.

    Есть скрипт, в нем функция calc(). Эта функция довольно "тяжелая". Вызывается она всегда при загрузке любой страницы сайта, а также при AJAX запросах, которые на некоторых страницах идут 1 раз в 2 секунды.

    Возможна ситуация, когда эти AJAX-запросы придут почти одновременно из разных закладок/браузеров/компов. Поскольку ф-я calс() "тяжеловата", то случается, что 2-й поток начинает ее выполнять, когда 1-й еще не завершил. Т.О в нек. промежуток времени ее одновременно выполняют 2 скрипта. Необходимо придумать решение, чтобы скрипт, начав ее выполнять, мог установить какой-то глобальный признак, видимый всем обрабатываемым запросам.

    Что-то типа этого:

    PHP:
    ......
    calc();
    .....
    function 
    calc()
    {
     if(
    CALC_EVENT// CALC_EVENT - какой-то признак того что эта функция выполняется другим скриптом
       
    return;
     try{
     
    set_calcEvent(); //установить CALC_EVENT
     
    .........
     
    кодгарантированно выполняемый в пределах всего сайта всего в одном экземпляре
     
    .........
     }catch(
    e){
       
    close_calcEvent(); // сбросить CALC_EVENT
     

    }

     
  2. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    То что вы хотите называется семафор
    и для этого даже есть специаольные функции(но кажется они т олько под никсы, в контексте PHP)
    в более простых сулчаях вполне подойдет использование файла и flock, или даже просто файла.
    в него вы пишите uniqid() например, а по завершении функции стираете
     
    horpah нравится это.
  3. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Еще неплохо бы проверять время создания файла, и слишком старый удалять насильно.
     
Статус темы:
Закрыта.