Межскриптовая синхронизация (PHP/Perl/SQL)

Discussion in 'PHP' started by hidden, 31 Oct 2007.

  1. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Есть такая ситуация: Запускается первый скрипт и говорит "Я Вася", через некоторое время запускается второй и говорит "Я Петя", потом запускается третий и говорит, "Я Гриша, кстати Вася, тебе что-то пришло", а Вася проверяет что ему пришло. Все скрипты должны находится в режиме ожидания и их может быть очень много.

    Кто-нибудь знает как такое реализовать не запуская свой демон? С демоном через сокеты я и так уже сделал, но это не слишком универсально, может есть более удобный метод?
     
    1 person likes this.
  2. biophreak

    biophreak Elder - Старейшина

    Joined:
    3 Aug 2007
    Messages:
    348
    Likes Received:
    63
    Reputations:
    15
    А может просто запускать скрипты один из другого с нужными параметрами?
    Если неправильно понял - не ругай...
     
  3. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    hidden, если ты это мутишь на юникс платформе в консоли, то почему бы тебе не воспользоваться системой сигналов? Заведи юзерские сигналы, повесь на них обработчики и пускай нужный скрипт реагирует на сигнал что-то проверяя...
     
  4. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    2biophreak неправильно понял...

    Это вообще то на юниксовом серсере подразумевается, но не в консоли, а на аппаче и желательно в PHP
    Представь, если сотня скриптов будут реагировать на сигнал, который поступает каждую десятую секунды, что это получится, а ведь их может быть и больше, тем-более всё-равно надо что-то проверять, тогда нужно будет обеспечить синхронизированный доступ к этому ресурсу(как-то его сбрасывать), вариант сложнее и менее эффективен чем с демоном.
     
  5. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    совсем не ясна задача
     
  6. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Поясняю...
    Есть таблица в SQL, пользовательский скрипт устанавливает ожидание на определённую запись в этой таблице, а когда другой скрипт изменяет эту запись, он уведомляет тех, кто ожидает эту запись.

    PS Такой вариант не катит. :)
    Code:
    for(;check_sql();sleep(100)){}
     
    #6 hidden, 31 Oct 2007
    Last edited: 31 Oct 2007
  7. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    ну пусть когда какойто скрипт обновит, то он запустит тот скринт который ожидает
     
  8. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    >>Есть таблица в SQL, пользовательский скрипт устанавливает ожидание на
    >>определённую запись в этой таблице, а когда другой скрипт изменяет эту запись, он
    >>уведомляет тех, кто ожидает эту запись.

    ну пусть пользовательский скрипт добавляет запись в отдельную таблицу `ocheredi` с указанием типа ожидаемой записи и rand_id, затем создает у себя файл rand_id с правами записи от пользователя apache (тут нужно уточнить рамки безопасности поставленной задачи) и синхронно read ожидает поступления новых байт. соответсвенно скрипт добавляющий очередную запись в таблицу проверяет одновременно `ocheredi` на наличие записей того же типа и пишет во все rand_id о поступлении новой записи, при этом удаляя обработанные записи.
     
    1 person likes this.
  9. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Нее, пока-что перл-демон с блокирующими сокетами остаётся оптимальным вариантом.

    Я просто подумал, может есть что-то типа CreateEvent, WaitForSingleObject (Виндовые функции) или в SQL так составить запрос, чтоб он ожидал изменения указанной записи...

    Anyway, thanks for the tries... :)
     
  10. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    >>Нее, пока-что перл-демон с блокирующими сокетами остаётся оптимальным вариантом.
    только, я надеюсь, реализовано это все через unix-сокеты (af_unix)? а то на такие частые обращения портов не хватит)

    >>Я просто подумал, может есть что-то типа CreateEvent, WaitForSingleObject
    а зачем есть все на блокирующих сокетах? пусть ставит recv и ждет своего "события".

    >>или в SQL так составить запрос, чтоб он ожидал изменения указанной записи...
    не знаю как где, но mysql с его элементарным запрос-ответом этого сделать не позволит.
     
    1 person likes this.
  11. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    hidden, я лишний раз убедился, что ты алгоритм понимаешь неправильно. Ты вынес задачи СУБД на какой-то скрипт... Зачем? Да и в конце-концов - поставь задачу чётко, какая СУБД? Какой язык программирования? В какой среде это всё будет выполняться? Я думаю, что тебе нужно отталкиваться от тригеров... Пускай у тебя будет очередь подписчиков на изменения в каком-то объекте, а уже триггер после модификации объекта будет дёргать и вызывать что-то, или иным образом уведомлять получателей...
     
    2 people like this.
  12. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    2groundhog Не волнуйся так за меня, с алгоритмом я как-нибудь разберусь ;)

    2ZaCo Хм..Честно-говоря не знал разницу между этими сокетами, я так понял это "IO::Socket::UNIX" и разницы в использовании практически никакой, ок, поправлю :)
     
    #12 hidden, 1 Nov 2007
    Last edited: 1 Nov 2007