Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
Добрый день !

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

Спасибо.
12 янв 17, 12:30    [20097844]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12910
Valeriu
Это нормальное явление, или я что-то недопонимаю ?

Нормальное.
12 янв 17, 13:16    [20098145]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
В эту же тему.
При работе с десктопными приложениями, при
открытие некой программы, 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]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
DAiMor
Member

Откуда: Volzhsky -> Moscow -> CZ, Brno
Сообщений: 2429
А что конкретно смущает, такое же поведение и в Caché. Там процесс нужен только на время обработки запроса, и при каждом запросе процесс может быть любым. Есть возможность зафиксировать процесс для сессии, но способ не из рекомендуемых. Но в каше есть сессия в которой можно хранить данные, необходимые от запроса к запросу. Как это реализовано в GT.M не знаю, может быть тоже есть какой то идентификатор сессии, по которому можно хранить данные в глобале.
13 янв 17, 13:11    [20102424]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12910
Valeriu
Почему ? Открыл и сразу закрыл ?

Я не силен в линуксовом синтаксисе...
Но идея поддержки вэба такова (упрощенно конечно).
- клиент обратился к серверу
- сервер выделил джоб из числа доступных и запустил указанную программу
- программа отработала и сервер забыл о клиенте

Для некой памяти о клиенте есть на сервере сессия... Она уникальна для "соединения". Пока клиент на завершит работу или не истечет таймаут ожидания действий от клиента...
13 янв 17, 13:16    [20102444]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
krvsa,
Понятно.
Есть такое. Есть сессия.
Я застопорился в моих программах, когда
переключаюсь между областями, хотя таковых
в GT.M нету. Я получаю их в переменных
s $zro=PATH
s $zgb=GLD
Всегда забрасывает в $gtm_dist (в каше как бы SYS)
Вот по этому мучаюсь и не знаю где копать ...
13 янв 17, 13:31    [20102552]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12910
Valeriu
Я застопорился в моих программах, когда
переключаюсь между областями, хотя таковых
в GT.M нету.

Вот потому-то и нужно "забыть про области".
Valeriu
Всегда забрасывает в $gtm_dist (в каше как бы SYS)

Это видать так настроена обработка вэб приложений...
Valeriu
Вот по этому мучаюсь и не знаю где копать ...

Как рассказывали мне более опытные в ГТ.М коллеги, тут на форуме, нужно не цепляться за кащейские подходы в работе на ГТ.М.
Т.е. не должно быть "переключений", как это делается в Каше, а должно быть правильное описание глобальной директории для полноценной работы приложения.

По деталям я тебя не проконсультирую, т.к. не вкурсе чего там у тебя и как.
13 янв 17, 14:05    [20102779]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
krvsa,

а должно быть правильное описание глобальной директории для полноценной работы приложения.

:) Вот это и смущает... ОПИСАНА она у меня как надо.
Не спорю. Ошибка подкралась, есть она... Вот и хочу понять сущность.
13 янв 17, 15:26    [20103349]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12910
Valeriu
ОПИСАНА она у меня как надо

Тогда зачем "переключения"?
13 янв 17, 16:20    [20103672]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
krvsa
Тогда зачем "переключения"?

Я хотел пробовать как это себя ведет, когда имеем несколько БД
(допустим в разных директориях) , а приложение ОДНО для всех
в $gtm_dist. Типа студио для глобалов и рутин ..
Понятно, можно отдельно запустить для каждой, но ... не тот эффект !
13 янв 17, 16:37    [20103735]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
Хорошо. Ответ как бы сам по себе понятен.
А как в Cache это происходит ?
Ведь там тоже отдельные области и отдельные БД.
Работает наверно один общий сервер WEB для всех областей из область %SYS
Значит тоже нужно как-то обращаться к этим областям ?...
Что, без переключения, или как ?
Как здесь работает механизм обработки данных средством WEB приложений ?
25 янв 17, 09:37    [20142904]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3080
Блог
Valeriu
Хорошо.
А как в Cache это происходит ?
Не уверен, что это как-то Вам поможет: слишком они разные.
В Caché можно как с переключением между областями, так и без такового, используя механизм отображения глобалов/программ/пакетов. Ещё можно настроить виртуальную область %ALL, объекты отображения из которой будут видны во всех областях.
25 янв 17, 10:12    [20143038]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12910
Valeriu
Как здесь работает механизм обработки данных средством WEB приложений ?

Там в настройке вэб-приложения указывается имя области...
Но потом ты волен переключаться в любую область сервера Каше.

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

Повторюсь...
Мне советовали более опытные ГТ.Мщики, пересмотреть свои взгляды на разработку ПО для ГТ.М... Делать не по кащейски, а по ГТ.Мовски.
25 янв 17, 10:17    [20143067]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12910
servit
используя механизм отображения глобалов/программ

Аналог этого есть и в ГТ.М...
Но это помогает не всегда.
Т.е. при наличии аналога помогает. Проблемы появляются как раз в отсутствии аналогов.

Например нет "переключения" ГД как таковых... Если сравнивать "переключения ГД" с переключениями между областями.
И вот тут как раз наступает тупик "кащейского ПО".
25 янв 17, 10:22    [20143087]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
krvsa
Например нет "переключения" ГД как таковых... Если сравнивать "переключения ГД" с переключениями между областями.
Можно поподробнее, лучше на примере, чего "нет" в ГТ.М, может быть это заблуждение :)
25 янв 17, 11:46    [20143584]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
gluconat_ca,
Есть там, только немножко не как в каше ZN, а:
******
$ZRO="/home/test/o(/home/test/r) /usr/gtm63A"  - переключает в катало Рутин ..
$ZGB="/home/test/test.gld"  - переключает в область где глобалы                           
******
GET(SYSGLB,namespace)
 
; SYSGLB - system path(^sysconfig $gtm_dist)
 ; namespace - (test - example)
 
id=""
 
sid=$p(%fcgi("i","header","SID"),",")
 
^uciID(sid)=""
 
f  s id=$o(^uciID(id)) q:id=""  d
 
dirrtn=^|SYSGLB|sysconfig(namespace,"r"; return directory(r) 
 
GLD=^|SYSGLB|sysconfig(namespace,"gld")
 . 
PATH=^|SYSGLB|sysconfig(namespace,"path")
 . 
$zro=PATH
 
$zgb=GLD 
 
%fcgi("o","stdout")=dirrtn_$c(13,10)
 . 
%fcgi("o","header","Content-Type")="text/plain"
 
q
 
;; 
25 янв 17, 12:02    [20143696]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
Valeriu, всё равно не понял, в чём проблема (я не о приведённом коде, а о самой проблеме).

Есть переменные окружения:
gtm_dist
gtmgbldir
gtmroutines

Есть внутренние переменные:
$ZG[BLDIR]
$ZRO[UTINES]

Или проблемы нет?
25 янв 17, 12:26    [20143840]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
gluconat_ca,
Проблема есть...
В двух словах не обьяснить, но постараюсь.
Я работаю с NGINX + FCGI+ GT.M
GT.M используется свой сокет для связи с NGINX + FCGI

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

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

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

Туманно, но где-то так.
Я сам пока не могу понять почему так и вот решил по спросить, может что-то выявится.
25 янв 17, 12:46    [20143963]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
Valeriu,
Может нужно так:
Раз один м-процесс (fastcgi) обрабатывает запросы от разных пользователей и должен исполнять с разными $zg, то держите это в настройках для каждого пользователя и "смену области" меняйте в настройках, а не в текущем исполнении fastcgi.
А отработчики конкретных запросов должны сами делать смену $zg взяв нужное значение из настроек, а по окончании восстанавливать исходное. Можно даже этим озадачить сам m-процесс fastcgi, доработав его.:)
Попал в проблему или мимо?
25 янв 17, 13:06    [20144085]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
gluconat_ca,
Согласен, где-то примерно так.
Я очень связал свои надежды с процессом $J , но здесь он оказывается безполезен ..
25 янв 17, 13:16    [20144134]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12910
gluconat_ca
Можно поподробнее, лучше на примере, чего "нет" в ГТ.М, может быть это заблуждение :)

"Переключение" ГД не такое как переключение областей в Каше. Да и сама ГТ не есть область в Каше.
А рассматривать мои "проблемы" в этой теме я не вижу смысла...
25 янв 17, 13:17    [20144142]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
Valeriu
gluconat_ca,
Согласен, где-то примерно так.
Я очень связал свои надежды с процессом $J , но здесь он оказывается безполезен ..


то есть проблема в этом - что можно было бы взять в качестве IDа сессии, который позволил бы восстанавливать контекст ?
25 янв 17, 15:35    [20145127]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
gluconat_ca,
Да. В этом контексте.
Но как это осуществить, я еще пока не представляю...
25 янв 17, 16:19    [20145478]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12910
Valeriu
Но как это осуществить, я еще пока не представляю...

У самой страницы есть сессия...
https://itchief.ru/lessons/javascript/javascript-sessionstorage-and-localstorage
25 янв 17, 16:23    [20145505]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
Valeriu, так у вас же в коде, приведённом выше, есть вот это:

sid=$p(%fcgi("i","header","SID"),",")

Этот SID в куках передаётся, который формируется при первом ещё не "закукенном" запросе в FCGI.m
25 янв 17, 16:24    [20145516]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
andrew000999
Member

Откуда:
Сообщений: 83
Валерий, не проще ли вместо игры с $zglb
обращаться к разным областям по полной глобалной ссыле
25 янв 17, 22:25    [20146872]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
andrew000999,

Была и эта мысль, к глобалам без проблем, а как насчет рутин ?
25 янв 17, 22:38    [20146921]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
Короче здесь так получается.
Пользователь открыл сокет, получил данные и СРАЗУ же закрыл
Второй, или тот кто по очереди естественно опять открывает и закрывает.
Т.е. если пользователь перешел в другую область (глобальный каталог,рутин)
он перебрасывает сюда и предыдущих без их ведома.
Получается как бы ОДНО ПОЛЬЗОВАТЕЛЬСКОЕ приложение..
Конечно хочется не так, а неограниченное количество независимых соединений.
+ Вот код работы сокета:
%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 ;
    
$zt s $zt="do errhalt^%FCGI"
    ;s $zt="do Error^%FCGI"
    ;S TCPPORT=$S($G(^FCGI("port"))>0:^("port"),1:9999),TCPIO="|TCP|"_TCPPORT
    
TCPPORT=9999,TCPIO="|TCP|"_TCPPORT
    
nr=0
    
0:(nowrap)
    
apiInit("listener",TCPPORT)
OPEN "opening..."_TCPIO,!
    
(TCPIO,TCPPORT,nr)
    
OPEN TCPIO:(ZLISTEN=TCPPORT_":TCP":DELIMITER="":ATTACH="listener":NOWRAP):0:"SOCKET" ;; Bantel
    
"opened",!
    
TCPIO WRITE /LISTEN(0)
LOOP    ;
    
"Waiting....",! TCPIO /WAIT(10) k=$KEY i k'["CONNECT" LOOP
    
k,!
LOOP2    TCPIO
    
*version,*type,*requestIdB1,*requestIdB0 requestId=256*requestIdB1+requestIdB0
    
*contentLengthB1,*contentLengthB0,*paddingLength,*reserved
    
contentLength=256*contentLengthB1+contentLengthB0
    
contentData="" contentLength contentData#contentLength
    
paddingData="" paddingLength paddingData#paddingLength
    
!,"Type ",type," RequestId=",requestId," l=",$L(contentData),!
    
type=1 nr=nr+1 d  g LOOP2
    
i=1:1:contentLength " ",$A(contentData,i)
    . 
!
    
type=4 %fcgi("i","params")=$G(%fcgi("i","params"))_contentData d:'contentLength  LOOP2
    
pos=1 f  q:pos>$L(%fcgi("i","params"))  do
    
. . l1=$A(%fcgi("i","params"),pos),l2=$A(%fcgi("i","params"),pos+1)
    . . 
%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)
    . . 
pos=pos+l1+l2+2
    . 
%fcgi("i","params")
    
type=5 "Lenght: ",contentLength,!,contentData,! contentLength>0 %fcgi("i","stdin")=$G(%fcgi("i","stdin"))_contentData LOOP2
    
; Jetzt sind alle Daten da
    ;
    
%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 ????
    
sid=$p($p(%fcgi("o","header","Set-Cookie"),"SID=",2),",",1)
    
^fcgilog(sid,"SID")=TCPPORT_"`"_$j
    s 
^fcgilog("SID")=sid
    
i $G(%fcgi("i","header","HTTP_CONTENT_TYPE"))="application/x-www-form-urlencoded" HTMLVARDECODE(%fcgi("i","stdin"),"%fcgi(""i"",""_POST""")
    
%fcgi("i","header","QUERY_STRING")'="" 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
    
t=$G(^FCGI("DOCUMENT_URI",$P(%fcgi("i","header","DOCUMENT_URI"),"/",1,3)))
    
"branch to ",t,!
    
d:t'="" @w:t="" "^FCGI(""DOCUMENT_URI"","""_$P(%fcgi("i","header","DOCUMENT_URI"),"/",1,3)_""") not found",!
    
;
    
!,"###############",! zwr %fcgi !,"###############",!
    
(ind,txt)="" f  s ind=$O(%fcgi("o","header",ind)) q:ind=""  txt=txt_ind_": "_%fcgi("o","header",ind)_$C(13,10)
    
txt=txt_$C(13,10)
    
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
    
TCPIO 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
    
(fcgi)
    
fcgi("type",1,"FCGI_BEGIN_REQUEST")=1
    
fcgi("type",1,"FCGI_ABORT_REQUEST")=2
    
fcgi("type",1,"FCGI_END_REQUEST")=3
    
fcgi("type",1,"FCGI_PARAMS")=4
    
fcgi("type",1,"FCGI_STDIN")=5
    
fcgi("type",1,"FCGI_STDOUT")=6
    
fcgi("type",1,"FCGI_STDERR")=7
    
fcgi("type",1,"FCGI_DATA")=8
    
fcgi("type",1,"FCGI_GET_VALUES")=9
    
fcgi("type",1,"FCGI_GET_VALUES_RESULT")=10
    
fcgi("type",1,"FCGI_UNKNOWN_TYPE")=0
    
;
HTTPSTATUS401(realm)
    
%fcgi("o","header","Status")="401 Unauthorized" ;
    
%fcgi("o","header","WWW-Authenticate")="Basic realm="""_realm_"""" ;
    
%fcgi("o","header","Content-Type")="text/plain",%fcgi("o","stdout")="Unauthorized"
    
q
    
;
HTMLVARDECODE(data,var)  ; Decodiert nach HTML-Variablen-Standard
    
data,!,var,!
    
l,i,ind,val,t
    
l=$L(data,"&"i=1:1:t=$P(data,"&",id
    
;s ind=$$CONVERT($TR($P(t,"="),lower,upper)),val=$$CONVERT($P(t,"=",2))
    
ind=$$CONVERT($P(t,"=")),val=$$CONVERT($P(t,"=",2))
    . 
i $L(ind@(var_","""_ind_""")")=val ind,": ",val,!
    
q
    
;
HEX2DEZ(dez)  ;
    
(dezhex=0,dez=$TR(dez,"abcdef","ABCDEF")
    
i=1:1:$L(dezhex=hex*16+$s($A(dez,i)>59:$A(dez,i)-55,1:$E(dez,i))
    
hex
    
;
CONVERT(t)  ;
    
(t)
    
t=$TR(t,"+"," "),p=0
    
f  s p=$F(t,"%",pq:p<1  t=$E(t,1,p-2)_$C($$HEX2DEZ($E(t,p,p+1)))_$E(t,p+2,255)
    
t
    
;
out(txt) ;
 
%fcgi("o","stdout")=%fcgi("o","stdout")_txt
 
q
 
;; 
apiInit(server,port)
 
^fcgilog(server,"FCGISERVER")=port_"`"_$j
 q    
 

Error
 
s $zt=""
 
%fcgi("o","stdout")=%fcgi("o","stdout")_" <script type=""text/javascript"">"_$c(10)
    
s $et="",$ec="",$zt=""
    
output=$zs
    s $zs
=0
 
%fcgi("o","stdout")=%fcgi("o","stdout")_" alert ("""_output_""")"_$c(10)
 
%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
 
;;
Буду благодарен за любую подсказку, как можно подправить работу сокета
Я пробовал разные варианты, но вопрос так и остался.
Может я что-то неправильно делаю ?
26 янв 17, 09:17    [20147651]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
Valeriu,
Работу этого сервера можно не менять.

Он работает в определённом контексте ($zg,$zro), который "отработчики" конкретных запросов должны по выходу восстанавливать. Вот участок кода, где происходит косвенный вызов "отработчика"
    t=$G(^FCGI("DOCUMENT_URI",$P(%fcgi("i","header","DOCUMENT_URI"),"/",1,3)))
    
"branch to ",t,!
    
d: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 и выйти
26 янв 17, 10:46    [20148015]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
В дополнении к вышесказанному.
Конечно, по-правильному, все эти пункты лучше вставить в сам FCGI.m, чтобы не дублировать во многих местах.
Добавить процедурку в FCGI.m, типа такой:
startappl(appl)
 
(appl,%fcgi)  ;здесь может что ещё нужно вставить, что надо 
 ;сохранить $zg и , если надо $zro
 ;установить нужные $zg, $zro (здесь как раз cid и может пригодиться)
 ;настроить обработчик ошибок, если нужно
 
@appl
 
;восстановить $zg,$zro
 
q
а в основном коде FCGI заменить
d:t'="" @t
на
d:t'="" startappl(t)
26 янв 17, 14:40    [20149404]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
gluconat_ca,
Спасибо большое.
Что-то зашевелилось с таким подходом.
Да. Приходится менять везде...
+
FCGIUCI ;;New Routine created and compiled tools "WEB-MEditor for GT.M" :[29.11.2016 09:05:42]
 
nms=$P(%fcgi("i","header","DOCUMENT_URI"),"/",4)
 
dir=$P(%fcgi("i","header","DOCUMENT_URI"),"/*",2)
 
s:nms=1 nms="SYS"
 
n=0
 
%fcgi("i","header","REQUEST_METHOD")="GET" GET(dir,nmsq
 
;;
GET(SYSGLB,namespace)
 
; SYSGLB - system path(^sysconfig $gtm_dist)
 ; namespace - (cadre - by example)
 
id=""
 
sid=$p(%fcgi("i","header","SID"),",")
 
^uciID(sid)=""
 
^uciID(sid,"oldzro")=$zro
 
^uciID(sid,"oldzgb")=$zgb
 
f  s id=$o(^uciID(id)) q:id=""  d
 
dirrtn=^|SYSGLB|sysconfig(namespace,"r"; return directory(r) to call routines
 
GLD=^|SYSGLB|sysconfig(namespace,"gld")
 . 
PATH=^|SYSGLB|sysconfig(namespace,"patch")
 . 
id=sid d
 
. . ^uciID(sid,"newzro")=PATH
 
. . ^uciID(sid,"newzgb")=GLD
 
. . %fcgi("o","stdout")=dirrtn_$c(13,10)
 . . 
%fcgi("o","header","Content-Type")="text/plain"
 
q
 
;;
Счс обдумаю как Вы предлагаете.
26 янв 17, 15:04    [20149560]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
Valeriu,

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

f  id=$o(^uciID(id)) q:id=""  d
 
dirrtn=^|SYSGLB|sysconfig(namespace,"r"; return directory(r) to call routines
 
GLD=^|SYSGLB|sysconfig(namespace,"gld")
 . 
PATH=^|SYSGLB|sysconfig(namespace,"patch")
 . 
id=sid d

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

 d:$d(^uciID(cid))
 . 
dirrtn=^|SYSGLB|sysconfig(namespace,"r"; return directory(r) to call routines
 
GLD=^|SYSGLB|sysconfig(namespace,"gld")
 . 
PATH=^|SYSGLB|sysconfig(namespace,"patch")
26 янв 17, 16:08    [20150012]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
В продолжении.

и это лишнее
d:$d(^uciID(cid))
так как чуть выше есть
^uciID(cid)=""
, так что узел заведомо есть.
26 янв 17, 16:53    [20150319]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
gluconat_ca,
Придется писать маленький бат-ник все таки ..
Где указать системную директорию (gtm_dist)
У меня например /usr/gtm63A/mumps.gld
+
startappl(appl)
 
(appl,%fcgi)  ;здесь может что ещё нужно вставить, что надо 
 ;сохранить $zg и , если надо $zro
 ;установить нужные $zg, $zro (здесь как раз cid и может пригодиться)
 ;настроить обработчик ошибок, если нужно
 
sid=$p(%fcgi("i","header","SID"),",")
 
'$d(^|"/usr/gtm63A/mumps.gld"|uciID(sid,"newzro")) ^|"/usr/gtm63A/mumps.gld"|uciID(sid,"newzro")=$zro
 
'$d(^|"/usr/gtm63A/mumps.gld"|uciID(sid,"newzgb")) ^|"/usr/gtm63A/mumps.gld"|uciID(sid,"newzgb")=$zgb
 
$zro=^|"/usr/gtm63A/mumps.gld"|uciID(sid,"newzro")
 
$zgb=^|"/usr/gtm63A/mumps.gld"|uciID(sid,"newzgb")
 
@appl
 
;восстановить $zg,$zro
 
$zro=^|"/usr/gtm63A/mumps.gld"|uciID(sid,"oldzro")
 
$zgb=^|"/usr/gtm63A/mumps.gld"|uciID(sid,"oldzgb")
 
q
 
;
26 янв 17, 17:13    [20150402]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
Valeriu,

Сохранять текущие $zg,$zro можно же и в локальных переменных, я собственно и имел это ввиду.
26 янв 17, 17:23    [20150469]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
gluconat_ca,
Да, сам заметил что в глобал не самый хороший вариант..
Очень трудно отследить всех пользователей кто куда и что выбирает.
Уже пробовал - началась путаница..
Но FCGI еще не знает $zg,$zro ни новые не старые значения !!!
Я не знаю где брать локальные переменные - а было бы хорошо..
Потом уже.
Когда пользователь нажимает на "область", я должен это фиксировать
плюс, должен знать постоянно где находится дистрибутив.
может что-то путаю, уже конец рабочего.
26 янв 17, 17:41    [20150519]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
Valeriu,
честно говоря я в некотором замешательстве.
Не могу взять в толк, в чём проблемы, особенно с локальными переменными. Просто тупо пишем:
zg=$zg
zro=$zro
...
$zg=zg
$zro=zro
сорри, но, похоже особо ничего добавить в ближайшее время уже не смогу.
26 янв 17, 18:44    [20150811]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
gluconat_ca,
Да.. Вот что значит старые привычки.
Я никак не могу отходит от старых понятий работ М систем.
Поплыл я далеко и совсем не туда. Прошу прощения. Видимо здесь гораздо даже проще, чем я себя представлял.
Выкинуть из головы надо такие понятия как $job и такое, если ты конектился - ты хозяин положения.
У меня как система работает:
Во первых если создается БД, то программа автоматом пишит
в глобаль все что относится к ней для дальнейшего обращения:
^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) и меня всегда это удивляло,
зачем постоянно открывать и закрывать ? ..
Закончил действие, закрыл сокет и т.д. - здесь это уже выступает как правило.
+
 tcpdev:(ZLISTEN=port_":TCP":NODELIMITER:ZNODELAY:ATTACH="listener"):timeo:"SOCKET"
 
e  s ^fcgilog($job)="-1,NotOpen" q
 
;u tcpdev:morereadtime=100
 
tcpdev
 
/listen(1)
 
f  d  q:$key]""
 
/wait(timeo)
 . 
i $key]"" q
 s 
socket=$p($key,"|",2)
 
tcpdev:(SOCKET="listener"listen^test
loop 
 
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
 
nr=0
 
tcpdev:(SOCKET=socket)
 
tcpdev
Вы правильно заметили, что нужно указать именно здесь системе, где находится пользователь
и какое действие нужно выполнить, т.е переключаться, выполнить действие и закрываться.
gluconat_ca
startappl(appl)
 
(appl,%fcgi)  ;здесь может что ещё нужно вставить, что надо 
 ;сохранить $zg и , если надо $zro
 ;установить нужные $zg, $zro (здесь как раз cid и может пригодиться)
 ;настроить обработчик ошибок, если нужно
 
@appl
 
;восстановить $zg,$zro
 
q
а в основном коде FCGI заменить
d:t'="" @t
на
d:t'="" startappl(t)
Мне просто нужно в своих Ajax вызовах указать в какой "области" происходят действия и ВСЕ.
Уверен, что это сработает.
Спасибо.
27 янв 17, 09:28    [20151973]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
Valeriu,
Давайте отвлечёмся от несущественного, от сокетов, фастцги и пр.
У вас есть некая m-программа, назовём её S, которая запускается в неком контексте, имеет доступ к файлу с глобалами, которые ей нужны для выполнения своей функции, в частности выполнения (командой DO) некоторого определённого набора программ Xi. Эти программы должны в свою очередь запускаться с предварительно настроенным контекстом ($zg,$zro) Сi . Выбор программы для запуска определяется путём получения неких параметров извне, способ получения значения не имеет. Вопрос в контексте для вызова, как его определить. Это тоже вопрос соглашения, он не может быть универсальным. Как задумаете, так и будет работать.
Вот варианты наобум. Для каждой Xi:
1. иметь заранее определённый Ci
2. иметь заранее определённый набор Cij, где второй индекс j определяется получением извне
3. все данные для контекста получать извне.
и т.д.
Только нужно иметь ввиду, что, если есть какая либо параметризация в определении контекста, как в п.2 и п.3, то нужно определиться для случая "по умолчанию", когда параметр не передаётся.

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

Вот такое у меня сложилось представление. Может быть изложенное всё мимо?
27 янв 17, 09:36    [20151990]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
Valeriu,
опубликовал, не успев прочитать ответ 20151973.
27 янв 17, 09:41    [20152011]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
gluconat_ca,
Еще заметил один нюанс ...
В первом варианте, что от Бантела, сокет открывается, действие, потом полностью закрывается.
Я пробовал еще один вариант, как указал ниже.
Открываем, записываем в переменную, закрываем и ждем нового подключения, давая предыдущему
соединения отработать до конца.
Так мы большую независимость представляем пользователю. Плюс использования и SID.
 socket=$p($key,"|",2)
 
tcpdev:(SOCKET="listener"listen^test
loop 
 
tcpdev:(NODELIMITER:ZNODELAY:SOCKET=socket)
Не знаю насколько я прав.
27 янв 17, 10:21    [20152192]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
Не вполне понимаю, что имеется ввиду под "отработать до конца"
В оригинальном FCGI.m сокет держится открытым пока идут определённые типы запросов (см. fcgi("type") ) и закрывается после отработки запроса и отправки наверх FCGI_END_REQUEST. После сокет закрывается и переходит к новой итерации приёма запроса. Всё по спецификации fastcgi.
27 янв 17, 11:02    [20152480]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
Valeriu,
Сразу не понял о чём речь. Ничего не скажу о правильности использования сокетов (нужно погружаться в документацию чтобы вспомнить детали). В новых версиях gt.m есть и другой подход, не рестарт слушателя порта в новом JOBе, а запуск процесса обработчика с передачей ему хендлера (сокета), а сам процесс опять приступает к прослушке порта. Мне, лично такой подход больше нравится. К тому же в первом варианте нужно обеспечить передачу из процесса в процесс (слушатели) значение переменной nr, которая растёт от запроса к запросу и которая используется для генерации cid, иначе они (cid) могут продублироваться для разных запросов, приходящих в пределах одной секунды.
Могу посоветовать, в дополнении к документации, в качестве примера использования - web-сервер DataBalet https://github.com/lparenteau/DataBallet
27 янв 17, 15:51    [20153955]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
gluconat_ca,

Я в курсе, даже пробовал, но смутно до меня доходит,
как использовать дочерний процесс с передачей его новым job-ом
В Каше просто и ясно. Здесь закручено очень.
Да и простого примера не хватает.
Я когда их спрашиваю, они сразу советуют пользоваться XINETD.
Я пробовал и этот вариант - РАБОТАЕТ! XINETD+ FCGI.
Т.Е. без использования родного сокета самого GT.M
27 янв 17, 16:52    [20154335]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
gluconat_ca
Member

Откуда:
Сообщений: 85
Valeriu
Я пробовал и этот вариант - РАБОТАЕТ! XINETD+ FCGI.

Опять не вполне понятно, а как работает в данном случае fastcgi? Впрочем, пожалуй я откланяюсь, дела. Удачи!
27 янв 17, 17:12    [20154444]     Ответить | Цитировать Сообщить модератору
 Re: [gtm] Ajax + WEB  [new]
Valeriu
Member

Откуда: Chisinau
Сообщений: 1944
gluconat_ca,
Не совсем удачно обьяснил ...
FCGI.m.
Ну по идеи и сам fcgi .
27 янв 17, 18:01    [20154680]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить