Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 [2] все |
andrew000999 Member Откуда: Сообщений: 83 |
Валерий, не проще ли вместо игры с $zglb обращаться к разным областям по полной глобалной ссыле |
25 янв 17, 22:25 [20146872] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2042 |
andrew000999, Была и эта мысль, к глобалам без проблем, а как насчет рутин ? |
25 янв 17, 22:38 [20146921] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2042 |
Короче здесь так получается. Пользователь открыл сокет, получил данные и СРАЗУ же закрыл Второй, или тот кто по очереди естественно опять открывает и закрывает. Т.е. если пользователь перешел в другую область (глобальный каталог,рутин) он перебрасывает сюда и предыдущих без их ведома. Получается как бы ОДНО ПОЛЬЗОВАТЕЛЬСКОЕ приложение.. Конечно хочется не так, а неограниченное количество независимых соединений.
Я пробовал разные варианты, но вопрос так и остался. Может я что-то неправильно делаю ? |
|
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 Сообщений: 2042 |
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 Сообщений: 2042 |
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 Сообщений: 2042 |
gluconat_ca, Да, сам заметил что в глобал не самый хороший вариант.. Очень трудно отследить всех пользователей кто куда и что выбирает. Уже пробовал - началась путаница.. Но FCGI еще не знает $zg,$zro ни новые не старые значения !!! Я не знаю где брать локальные переменные - а было бы хорошо.. Потом уже. Когда пользователь нажимает на "область", я должен это фиксировать плюс, должен знать постоянно где находится дистрибутив. может что-то путаю, уже конец рабочего. |
26 янв 17, 17:41 [20150519] Ответить | Цитировать Сообщить модератору |
gluconat_ca Member Откуда: Сообщений: 105 |
Valeriu, честно говоря я в некотором замешательстве. Не могу взять в толк, в чём проблемы, особенно с локальными переменными. Просто тупо пишем:
|
||
26 янв 17, 18:44 [20150811] Ответить | Цитировать Сообщить модератору |
Valeriu Member Откуда: Chisinau Сообщений: 2042 |
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 Сообщений: 2042 |
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 Сообщений: 2042 |
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 Сообщений: 2042 |
gluconat_ca, Не совсем удачно обьяснил ... FCGI.m. Ну по идеи и сам fcgi . |
27 янв 17, 18:01 [20154680] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 [2] все |
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M | ![]() |