Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M |
![]() ![]() |
Топик располагается на нескольких страницах: 1 2 [все] |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
Добрый день ! Не пинайте сильно, я недавно работаю с ВЕБ приложениями и иногда возникают вопросы, которые раньше при работе с настольными приложениями не возникали... Например при запросе к БД с помощью Ajax я получаю некоторые данные для страницы. Но. При этом у меня на стороне GT.M - $JOB может меняться несколько раз. Т.е. получается при каких то действий на страницы, JOB-ы меняются как им вздумается. Понятно, что это происходит асинхронно, но почему, как-бы только один конект происходит ? Это нормальное явление, или я что-то недопонимаю ? Спасибо. |
12 янв 17, 12:30 [20097844] Ответить | Цитировать Сообщить модератору |
krvsa Member Откуда: г Волжский Сообщений: 13116 |
Нормальное. |
||
12 янв 17, 13:16 [20098145] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
В эту же тему. При работе с десктопными приложениями, при открытие некой программы, GT.M всегда установил один процесс. Например: [root@GTM gtm63A]# ps -ef | grep mumps root 25263 25262 0 11:45 ? 00:00:00 mumps -r command^%mwire root 25266 25001 0 11:45 pts/1 00:00:00 grep mumps В моем случае, при заходе с веб страницы, это не видно, хотя 3 компа работают с какой-то задачи. Почему ? Открыл и сразу закрыл ? Нету ничего на подобия "KEEP-ALIVE" ? Или так должно быть ? Я растерян... |
13 янв 17, 12:54 [20102355] Ответить | Цитировать Сообщить модератору |
DAiMor Member Откуда: Volzhsky -> Moscow -> CZ, Brno -> Moscow Сообщений: 2633 |
А что конкретно смущает, такое же поведение и в Caché. Там процесс нужен только на время обработки запроса, и при каждом запросе процесс может быть любым. Есть возможность зафиксировать процесс для сессии, но способ не из рекомендуемых. Но в каше есть сессия в которой можно хранить данные, необходимые от запроса к запросу. Как это реализовано в GT.M не знаю, может быть тоже есть какой то идентификатор сессии, по которому можно хранить данные в глобале. |
13 янв 17, 13:11 [20102424] Ответить | Цитировать Сообщить модератору |
krvsa Member Откуда: г Волжский Сообщений: 13116 |
Я не силен в линуксовом синтаксисе... ![]() Но идея поддержки вэба такова (упрощенно конечно). - клиент обратился к серверу - сервер выделил джоб из числа доступных и запустил указанную программу - программа отработала и сервер забыл о клиенте Для некой памяти о клиенте есть на сервере сессия... Она уникальна для "соединения". Пока клиент на завершит работу или не истечет таймаут ожидания действий от клиента... |
||
13 янв 17, 13:16 [20102444] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
krvsa, Понятно. Есть такое. Есть сессия. Я застопорился в моих программах, когда переключаюсь между областями, хотя таковых в GT.M нету. Я получаю их в переменных s $zro=PATH s $zgb=GLD Всегда забрасывает в $gtm_dist (в каше как бы SYS) Вот по этому мучаюсь и не знаю где копать ... |
13 янв 17, 13:31 [20102552] Ответить | Цитировать Сообщить модератору |
krvsa Member Откуда: г Волжский Сообщений: 13116 |
Вот потому-то и нужно "забыть про области". ![]()
Это видать так настроена обработка вэб приложений...
Как рассказывали мне более опытные в ГТ.М коллеги, тут на форуме, нужно не цепляться за кащейские подходы в работе на ГТ.М. Т.е. не должно быть "переключений", как это делается в Каше, а должно быть правильное описание глобальной директории для полноценной работы приложения. По деталям я тебя не проконсультирую, т.к. не вкурсе чего там у тебя и как. |
||||||
13 янв 17, 14:05 [20102779] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
krvsa,
:) Вот это и смущает... ОПИСАНА она у меня как надо. Не спорю. Ошибка подкралась, есть она... Вот и хочу понять сущность. |
||
13 янв 17, 15:26 [20103349] Ответить | Цитировать Сообщить модератору |
krvsa Member Откуда: г Волжский Сообщений: 13116 |
Тогда зачем "переключения"? |
||
13 янв 17, 16:20 [20103672] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
Я хотел пробовать как это себя ведет, когда имеем несколько БД (допустим в разных директориях) , а приложение ОДНО для всех в $gtm_dist. Типа студио для глобалов и рутин .. Понятно, можно отдельно запустить для каждой, но ... не тот эффект ! |
||
13 янв 17, 16:37 [20103735] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
Хорошо. Ответ как бы сам по себе понятен. А как в Cache это происходит ? Ведь там тоже отдельные области и отдельные БД. Работает наверно один общий сервер WEB для всех областей из область %SYS Значит тоже нужно как-то обращаться к этим областям ?... Что, без переключения, или как ? Как здесь работает механизм обработки данных средством WEB приложений ? |
25 янв 17, 09:37 [20142904] Ответить | Цитировать Сообщить модератору |
servit Member Откуда: г. Кишинёв, Республика Молдова Сообщений: 3117 Блог |
В Caché можно как с переключением между областями, так и без такового, используя механизм отображения глобалов/программ/пакетов. Ещё можно настроить виртуальную область %ALL, объекты отображения из которой будут видны во всех областях. |
||
25 янв 17, 10:12 [20143038] Ответить | Цитировать Сообщить модератору |
krvsa Member Откуда: г Волжский Сообщений: 13116 |
Там в настройке вэб-приложения указывается имя области... Но потом ты волен переключаться в любую область сервера Каше. Но специфика глобальной директории так сильно отличается от понятия "область" в Каше... ![]() Т.ч. параллели с Каше тебе не помогут. Повторюсь... Мне советовали более опытные ГТ.Мщики, пересмотреть свои взгляды на разработку ПО для ГТ.М... Делать не по кащейски, а по ГТ.Мовски. |
||
25 янв 17, 10:17 [20143067] Ответить | Цитировать Сообщить модератору |
krvsa Member Откуда: г Волжский Сообщений: 13116 |
Аналог этого есть и в ГТ.М... Но это помогает не всегда. ![]() Т.е. при наличии аналога помогает. Проблемы появляются как раз в отсутствии аналогов. Например нет "переключения" ГД как таковых... Если сравнивать "переключения ГД" с переключениями между областями. И вот тут как раз наступает тупик "кащейского ПО". |
||
25 янв 17, 10:22 [20143087] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
|
||
25 янв 17, 11:46 [20143584] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
gluconat_ca, Есть там, только немножко не как в каше ZN, а:
|
||
25 янв 17, 12:02 [20143696] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
Valeriu, всё равно не понял, в чём проблема (я не о приведённом коде, а о самой проблеме). Есть переменные окружения: gtm_dist Есть внутренние переменные: $ZG[BLDIR] Или проблемы нет? |
25 янв 17, 12:26 [20143840] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
gluconat_ca, Проблема есть... В двух словах не обьяснить, но постараюсь. Я работаю с NGINX + FCGI+ GT.M GT.M используется свой сокет для связи с NGINX + FCGI Есть два случая: 1. Если сокет открывается и после какого-то действия сразу закрывается, то переключатся, как Вы заметили выше, можно БЕЗ проблем. НО. Если другой пользователь переключается в это время, то и всех остальных переключает в его каталог ! 2. Если сокет держим открытым для других соединений - переключение НЕ РАБОТАЮТ, только в одну "область" крутится Туманно, но где-то так. Я сам пока не могу понять почему так и вот решил по спросить, может что-то выявится. |
25 янв 17, 12:46 [20143963] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
Valeriu, Может нужно так: Раз один м-процесс (fastcgi) обрабатывает запросы от разных пользователей и должен исполнять с разными $zg, то держите это в настройках для каждого пользователя и "смену области" меняйте в настройках, а не в текущем исполнении fastcgi. А отработчики конкретных запросов должны сами делать смену $zg взяв нужное значение из настроек, а по окончании восстанавливать исходное. Можно даже этим озадачить сам m-процесс fastcgi, доработав его.:) Попал в проблему или мимо? |
25 янв 17, 13:06 [20144085] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
gluconat_ca, Согласен, где-то примерно так. Я очень связал свои надежды с процессом $J , но здесь он оказывается безполезен .. |
25 янв 17, 13:16 [20144134] Ответить | Цитировать Сообщить модератору |
krvsa Member Откуда: г Волжский Сообщений: 13116 |
"Переключение" ГД не такое как переключение областей в Каше. Да и сама ГТ не есть область в Каше. А рассматривать мои "проблемы" в этой теме я не вижу смысла... ![]() |
||
25 янв 17, 13:17 [20144142] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
то есть проблема в этом - что можно было бы взять в качестве IDа сессии, который позволил бы восстанавливать контекст ? |
||
25 янв 17, 15:35 [20145127] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
gluconat_ca, Да. В этом контексте. Но как это осуществить, я еще пока не представляю... |
25 янв 17, 16:19 [20145478] Ответить | Цитировать Сообщить модератору |
krvsa Member Откуда: г Волжский Сообщений: 13116 |
У самой страницы есть сессия... https://itchief.ru/lessons/javascript/javascript-sessionstorage-and-localstorage |
||
25 янв 17, 16:23 [20145505] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
Valeriu, так у вас же в коде, приведённом выше, есть вот это:s sid=$p(%fcgi("i","header","SID"),",") Этот SID в куках передаётся, который формируется при первом ещё не "закукенном" запросе в FCGI.m |
25 янв 17, 16:24 [20145516] Ответить | Цитировать Сообщить модератору |
andrew000999 Member Откуда: Сообщений: 83 |
Валерий, не проще ли вместо игры с $zglb обращаться к разным областям по полной глобалной ссыле |
25 янв 17, 22:25 [20146872] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
andrew000999, Была и эта мысль, к глобалам без проблем, а как насчет рутин ? |
25 янв 17, 22:38 [20146921] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
Короче здесь так получается. Пользователь открыл сокет, получил данные и СРАЗУ же закрыл Второй, или тот кто по очереди естественно опять открывает и закрывает. Т.е. если пользователь перешел в другую область (глобальный каталог,рутин) он перебрасывает сюда и предыдущих без их ведома. Получается как бы ОДНО ПОЛЬЗОВАТЕЛЬСКОЕ приложение.. Конечно хочется не так, а неограниченное количество независимых соединений.
Я пробовал разные варианты, но вопрос так и остался. Может я что-то неправильно делаю ? |
|
26 янв 17, 09:17 [20147651] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
Valeriu, Работу этого сервера можно не менять. Он работает в определённом контексте ($zg,$zro), который "отработчики" конкретных запросов должны по выходу восстанавливать. Вот участок кода, где происходит косвенный вызов "отработчика"
1. сохранить текущее значение $zg и $zro 2. Установить нужное значение $zg и $zro 3. Выполнить нужный код 4. Восстановить сохранённое в п.1 и выйти |
||
26 янв 17, 10:46 [20148015] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
В дополнении к вышесказанному. Конечно, по-правильному, все эти пункты лучше вставить в сам FCGI.m, чтобы не дублировать во многих местах. Добавить процедурку в FCGI.m, типа такой:
d:t'="" @tна d:t'="" startappl(t) |
||
26 янв 17, 14:40 [20149404] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
gluconat_ca, Спасибо большое. Что-то зашевелилось с таким подходом. Да. Приходится менять везде...
|
|
26 янв 17, 15:04 [20149560] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
Valeriu, А зачем в цикле перебирать: f s id=$o(^uciID(id)) q:id="" d Если можно сразу: d:$d(^uciID(cid)) |
26 янв 17, 16:08 [20150012] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
В продолжении. и это лишнее d:$d(^uciID(cid))так как чуть выше есть s ^uciID(cid)="", так что узел заведомо есть. |
26 янв 17, 16:53 [20150319] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
gluconat_ca, Придется писать маленький бат-ник все таки .. Где указать системную директорию (gtm_dist) У меня например /usr/gtm63A/mumps.gld
|
|
26 янв 17, 17:13 [20150402] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
Valeriu, Сохранять текущие $zg,$zro можно же и в локальных переменных, я собственно и имел это ввиду. |
26 янв 17, 17:23 [20150469] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
gluconat_ca, Да, сам заметил что в глобал не самый хороший вариант.. Очень трудно отследить всех пользователей кто куда и что выбирает. Уже пробовал - началась путаница.. Но FCGI еще не знает $zg,$zro ни новые не старые значения !!! Я не знаю где брать локальные переменные - а было бы хорошо.. Потом уже. Когда пользователь нажимает на "область", я должен это фиксировать плюс, должен знать постоянно где находится дистрибутив. может что-то путаю, уже конец рабочего. |
26 янв 17, 17:41 [20150519] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
Valeriu, честно говоря я в некотором замешательстве. Не могу взять в толк, в чём проблемы, особенно с локальными переменными. Просто тупо пишем:
|
||
26 янв 17, 18:44 [20150811] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
gluconat_ca, Да.. Вот что значит старые привычки. Я никак не могу отходит от старых понятий работ М систем. Поплыл я далеко и совсем не туда. Прошу прощения. Видимо здесь гораздо даже проще, чем я себя представлял. Выкинуть из головы надо такие понятия как $job и такое, если ты конектился - ты хозяин положения. У меня как система работает: Во первых если создается БД, то программа автоматом пишит в глобаль все что относится к ней для дальнейшего обращения:
Исходя из того, что не имеет значения сколько пользователей работают одновременно, просто при каждом действие (любое!) нужно указать системе где пользователь НАХОДИТСЯ ! Я это заметил почти у всех разработчиков ПО, которые работают с GT.M - WEB У них даже функции специальные есть (db.open, db.close) и меня всегда это удивляло, зачем постоянно открывать и закрывать ? .. Закончил действие, закрыл сокет и т.д. - здесь это уже выступает как правило.
и какое действие нужно выполнить, т.е переключаться, выполнить действие и закрываться.
Уверен, что это сработает. Спасибо. |
|||||
27 янв 17, 09:28 [20151973] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
Valeriu, Давайте отвлечёмся от несущественного, от сокетов, фастцги и пр. У вас есть некая m-программа, назовём её S, которая запускается в неком контексте, имеет доступ к файлу с глобалами, которые ей нужны для выполнения своей функции, в частности выполнения (командой DO) некоторого определённого набора программ Xi. Эти программы должны в свою очередь запускаться с предварительно настроенным контекстом ($zg,$zro) Сi . Выбор программы для запуска определяется путём получения неких параметров извне, способ получения значения не имеет. Вопрос в контексте для вызова, как его определить. Это тоже вопрос соглашения, он не может быть универсальным. Как задумаете, так и будет работать. Вот варианты наобум. Для каждой Xi: 1. иметь заранее определённый Ci 2. иметь заранее определённый набор Cij, где второй индекс j определяется получением извне 3. все данные для контекста получать извне. и т.д. Только нужно иметь ввиду, что, если есть какая либо параметризация в определении контекста, как в п.2 и п.3, то нужно определиться для случая "по умолчанию", когда параметр не передаётся. В любом случае нужны некие, заранее формируемые, настройки (конфигурации) программы S в рамках которых она и будет работать. Вот такое у меня сложилось представление. Может быть изложенное всё мимо? |
27 янв 17, 09:36 [20151990] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
Valeriu, опубликовал, не успев прочитать ответ 20151973. |
27 янв 17, 09:41 [20152011] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
gluconat_ca, Еще заметил один нюанс ... В первом варианте, что от Бантела, сокет открывается, действие, потом полностью закрывается. Я пробовал еще один вариант, как указал ниже. Открываем, записываем в переменную, закрываем и ждем нового подключения, давая предыдущему соединения отработать до конца. Так мы большую независимость представляем пользователю. Плюс использования и SID.
|
||
27 янв 17, 10:21 [20152192] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
Не вполне понимаю, что имеется ввиду под "отработать до конца" В оригинальном FCGI.m сокет держится открытым пока идут определённые типы запросов (см. fcgi("type") ) и закрывается после отработки запроса и отправки наверх FCGI_END_REQUEST. После сокет закрывается и переходит к новой итерации приёма запроса. Всё по спецификации fastcgi. |
27 янв 17, 11:02 [20152480] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
Valeriu, Сразу не понял о чём речь. Ничего не скажу о правильности использования сокетов (нужно погружаться в документацию чтобы вспомнить детали). В новых версиях gt.m есть и другой подход, не рестарт слушателя порта в новом JOBе, а запуск процесса обработчика с передачей ему хендлера (сокета), а сам процесс опять приступает к прослушке порта. Мне, лично такой подход больше нравится. К тому же в первом варианте нужно обеспечить передачу из процесса в процесс (слушатели) значение переменной nr, которая растёт от запроса к запросу и которая используется для генерации cid, иначе они (cid) могут продублироваться для разных запросов, приходящих в пределах одной секунды. Могу посоветовать, в дополнении к документации, в качестве примера использования - web-сервер DataBalet https://github.com/lparenteau/DataBallet |
27 янв 17, 15:51 [20153955] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
gluconat_ca, Я в курсе, даже пробовал, но смутно до меня доходит, как использовать дочерний процесс с передачей его новым job-ом В Каше просто и ясно. Здесь закручено очень. Да и простого примера не хватает. Я когда их спрашиваю, они сразу советуют пользоваться XINETD. Я пробовал и этот вариант - РАБОТАЕТ! XINETD+ FCGI. Т.Е. без использования родного сокета самого GT.M |
27 янв 17, 16:52 [20154335] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
Опять не вполне понятно, а как работает в данном случае fastcgi? Впрочем, пожалуй я откланяюсь, дела. Удачи! |
||
27 янв 17, 17:12 [20154444] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2044 |
gluconat_ca, Не совсем удачно обьяснил ... FCGI.m. Ну по идеи и сам fcgi . |
27 янв 17, 18:01 [20154680] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: 1 2 [все] |
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M | ![]() |