powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / [gtm] Ajax + WEB
21 сообщений из 46, страница 2 из 2
[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
21 сообщений из 46, страница 2 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / [gtm] Ajax + WEB
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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