За последние 24 часа нас посетили 18114 программистов и 1606 роботов. Сейчас ищут 952 программиста ...

Проблема с семафорами. sem_acquire() fails sometimes

Тема в разделе "Прочие вопросы по PHP", создана пользователем gribodemon, 24 июн 2009.

  1. gribodemon

    gribodemon Активный пользователь

    С нами с:
    24 июн 2009
    Сообщения:
    2
    Симпатии:
    0
    Доброго времени суток!
    Я использую семафоры с целью ликцидации коллизий, которые могут возникнуть из-за одновременного доступа к БД разными процессами. Т.е. есть php-файл, в котором прописан код для работы с БД и есть множество обращений к нему.
    В этом файле прописан следующий код:

    Код (Text):
    1.  
    2.     function free_sem ($sem_id) {
    3.         if (!sem_release($sem_id)) {
    4.             //echo "sem_release(\"$sem_id\") fails!";
    5.         }
    6.         if (!sem_remove($sem_id)) {
    7.             //echo "sem_remove(\"$sem_id\") fails!";
    8.         }
    9.     }
    10.  
    11.     $SEMKEY = 0x100;
    12.     $sem_id = sem_get($SEMKEY, 1);
    13.     if ( $sem_id === false ) {
    14.         echo "sem_get() fails!";
    15.         exit;
    16.     }
    17.     if ( !sem_acquire($sem_id) ) {
    18.         echo "sem_acquire(\"$sem_id\") fails!";
    19.         sem_remove($sem_id);
    20.         exit;
    21.     }
    22.  
    23.     // ... do stuff with DB ...
    24.  
    25.     free_sem($sem_id);
    И иногда возникает ошибка на функции sem_acquire(). При этом частота обращений ~60 раз в минуту. Время работы с БД при этом ~0-5 sec.
    Никто с такими траблами не сталкивался?

    P.S.: LAMP, Debian 5.0, PHP Version 5.2.0-8+etch13
     
  2. gribodemon

    gribodemon Активный пользователь

    С нами с:
    24 июн 2009
    Сообщения:
    2
    Симпатии:
    0
    Так же возникают warning'и при освобождении семафоров (иногда):
    (сейчас попробовал рядом с коментом // ... do stuff with DB поставить sleep(1); и позапускать скрипт через браузер ... однако ошибки с sem_acquire() мне таким образом не удалось ни разу добиться)

    Не могу понять с чем это связано. С тем, что семафор занят другим процессом, а его хотят освободить?