powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / [gtm] Ajax + WEB
46 сообщений из 46, показаны все 2 страниц
[gtm] Ajax + WEB
    #39383030
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день !

Не пинайте сильно, я недавно работаю с ВЕБ приложениями и
иногда возникают вопросы, которые раньше
при работе с настольными приложениями не возникали...
Например при запросе к БД с помощью Ajax я получаю
некоторые данные для страницы.
Но. При этом у меня на стороне GT.M - $JOB может меняться
несколько раз. Т.е. получается при каких то действий на страницы,
JOB-ы меняются как им вздумается. Понятно, что это происходит
асинхронно, но почему, как-бы только один конект происходит ?
Это нормальное явление, или я что-то недопонимаю ?

Спасибо.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39383098
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuЭто нормальное явление, или я что-то недопонимаю ?
Нормальное.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39384056
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В эту же тему.
При работе с десктопными приложениями, при
открытие некой программы, 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" ?
Или так должно быть ?
Я растерян...
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39384076
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что конкретно смущает, такое же поведение и в Caché. Там процесс нужен только на время обработки запроса, и при каждом запросе процесс может быть любым. Есть возможность зафиксировать процесс для сессии, но способ не из рекомендуемых. Но в каше есть сессия в которой можно хранить данные, необходимые от запроса к запросу. Как это реализовано в GT.M не знаю, может быть тоже есть какой то идентификатор сессии, по которому можно хранить данные в глобале.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39384083
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuПочему ? Открыл и сразу закрыл ?
Я не силен в линуксовом синтаксисе...
Но идея поддержки вэба такова (упрощенно конечно).
- клиент обратился к серверу
- сервер выделил джоб из числа доступных и запустил указанную программу
- программа отработала и сервер забыл о клиенте

Для некой памяти о клиенте есть на сервере сессия... Она уникальна для "соединения". Пока клиент на завершит работу или не истечет таймаут ожидания действий от клиента...
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39384106
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa,
Понятно.
Есть такое. Есть сессия.
Я застопорился в моих программах, когда
переключаюсь между областями, хотя таковых
в GT.M нету. Я получаю их в переменных
s $zro=PATH
s $zgb=GLD
Всегда забрасывает в $gtm_dist (в каше как бы SYS)
Вот по этому мучаюсь и не знаю где копать ...
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39384161
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuЯ застопорился в моих программах, когда
переключаюсь между областями, хотя таковых
в GT.M нету.
Вот потому-то и нужно "забыть про области".
ValeriuВсегда забрасывает в $gtm_dist (в каше как бы SYS)
Это видать так настроена обработка вэб приложений...
ValeriuВот по этому мучаюсь и не знаю где копать ...
Как рассказывали мне более опытные в ГТ.М коллеги, тут на форуме, нужно не цепляться за кащейские подходы в работе на ГТ.М.
Т.е. не должно быть "переключений", как это делается в Каше, а должно быть правильное описание глобальной директории для полноценной работы приложения.

По деталям я тебя не проконсультирую, т.к. не вкурсе чего там у тебя и как.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39384268
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa,

а должно быть правильное описание глобальной директории для полноценной работы приложения.
:) Вот это и смущает... ОПИСАНА она у меня как надо.
Не спорю. Ошибка подкралась, есть она... Вот и хочу понять сущность.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39384330
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuОПИСАНА она у меня как надо
Тогда зачем "переключения"?
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39384343
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaТогда зачем "переключения"?
Я хотел пробовать как это себя ведет, когда имеем несколько БД
(допустим в разных директориях) , а приложение ОДНО для всех
в $gtm_dist. Типа студио для глобалов и рутин ..
Понятно, можно отдельно запустить для каждой, но ... не тот эффект !
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39390785
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо. Ответ как бы сам по себе понятен.
А как в Cache это происходит ?
Ведь там тоже отдельные области и отдельные БД.
Работает наверно один общий сервер WEB для всех областей из область %SYS
Значит тоже нужно как-то обращаться к этим областям ?...
Что, без переключения, или как ?
Как здесь работает механизм обработки данных средством WEB приложений ?
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39390817
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuХорошо.
А как в Cache это происходит ?Не уверен, что это как-то Вам поможет: слишком они разные.
В Caché можно как с переключением между областями, так и без такового, используя механизм отображения глобалов/программ/пакетов. Ещё можно настроить виртуальную область %ALL, объекты отображения из которой будут видны во всех областях.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39390824
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuКак здесь работает механизм обработки данных средством WEB приложений ?
Там в настройке вэб-приложения указывается имя области...
Но потом ты волен переключаться в любую область сервера Каше.

Но специфика глобальной директории так сильно отличается от понятия "область" в Каше...
Т.ч. параллели с Каше тебе не помогут.

Повторюсь...
Мне советовали более опытные ГТ.Мщики, пересмотреть свои взгляды на разработку ПО для ГТ.М... Делать не по кащейски, а по ГТ.Мовски.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39390827
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitиспользуя механизм отображения глобалов/программ
Аналог этого есть и в ГТ.М...
Но это помогает не всегда.
Т.е. при наличии аналога помогает. Проблемы появляются как раз в отсутствии аналогов.

Например нет "переключения" ГД как таковых... Если сравнивать "переключения ГД" с переключениями между областями.
И вот тут как раз наступает тупик "кащейского ПО".
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39390908
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaНапример нет "переключения" ГД как таковых... Если сравнивать "переключения ГД" с переключениями между областями.
Можно поподробнее, лучше на примере, чего "нет" в ГТ.М, может быть это заблуждение :)
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39390930
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gluconat_ca,
Есть там, только немножко не как в каше ZN, а:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
******
s $ZRO="/home/test/o(/home/test/r) /usr/gtm63A"  - переключает в катало Рутин ..
s $ZGB="/home/test/test.gld"  - переключает в область где глобалы                           
******
GET(SYSGLB,namespace)
 ; SYSGLB - system path(^sysconfig $gtm_dist)
 ; namespace - (test - example)
 s id=""
 s sid=$p(%fcgi("i","header","SID"),",")
 s ^uciID(sid)=""
 f  s id=$o(^uciID(id)) q:id=""  d
 . s dirrtn=^|SYSGLB|sysconfig(namespace,"r") ; return directory(r) 
 . s GLD=^|SYSGLB|sysconfig(namespace,"gld")
 . s PATH=^|SYSGLB|sysconfig(namespace,"path")
 . s $zro=PATH
 . s $zgb=GLD 
 . s %fcgi("o","stdout")=dirrtn_$c(13,10)
 . s %fcgi("o","header","Content-Type")="text/plain"
 q
 ;; 
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39390965
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu, всё равно не понял, в чём проблема (я не о приведённом коде, а о самой проблеме).

Есть переменные окружения:
Код: plaintext
1.
2.
gtm_dist
gtmgbldir
gtmroutines

Есть внутренние переменные:
Код: plaintext
1.
$ZG[BLDIR]
$ZRO[UTINES]

Или проблемы нет?
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39391001
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gluconat_ca,
Проблема есть...
В двух словах не обьяснить, но постараюсь.
Я работаю с NGINX + FCGI+ GT.M
GT.M используется свой сокет для связи с NGINX + FCGI

Есть два случая:

1. Если сокет открывается и после какого-то действия сразу закрывается,
то переключатся, как Вы заметили выше, можно БЕЗ проблем.
НО. Если другой пользователь переключается в это время, то и всех
остальных переключает в его каталог !

2. Если сокет держим открытым для других соединений - переключение НЕ РАБОТАЮТ,
только в одну "область" крутится

Туманно, но где-то так.
Я сам пока не могу понять почему так и вот решил по спросить, может что-то выявится.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39391035
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu,
Может нужно так:
Раз один м-процесс (fastcgi) обрабатывает запросы от разных пользователей и должен исполнять с разными $zg, то держите это в настройках для каждого пользователя и "смену области" меняйте в настройках, а не в текущем исполнении fastcgi.
А отработчики конкретных запросов должны сами делать смену $zg взяв нужное значение из настроек, а по окончании восстанавливать исходное. Можно даже этим озадачить сам m-процесс fastcgi, доработав его.:)
Попал в проблему или мимо?
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39391050
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gluconat_ca,
Согласен, где-то примерно так.
Я очень связал свои надежды с процессом $J , но здесь он оказывается безполезен ..
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39391052
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gluconat_caМожно поподробнее, лучше на примере, чего "нет" в ГТ.М, может быть это заблуждение :)
"Переключение" ГД не такое как переключение областей в Каше. Да и сама ГТ не есть область в Каше.
А рассматривать мои "проблемы" в этой теме я не вижу смысла...
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39391253
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriugluconat_ca,
Согласен, где-то примерно так.
Я очень связал свои надежды с процессом $J , но здесь он оказывается безполезен ..

то есть проблема в этом - что можно было бы взять в качестве IDа сессии, который позволил бы восстанавливать контекст ?
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39391298
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gluconat_ca,
Да. В этом контексте.
Но как это осуществить, я еще пока не представляю...
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39391301
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriuНо как это осуществить, я еще пока не представляю...
У самой страницы есть сессия...
https://itchief.ru/lessons/javascript/javascript-sessionstorage-and-localstorage
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39391303
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu, так у вас же в коде, приведённом выше, есть вот это:

Код: plaintext
s sid=$p(%fcgi("i","header","SID"),",")

Этот SID в куках передаётся, который формируется при первом ещё не "закукенном" запросе в FCGI.m
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39391655
andrew000999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валерий, не проще ли вместо игры с $zglb
обращаться к разным областям по полной глобалной ссыле
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39391659
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrew000999,

Была и эта мысль, к глобалам без проблем, а как насчет рутин ?
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39391781
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче здесь так получается.
Пользователь открыл сокет, получил данные и СРАЗУ же закрыл
Второй, или тот кто по очереди естественно опять открывает и закрывает.
Т.е. если пользователь перешел в другую область (глобальный каталог,рутин)
он перебрасывает сюда и предыдущих без их ведома.
Получается как бы ОДНО ПОЛЬЗОВАТЕЛЬСКОЕ приложение..
Конечно хочется не так, а неограниченное количество независимых соединений.
Вот код работы сокета:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
%FCGI ;;New Routine created and compiled tools "WEB-MEditor for GT.M" :[27.10.2016 16:16:43]
      ;; Written by Winfried Bantel
      ;; Published under Gnu Public License
START ;
    n $zt s $zt="do errhalt^%FCGI"
    ;s $zt="do Error^%FCGI"
    ;S TCPPORT=$S($G(^FCGI("port"))>0:^("port"),1:9999),TCPIO="|TCP|"_TCPPORT
    s TCPPORT=9999,TCPIO="|TCP|"_TCPPORT
    s nr=0
    o 0:(nowrap)
    d apiInit("listener",TCPPORT)
OPEN w "opening..."_TCPIO,!
    k (TCPIO,TCPPORT,nr)
    OPEN TCPIO:(ZLISTEN=TCPPORT_":TCP":DELIMITER="":ATTACH="listener":NOWRAP):0:"SOCKET" ;; Bantel
    u 0 w "opened",!
    U TCPIO WRITE /LISTEN(0)
LOOP    ;
    u 0 w "Waiting....",! u TCPIO W /WAIT(10) s k=$KEY i k'["CONNECT" g LOOP
    u 0 w k,!
LOOP2    u TCPIO
    r *version,*type,*requestIdB1,*requestIdB0 s requestId=256*requestIdB1+requestIdB0
    r *contentLengthB1,*contentLengthB0,*paddingLength,*reserved
    s contentLength=256*contentLengthB1+contentLengthB0
    s contentData="" i contentLength r contentData#contentLength
    s paddingData="" i paddingLength r paddingData#paddingLength
    u 0 w !,"Type ",type," RequestId=",requestId," l=",$L(contentData),!
    i type=1 s nr=nr+1 d  g LOOP2
    . f i=1:1:contentLength w " ",$A(contentData,i)
    . w !
    i type=4 s %fcgi("i","params")=$G(%fcgi("i","params"))_contentData d:'contentLength  g LOOP2
    . s pos=1 f  q:pos>$L(%fcgi("i","params"))  do
    . . s l1=$A(%fcgi("i","params"),pos),l2=$A(%fcgi("i","params"),pos+1)
    . . s %fcgi("i","header",$E(%fcgi("i","params"),pos+2,pos+2+l1-1))=$E(%fcgi("i","params"),pos+2+l1,pos+2+l1+l2-1)
    . . s pos=pos+l1+l2+2
    . k %fcgi("i","params")
    i type=5 w "Lenght: ",contentLength,!,contentData,! i contentLength>0 s %fcgi("i","stdin")=$G(%fcgi("i","stdin"))_contentData g LOOP2
    ; Jetzt sind alle Daten da
    ;
    s %fcgi("o","header","Set-Cookie")="SID="_$S($G(%fcgi("i","header","SID"))="":($P($H,",")_"00000"+$P($H,",",2))_nr_",1",1:$P(%fcgi("i","header","SID"),",")_","_($P(%fcgi("i","header","SID"),",",2)+1))
     ; ******* SID and Job ????
    s sid=$p($p(%fcgi("o","header","Set-Cookie"),"SID=",2),",",1)
    s ^fcgilog(sid,"SID")=TCPPORT_"`"_$j
    s ^fcgilog("SID")=sid
    i $G(%fcgi("i","header","HTTP_CONTENT_TYPE"))="application/x-www-form-urlencoded" d HTMLVARDECODE(%fcgi("i","stdin"),"%fcgi(""i"",""_POST""")
    i %fcgi("i","header","QUERY_STRING")'="" d HTMLVARDECODE(%fcgi("i","header","QUERY_STRING"),"%fcgi(""i"",""_GET""")
    ;w !,"###############",! zwr %fcgi w !,"###############",!
    ;w $P(%fcgi("i","header","DOCUMENT_URI"),"/",3)
    ; Jetzt auf Programme verteilen
    s t=$G(^FCGI("DOCUMENT_URI",$P(%fcgi("i","header","DOCUMENT_URI"),"/",1,3)))
    w "branch to ",t,!
    d:t'="" @t w:t="" "^FCGI(""DOCUMENT_URI"","""_$P(%fcgi("i","header","DOCUMENT_URI"),"/",1,3)_""") not found",!
    ;
    w !,"###############",! zwr %fcgi w !,"###############",!
    s (ind,txt)="" f  s ind=$O(%fcgi("o","header",ind)) q:ind=""  s txt=txt_ind_": "_%fcgi("o","header",ind)_$C(13,10)
    s txt=txt_$C(13,10)
    u TCPIO
    w $C(1,6,requestIdB1,requestIdB0,$L(txt)\256,$L(txt)#256,0,0),txt
    i $G(%fcgi("o","stdout"))'="" w $C(1,6,requestIdB1,requestIdB0,$L(%fcgi("o","stdout"))\256,$L(%fcgi("o","stdout"))#256,0,0),%fcgi("o","stdout")
    w $C(1,6,requestIdB1,requestIdB0,0,0,0,0) ; stdout Complete
    w $C(1,3,requestIdB1,requestIdB0,0,8,0,0),$C(0,0,0,0,0,0,0,0) ; Request Complete
    u 0 c TCPIO g OPEN
    ;
record(type,data)   ; Not used
    w $C(1,type,requestIdB1,requestIdB0,$L(data)\256,$L(data)#256,0,0)_data
    q
    ;
init    ;  Not used
    n (fcgi)
    s fcgi("type",1,"FCGI_BEGIN_REQUEST")=1
    s fcgi("type",1,"FCGI_ABORT_REQUEST")=2
    s fcgi("type",1,"FCGI_END_REQUEST")=3
    s fcgi("type",1,"FCGI_PARAMS")=4
    s fcgi("type",1,"FCGI_STDIN")=5
    s fcgi("type",1,"FCGI_STDOUT")=6
    s fcgi("type",1,"FCGI_STDERR")=7
    s fcgi("type",1,"FCGI_DATA")=8
    s fcgi("type",1,"FCGI_GET_VALUES")=9
    s fcgi("type",1,"FCGI_GET_VALUES_RESULT")=10
    s fcgi("type",1,"FCGI_UNKNOWN_TYPE")=0
    ;
HTTPSTATUS401(realm)
    s %fcgi("o","header","Status")="401 Unauthorized" ;
    s %fcgi("o","header","WWW-Authenticate")="Basic realm="""_realm_"""" ;
    s %fcgi("o","header","Content-Type")="text/plain",%fcgi("o","stdout")="Unauthorized"
    q
    ;
HTMLVARDECODE(data,var)  ; Decodiert nach HTML-Variablen-Standard
    w data,!,var,!
    n l,i,ind,val,t
    s l=$L(data,"&") f i=1:1:l s t=$P(data,"&",i) d
    . ;s ind=$$CONVERT($TR($P(t,"="),lower,upper)),val=$$CONVERT($P(t,"=",2))
    . s ind=$$CONVERT($P(t,"=")),val=$$CONVERT($P(t,"=",2))
    . i $L(ind) s @(var_","""_ind_""")")=val w ind,": ",val,!
    q
    ;
HEX2DEZ(dez)  ;
    n (dez) s hex=0,dez=$TR(dez,"abcdef","ABCDEF")
    f i=1:1:$L(dez) s hex=hex*16+$s($A(dez,i)>59:$A(dez,i)-55,1:$E(dez,i))
    q hex
    ;
CONVERT(t)  ;
    n (t)
    s t=$TR(t,"+"," "),p=0
    f  s p=$F(t,"%",p) q:p<1  s t=$E(t,1,p-2)_$C($$HEX2DEZ($E(t,p,p+1)))_$E(t,p+2,255)
    q t
    ;
out(txt) ;
 s %fcgi("o","stdout")=%fcgi("o","stdout")_txt
 q
 ;; 
apiInit(server,port)
 s ^fcgilog(server,"FCGISERVER")=port_"`"_$j
 q    
 ; 
Error
 s $zt=""
 s %fcgi("o","stdout")=%fcgi("o","stdout")_" <script type=""text/javascript"">"_$c(10)
    s $et="",$ec="",$zt=""
    s output=$zs
    s $zs=0
 s %fcgi("o","stdout")=%fcgi("o","stdout")_" alert ("""_output_""")"_$c(10)
 s %fcgi("o","stdout")=%fcgi("o","stdout")_" </script>"_$c(10)
 ;d out(%fcgi("o","stdout"))
 ;c TCPIO g START
 q
 ;;
errhalt()
 ;;The error handler to stop. You can see the error in the file and that happened.
 ;;
 set $ztrap="errhalt"
 new file,dev
 set dev=$io
 set file="/usr/errsocket.log"
 open file:(append:nofixed:wrap:noreadonly:chset="M")
 use file
 write "Error at "_$horolog,!,$zstatus,!
 zshow "SIDV"
 close file
 use dev
 halt
 q
 ;;
Буду благодарен за любую подсказку, как можно подправить работу сокета
Я пробовал разные варианты, но вопрос так и остался.
Может я что-то неправильно делаю ?
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39391852
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu,
Работу этого сервера можно не менять.

Он работает в определённом контексте ($zg,$zro), который "отработчики" конкретных запросов должны по выходу восстанавливать. Вот участок кода, где происходит косвенный вызов "отработчика"
Код: plaintext
1.
2.
    s t=$G(^FCGI("DOCUMENT_URI",$P(%fcgi("i","header","DOCUMENT_URI"),"/",1,3)))
    w "branch to ",t,!
    d:t'="" @t w:t="" "^FCGI(""DOCUMENT_URI"","""_$P(%fcgi("i","header","DOCUMENT_URI"),"/",1,3)_""") not found",!
А вот то, что вызывается по @t, должно:

1. сохранить текущее значение $zg и $zro
2. Установить нужное значение $zg и $zro
3. Выполнить нужный код
4. Восстановить сохранённое в п.1 и выйти
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39392113
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В дополнении к вышесказанному.
Конечно, по-правильному, все эти пункты лучше вставить в сам FCGI.m, чтобы не дублировать во многих местах.
Добавить процедурку в FCGI.m, типа такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
startappl(appl)
 n (appl,%fcgi)  ;здесь может что ещё нужно вставить, что надо 
 ;сохранить $zg и , если надо $zro
 ;установить нужные $zg, $zro (здесь как раз cid и может пригодиться)
 ;настроить обработчик ошибок, если нужно
 d @appl
 ;восстановить $zg,$zro
 q
а в основном коде FCGI заменить
Код: plaintext
d:t'="" @t
на
Код: plaintext
d:t'="" startappl(t)
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39392128
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gluconat_ca,
Спасибо большое.
Что-то зашевелилось с таким подходом.
Да. Приходится менять везде...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
FCGIUCI ;;New Routine created and compiled tools "WEB-MEditor for GT.M" :[29.11.2016 09:05:42]
 s nms=$P(%fcgi("i","header","DOCUMENT_URI"),"/",4)
 s dir=$P(%fcgi("i","header","DOCUMENT_URI"),"/*",2)
 s:nms=1 nms="SYS"
 s n=0
 i %fcgi("i","header","REQUEST_METHOD")="GET" d GET(dir,nms) q
 ;;
GET(SYSGLB,namespace)
 ; SYSGLB - system path(^sysconfig $gtm_dist)
 ; namespace - (cadre - by example)
 s id=""
 s sid=$p(%fcgi("i","header","SID"),",")
 s ^uciID(sid)=""
 s ^uciID(sid,"oldzro")=$zro
 s ^uciID(sid,"oldzgb")=$zgb
 f  s id=$o(^uciID(id)) q:id=""  d
 . s dirrtn=^|SYSGLB|sysconfig(namespace,"r") ; return directory(r) to call routines
 . s GLD=^|SYSGLB|sysconfig(namespace,"gld")
 . s PATH=^|SYSGLB|sysconfig(namespace,"patch")
 . i id=sid d
 . . s ^uciID(sid,"newzro")=PATH
 . . s ^uciID(sid,"newzgb")=GLD
 . . s %fcgi("o","stdout")=dirrtn_$c(13,10)
 . . s %fcgi("o","header","Content-Type")="text/plain"
 q
 ;;
Счс обдумаю как Вы предлагаете.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39392230
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu,

А зачем в цикле перебирать:

Код: plaintext
1.
2.
3.
4.
f  s id=$o(^uciID(id)) q:id=""  d
 . s dirrtn=^|SYSGLB|sysconfig(namespace,"r") ; return directory(r) to call routines
 . s GLD=^|SYSGLB|sysconfig(namespace,"gld")
 . s PATH=^|SYSGLB|sysconfig(namespace,"patch")
 . i id=sid d

Если можно сразу:

Код: plaintext
1.
2.
3.
 d:$d(^uciID(cid))
 . s dirrtn=^|SYSGLB|sysconfig(namespace,"r") ; return directory(r) to call routines
 . s GLD=^|SYSGLB|sysconfig(namespace,"gld")
 . s PATH=^|SYSGLB|sysconfig(namespace,"patch")
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39392294
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В продолжении.

и это лишнее
Код: plaintext
d:$d(^uciID(cid))
так как чуть выше есть
Код: plaintext
s ^uciID(cid)=""
, так что узел заведомо есть.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39392316
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gluconat_ca,
Придется писать маленький бат-ник все таки ..
Где указать системную директорию (gtm_dist)
У меня например /usr/gtm63A/mumps.gld
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
startappl(appl)
 n (appl,%fcgi)  ;здесь может что ещё нужно вставить, что надо 
 ;сохранить $zg и , если надо $zro
 ;установить нужные $zg, $zro (здесь как раз cid и может пригодиться)
 ;настроить обработчик ошибок, если нужно
 s sid=$p(%fcgi("i","header","SID"),",")
 i '$d(^|"/usr/gtm63A/mumps.gld"|uciID(sid,"newzro")) s ^|"/usr/gtm63A/mumps.gld"|uciID(sid,"newzro")=$zro
 i '$d(^|"/usr/gtm63A/mumps.gld"|uciID(sid,"newzgb")) s ^|"/usr/gtm63A/mumps.gld"|uciID(sid,"newzgb")=$zgb
 s $zro=^|"/usr/gtm63A/mumps.gld"|uciID(sid,"newzro")
 s $zgb=^|"/usr/gtm63A/mumps.gld"|uciID(sid,"newzgb")
 d @appl
 ;восстановить $zg,$zro
 s $zro=^|"/usr/gtm63A/mumps.gld"|uciID(sid,"oldzro")
 s $zgb=^|"/usr/gtm63A/mumps.gld"|uciID(sid,"oldzgb")
 q
 ;
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39392338
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu,

Сохранять текущие $zg,$zro можно же и в локальных переменных, я собственно и имел это ввиду.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39392356
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gluconat_ca,
Да, сам заметил что в глобал не самый хороший вариант..
Очень трудно отследить всех пользователей кто куда и что выбирает.
Уже пробовал - началась путаница..
Но FCGI еще не знает $zg,$zro ни новые не старые значения !!!
Я не знаю где брать локальные переменные - а было бы хорошо..
Потом уже.
Когда пользователь нажимает на "область", я должен это фиксировать
плюс, должен знать постоянно где находится дистрибутив.
может что-то путаю, уже конец рабочего.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39392407
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu,
честно говоря я в некотором замешательстве.
Не могу взять в толк, в чём проблемы, особенно с локальными переменными. Просто тупо пишем:
Код: plaintext
1.
2.
3.
4.
s zg=$zg
s zro=$zro
...
s $zg=zg
s $zro=zro
сорри, но, похоже особо ничего добавить в ближайшее время уже не смогу.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39392694
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gluconat_ca,
Да.. Вот что значит старые привычки.
Я никак не могу отходит от старых понятий работ М систем.
Поплыл я далеко и совсем не туда. Прошу прощения. Видимо здесь гораздо даже проще, чем я себя представлял.
Выкинуть из головы надо такие понятия как $job и такое, если ты конектился - ты хозяин положения.
У меня как система работает:
Во первых если создается БД, то программа автоматом пишит
в глобаль все что относится к ней для дальнейшего обращения:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
^sysconfig("test","database")="/home/test/test.dat"
^sysconfig("test","gld")="/home/test/test.gld"
^sysconfig("test","journal")="/home/test/test.mjl"
^sysconfig("test","o")="/home/test/o"
^sysconfig("test","patch")="/home/test/o(/home/test/r) /usr/gtm63A"
^sysconfig("test","r")="/home/test/r"
^sysconfig("web","database")="/home/web/web.dat"
^sysconfig("web","gld")="/home/web/web.gld"
^sysconfig("web","journal")=""
^sysconfig("web","o")="/home/web/o"
^sysconfig("web","patch")="/home/web/o(/home/web/r) /usr/gtm63A"
^sysconfig("web","r")="/home/web/r"
Я уже эти настройки дальше использую при вызовах.
Исходя из того, что не имеет значения сколько пользователей работают одновременно,
просто при каждом действие (любое!) нужно указать системе где пользователь НАХОДИТСЯ !
Я это заметил почти у всех разработчиков ПО, которые работают с GT.M - WEB
У них даже функции специальные есть (db.open, db.close) и меня всегда это удивляло,
зачем постоянно открывать и закрывать ? ..
Закончил действие, закрыл сокет и т.д. - здесь это уже выступает как правило.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 o tcpdev:(ZLISTEN=port_":TCP":NODELIMITER:ZNODELAY:ATTACH="listener"):timeo:"SOCKET"
 e  s ^fcgilog($job)="-1,NotOpen" q
 ;u tcpdev:morereadtime=100
 u tcpdev
 w /listen(1)
 f  d  q:$key]""
 . w /wait(timeo)
 . i $key]"" q
 s socket=$p($key,"|",2)
 c tcpdev:(SOCKET="listener") j listen^test
loop 
 u tcpdev:(NODELIMITER:ZNODELAY:SOCKET=socket)
 ....
 ....
 w $C(1,3,requestIdB1,requestIdB0,0,8,0,0),$C(0,0,0,0,0,0,0,0) ; Request Complete
 s nr=0
 c tcpdev:(SOCKET=socket)
 u tcpdev
Вы правильно заметили, что нужно указать именно здесь системе, где находится пользователь
и какое действие нужно выполнить, т.е переключаться, выполнить действие и закрываться.gluconat_castartappl(appl)
 n (appl,%fcgi)  ;здесь может что ещё нужно вставить, что надо 
 ;сохранить $zg и , если надо $zro
 ;установить нужные $zg, $zro (здесь как раз cid и может пригодиться)
 ;настроить обработчик ошибок, если нужно
 d @appl
 ;восстановить $zg,$zro
 q
а в основном коде FCGI заменить
d:t'="" @t
на
d:t'="" startappl(t)Мне просто нужно в своих Ajax вызовах указать в какой "области" происходят действия и ВСЕ.
Уверен, что это сработает.
Спасибо.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39392698
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu,
Давайте отвлечёмся от несущественного, от сокетов, фастцги и пр.
У вас есть некая m-программа, назовём её S, которая запускается в неком контексте, имеет доступ к файлу с глобалами, которые ей нужны для выполнения своей функции, в частности выполнения (командой DO) некоторого определённого набора программ X i . Эти программы должны в свою очередь запускаться с предварительно настроенным контекстом ($zg,$zro) С i . Выбор программы для запуска определяется путём получения неких параметров извне, способ получения значения не имеет. Вопрос в контексте для вызова, как его определить. Это тоже вопрос соглашения, он не может быть универсальным. Как задумаете, так и будет работать.
Вот варианты наобум. Для каждой X i :
1. иметь заранее определённый C i
2. иметь заранее определённый набор C ij , где второй индекс j определяется получением извне
3. все данные для контекста получать извне.
и т.д.
Только нужно иметь ввиду, что, если есть какая либо параметризация в определении контекста, как в п.2 и п.3, то нужно определиться для случая "по умолчанию", когда параметр не передаётся.

В любом случае нужны некие, заранее формируемые, настройки (конфигурации) программы S в рамках которых она и будет работать.

Вот такое у меня сложилось представление. Может быть изложенное всё мимо?
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39392701
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu,
опубликовал, не успев прочитать ответ 20151973 .
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39392759
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gluconat_ca,
Еще заметил один нюанс ...
В первом варианте, что от Бантела, сокет открывается, действие, потом полностью закрывается.
Я пробовал еще один вариант, как указал ниже.
Открываем, записываем в переменную, закрываем и ждем нового подключения, давая предыдущему
соединения отработать до конца.
Так мы большую независимость представляем пользователю. Плюс использования и SID.
Код: plaintext
1.
2.
3.
 s socket=$p($key,"|",2)
 c tcpdev:(SOCKET="listener") j listen^test
loop 
 u tcpdev:(NODELIMITER:ZNODELAY:SOCKET=socket)
Не знаю насколько я прав.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39392822
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не вполне понимаю, что имеется ввиду под "отработать до конца"
В оригинальном FCGI.m сокет держится открытым пока идут определённые типы запросов (см. fcgi("type") ) и закрывается после отработки запроса и отправки наверх FCGI_END_REQUEST. После сокет закрывается и переходит к новой итерации приёма запроса. Всё по спецификации fastcgi.
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39393192
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu,
Сразу не понял о чём речь. Ничего не скажу о правильности использования сокетов (нужно погружаться в документацию чтобы вспомнить детали). В новых версиях gt.m есть и другой подход, не рестарт слушателя порта в новом JOBе, а запуск процесса обработчика с передачей ему хендлера (сокета), а сам процесс опять приступает к прослушке порта. Мне, лично такой подход больше нравится. К тому же в первом варианте нужно обеспечить передачу из процесса в процесс (слушатели) значение переменной nr, которая растёт от запроса к запросу и которая используется для генерации cid, иначе они (cid) могут продублироваться для разных запросов, приходящих в пределах одной секунды.
Могу посоветовать, в дополнении к документации, в качестве примера использования - web-сервер DataBalet https://github.com/lparenteau/DataBallet
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39393285
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gluconat_ca,

Я в курсе, даже пробовал, но смутно до меня доходит,
как использовать дочерний процесс с передачей его новым job-ом
В Каше просто и ясно. Здесь закручено очень.
Да и простого примера не хватает.
Я когда их спрашиваю, они сразу советуют пользоваться XINETD.
Я пробовал и этот вариант - РАБОТАЕТ! XINETD+ FCGI.
Т.Е. без использования родного сокета самого GT.M
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39393317
gluconat_ca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeriu Я пробовал и этот вариант - РАБОТАЕТ! XINETD+ FCGI.
Опять не вполне понятно, а как работает в данном случае fastcgi? Впрочем, пожалуй я откланяюсь, дела. Удачи!
...
Рейтинг: 0 / 0
[gtm] Ajax + WEB
    #39393371
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gluconat_ca,
Не совсем удачно обьяснил ...
FCGI.m.
Ну по идеи и сам fcgi .
...
Рейтинг: 0 / 0
46 сообщений из 46, показаны все 2 страниц
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / [gtm] Ajax + WEB
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]