Servicii web. Rezolvarea problemei operațiunilor de lungă durată și afișarea interactivă a stării operației în desfășurare în PHP Ce permite utilizarea liniei de comandă

Aşa. Codul de metodă al fiecărei operații ws este localizat în modulul serviciului web căruia îi aparține această operație ws. Modulul serviciului web este executat numai pe Server.

Nota 1: Nu are rost să scrieți directive de compilare &Pe Server, &Pe Client și altele.

Pentru fiecare apel la o operațiune web, se creează o sesiune separată cu baza de informații, astfel încât de fiecare dată când este apelată o operație web, parametrii sesiunii sunt inițializați. Inițializarea parametrilor de sesiune are loc în modulul de sesiune în procedura „SettingSessionParameters”.

Nota 2: Nu împovărați această procedură cu pași inutile.

Personal, atunci când apelez pentru prima dată la această procedură, inițializez doar parametrii de sesiune cei mai des utilizați. Și numai dacă sunt necesari alți parametri de sesiune, atunci când sunt apelat din nou, procesez parametrii specificați.

Setare procedurăSessionParameters(SessionParametersNames)

//esența modificărilor este să obțineți doar parametrii importanți simultan și, dacă sunt necesari mai mulți parametri, utilizați subsistemul BSP

Dacă SessionParameterNames=Nedefinit, atunci

Solicitare = Solicitare nouă;

Cerere.Text =

„SELECTARE TOP 1

|DIN

|Director.Utilizatori AS Utilizatori

|UNDE

|Users.IBUserIdentifier = &IBUserIdentifier";

IBUserIdentifier = InformationBase Users.CurrentUser().UniqueIdentifier;

Request.Parameters.Insert("IB UserIdentifier", IBUserIdentifier);

ResultUsers = Query.Run();

SelectDetailRecords = Query.Run().Select();

În timp ce SelectDetailRecords.Next() Loop

SessionParameters.CurrentUser = SelectionDetailedRecords.Link;

EndCycle;

SessionParameters.CurrentAccount = SessionParameters.CurrentUser.Account;

Altfel

StandardSubsystemsServer.SettingSessionParameters(SessionParametersNames);

endIf;

EndProcedure


Daca citesti articolul 1C:Enterprise 8. Servicii web. Implementând propriul serviciu web, ați observat că în arborele de metadate parametrul operației ws se numește „Param”, iar în metoda care îl implementează se numește „Parameter”. Faptul este că numele operandului din metoda ws-operation nu contează 1C înlocuiește operanzii în ordinea în care sunt listați în arborele de metadate ws-operation. De exemplu, avem o operație Example1, în configurator am indicat că operația are doi parametri „param1” și „param2” și a creat o procedură care scoate „param2”.

Dacă numim operația ws Exemplu1 și trecem param1=1, param2=2 ca parametri, atunci rezultatul va fi 2.

Dar dacă schimbăm ordinea operanzilor în configurator:

Apoi, același apel va returna 1.

Nota 3: după modificarea ordinii parametrilor unei operații ws, nu uitați să modificați ordinea acestora în antetul funcției care implementează această operație.

Nota 4: Puteți utiliza nume diferite de cele specificate în configurator ca operanzi ai operației ws.

Dacă unii dintre parametrii unei operațiuni ws au caseta de selectare „Valoare goală posibilă” bifată, atunci este posibil ca acest parametru să nu fie specificat atunci când este apelat, dar există mai multe nuanțe aici. Când utilizați un client, de exemplu SoapClient, când treceți un parametru, nu puteți pur și simplu să luați parametrul și să nu specificați deloc parametrul. De exemplu:

$a=$client->Plus2();


Această linie va provoca o eroare " Eroare necunoscută. Nu există suficienți parametri de funcționare." Adică, parametrul în sine trebuie să fie transmis specificând valoarea nulă:

$zz=array("Param" => null);

$a=$client->Plus2($zz);

Dar atunci apare întrebarea cum va fi transferat acest parametru gol la 1C. Este logic ca un programator 1C să dorească să facă următoarele în metoda de operare web:

Funcția Plus2(Parametru=0)

Return Parameter+2;

EndFunction

Adică, indicați valoarea operandului dacă acesta lipsește.

Acum trebuie să apelăm operația noastră web cu gol. Voi da un exemplu de mesaj xml soap cu o valoare nulă.


xsi:nil="true" - indică faptul că acest parametru nu are valoare. Pentru a putea specifica null, trebuie să asociați suplimentar prefixul xsi cu spațiul de nume:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance".


Dar dacă apelează o astfel de operație ws cu o valoare goală, va primi un mesaj de eroare:

Săpun: Client

Eroare necunoscută.

din cauza:

(WebService.WebService.Module(2)): Conversia valorii în tipul Număr nu poate fi efectuată

din cauza:

(WebService.WebService.Module(2)): Conversia valorii în tipul Număr nu poate fi efectuată


Acest lucru se datorează faptului că valoarea nulă transmisă este convertită la valoarea 1c - „Nedefinit”. Puteți verifica acest lucru dacă rescrieți procedura astfel.

Funcția Plus2(Parametru=0)

Dacă Parametru = Nedefinit Atunci

Rezultat = 1;

Altfel

Rezultat = 2;

endIf;

Rezultatul returnat;

EndFunction


Rezultatul va fi - 1.

Nota 5: nu are rost să scrieți valoarea implicită a operandului operațiunii ws (Funcția Plus2(Parametru=0)). Pentru operanzii care pot lua o valoare goală, trebuie să adăugați o verificare pentru egalitate „Nedefinit”.


Nota 6: Când se transmite un parametru de tip șir unei operații web, un șir de unul sau mai multe spații este trunchiat într-un șir gol.

Nota 7: Când se transmite un parametru de tip datetime unei operații web folosind un format care indică fusul orar, ora este convertită în fusul orar în care se află platforma 1c. De exemplu, dacă o operațiune are un parametru „Date” de tip datetime, computerul pe care se află 1c se află în fusul orar +6, atunci când trece valoarea „2012-09-14T00:00:00.000+02:00 ” la acest parametru din codul de operare web acest parametru va avea valoarea „14/09/2012 4:00:00”. Prin urmare, „+02:00” indică în ce zonă se află expeditorul. Acest lucru vă va permite să nu vă gândiți la schimbarea orei atunci când lucrați în mai multe fusuri orare.

Puteți citi puțin mai multe despre serviciile web, implementarea lor, testare etc. aici.

Imprimare (Ctrl+P)

Servicii web

Mecanismul de servicii web vă permite să utilizați 1C:Enterprise ca un set de servicii în sisteme complexe distribuite și eterogene și, de asemenea, vă permite să integrați 1C:Enterprise cu alte sisteme industriale folosind o arhitectură orientată spre servicii.

Adăugarea unui serviciu web

Pentru a adăuga un serviciu Web la arborele de configurare, selectați ramura General – Servicii webși executați comanda din meniul contextual Add.
Ca rezultat al executării comenzii, se va deschide fereastra de editare a serviciului web.

În fila Altele a ferestrei de editare a serviciului web, setați următorii parametri:
URI al spațiului de nume– conține URI-ul spațiului de nume al serviciului Web. Fiecare serviciu Web poate fi identificat în mod unic prin numele său și URI-ul spațiului de nume căruia îi aparține.
● Pachete XDTO – o listă de pachete XDTO ale căror tipuri pot fi utilizate ca tipuri de returnare a operațiunilor și tipuri de parametri de operare ai unui serviciu Web.
Numele fișierului de publicare– numele fișierului de descriere a serviciului web, care se află pe serverul web.
Pentru a obține acces la serviciul Web, trebuie să utilizați o adresă care este formată după cum urmează: <Имя хоста веб-сервера>/<Имя виртуального каталога>/ws/<Имя Web-сервиса> sau <Имя хоста веб-сервера>/<Имя виртуального каталога>/ws/<Адрес Web-сервиса> .
Deci, dacă directorul virtual are numele DemoWS, numele serviciului Web din configurator este specificat ca Demonstrație de WorkWS,și DemoWorkWS este specificat ca adresă, apoi serviciul Web poate fi accesat simultan la două adrese (pentru a obține acces de la mașina locală):
http://localhost/DemoWS/ws/Demonstration of WS sau http://localhost/DemoWS/ws/DemoWorkWS.
În plus, fila conține un buton Modul, care vă permite să deschideți modulul serviciu web pentru editare.

Structura ierarhică a unui serviciu Web

Fiecare serviciu Web descris în arborele de configurare poate conține un set de operații. Fiecare operațiune trebuie să corespundă unei proceduri exportate descrise în modulul serviciu web.


Descrierea serviciului web

La rândul său, fiecare operație poate conține un set de parametri, ale căror nume trebuie să corespundă cu numele parametrilor procedurii care descrie această operație.

Operațiuni de servicii web

În fila Operațiuni, adăugați o operațiune de serviciu Web. Editarea proprietăților operațiunii se face în paleta de proprietăți.


Proprietăți de operare a serviciului web

Tip de returnare– tipul de valoare pe care o returnează operațiunea serviciului Web. Poate fi un tip de valoare XDTO sau un tip de obiect XDTO.
Posibilă valoare goală– indică dacă valoarea returnată poate fi nulă.
În tranzacție – indică dacă codul modulului serviciului Web va fi executat sau nu într-o tranzacție. Dacă proprietatea este setată, atunci când serviciul Web este apelat, o tranzacție va începe automat, iar când este finalizată, tranzacția fie va fi comisă, fie tranzacția va fi anulată (în funcție de rezultatele execuției). Dacă proprietatea nu este setată, nicio tranzacție nu va fi începută când modulul serviciului Web începe să se execute.
Nume procedură – numele procedurii de export a modulului serviciului Web care va fi executată la apelarea acestei proprietăți.
Modul de control al blocării datelor– specifică ce încuietori vor fi folosite la accesarea datelor.

Parametrii de funcționare

În fila Operațiuni, pentru operația specificată, trebuie să setați parametrii operațiunii serviciului Web. Editarea proprietăților parametrilor
efectuate în paleta de proprietăți.


Proprietăţile parametrului de operare

Tipul valorii—tipul valorii al parametrului de operare a serviciului web. Poate fi un tip de valoare XDTO sau un tip de obiect XDTO.
Posibilă valoare goală– indică dacă valoarea parametrului de operare poate lua o valoare nedefinită.
Direcția de transmisie– determină direcția transferului de date folosind acest parametru. Valori posibile:
● Intrare – înseamnă că parametrul poate fi folosit doar pentru a transmite date către serviciul Web.
● Ieșire – înseamnă că parametrul poate fi utilizat doar pentru a primi date de la serviciul Web.
Intrare – Ieșire– înseamnă că parametrul poate fi folosit atât pentru a transmite date, cât și pentru a le primi de la serviciul Web.

Specificarea tipurilor definite de sistem

Pentru a utiliza tipurile definite de sistemul 1C:Enterprise într-un serviciu Web (de exemplu, în parametrii și valoarea returnată a operațiunilor), trebuie să definiți pachetele XDTO în configurație și pentru fiecare pachet să specificați în lista sa de importate. pachete (proprietatea Directivelor de import) un set de pachete de platformă, în care sunt incluse aceste tipuri. URI-ul spațiului de nume pentru specificarea tipului este conținut în articolul auxiliar de sintaxă pentru un obiect de acel tip.

Publicare Servicii Web

Sarcina de publicare se rezumă la plasarea fișierului de publicare în directorul corespunzător. Pentru a publica, ar trebui să executați comanda de meniu „ Administrare – Publicare pe un server web...“.

Ca urmare a executării acestei comenzi, se va deschide o fereastră în care baza de informații este publicată pe computerul local.

Atenţie! Efectuarea operațiunii necesită drepturi de administrator (pentru sistemul de operare Windows) sau drepturi de superutilizator (pentru sistemul de operare Linux) pe computerul pe care se realizează publicarea

Setări de bază de publicare

Pe „ De bază” afișează datele necesare pentru finalizarea publicării.

În cazul în care publicarea nu a fost efectuată înainte, valorile câmpurilor (setările) sunt completate cu valori implicite (numele este selectat din numele bazei de informații). Schimbați aceste setări dacă este necesar.
Dacă publicarea a fost deja efectuată, atunci setările sunt selectate conform celor specificate anterior.
Dacă sistemul, la deschiderea unui dialog cu setările curente, găsește o publicație, dar datele acesteia diferă de datele setărilor, se emite o solicitare de modificare a setărilor.
Dacă nu este găsită o publicație de setări, este emis un avertisment.

Selectați un server web și specificați directorul în care va fi scris fișierul publicației.
Lista de servere web este generată automat pe baza serverelor web instalate.

Numele publicației trebuie să respecte regulile URL (standard RFC 1738).
Dacă serverul web este Apache 2.2 sau Apache 2.4, atunci caracterele ASCII din SUA ar trebui folosite pentru numele directorului.

Nota. Când utilizați serverul web Apache, ambele versiuni ale serverului web sunt disponibile pentru selectare în dialogul de setări. Vă rugăm să rețineți că setările de publicare pentru Apache 2.2 și Apache 2.4 sunt incompatibile între ele. Prin urmare, este necesar să selectați corect versiunea serverului web în dialog.

Specificați dacă trebuie să publicați un client subțire și un client web, precum și servicii Web și HTTP.

Dacă caseta de selectare „ Publicați interfața standard ODATA” este instalat, va fi publicat serviciul ODATA, care vă permite să citiți și să modificați datele bazei de informații folosind cereri HTTP.

Pe „ Servicii web"bifați caseta" Publicați servicii web” și creați o listă în tabel bifând casetele pentru acele servicii Web pe care doriți să le publicați.

Dacă caseta de selectare „Publicați serviciile web în mod implicit” este instalat, apoi la actualizarea publicației, serviciile web selectate vor fi publicate automat. În caz contrar, serviciile web vor fi marcate ca nepublicate.

Dacă caseta de selectare „Publicați serviciile web cu extensii în mod prestabilit” instalat, apoi la actualizarea publicației, serviciile web adăugate de extensii vor fi publicate automat.

Alexey Bagryantsev 3 octombrie 2012

În procesul de lucru, am întâlnit în mod repetat problema alegerii unei soluții pentru o anumită problemă. Uneori poți, fără prea multă durere, să te apuci de cea mai evidentă și comună metodă, așa cum se spune, „rezolvarea directă a lucrurilor”. În cele mai multe cazuri, această abordare va produce rezultate într-un fel sau altul, dar poate necesita o investiție mentală și de timp semnificativă din partea dvs.

Prin urmare, într-o situație în care te confrunți cu o sarcină non-standard, poate merita să te îndepărtezi de metodele obișnuite și să încerci să iei în considerare mai multe opțiuni, chiar dacă la început acestea nu par foarte reușite sau pur și simplu ești reticent să recurgi pentru ei, pentru că „de obicei nu facem asta”. Principalul lucru aici este să nu vă fie frică să experimentați, să testați fiecare metodă și, în sfârșit, să alegeți cea mai potrivită care să răspundă tuturor nevoilor dvs. și să vă ofere rezultatul dorit.

Noi, dezvoltatorii, trebuie să ne confruntăm foarte des cu astfel de probleme. O astfel de problemă complexă și consumatoare de timp, care a necesitat utilizarea mai multor abordări pentru soluționarea sa, va fi discutată mai jos.

Fundal

Unul dintre proiectele PHP de dimensiuni medii a întâmpinat probleme legate de execuția operațiunilor grele și afișarea interactivă a stării operațiunii de execuție. Pe lângă blocarea executării altor solicitări și clic pe alte link-uri de portal, utilizatorul era în întuneric și habar nu avea ce se întâmplă în în acest moment momentul în care se va încheia operațiunea, este posibil să fi apărut o eroare etc. Proiectul a avut inițial un statut experimental, cerințele pentru fazele efectuate s-au schimbat adesea din mers, prioritățile și vectorul de dezvoltare a sistemului s-au schimbat. Pentru a-mi face o idee mai bună, aș dori să descriu teancul de tehnologii utilizate în proiect:

  • MVC Framework CakePHP 2.1 (PHP5.3);
  • MySQL;
  • jQuery, jQuery UI, pluginuri jQuery;
  • Server Selenium, simulator de browser Snoopy pe partea de server;
  • Server IMAP, etc.

Ca sistem de operare a fost ales: CentOS

Alegerea cadrului a fost determinată de experiența utilizării acestuia de către echipa de dezvoltare, în timp ce alegerea SGBD-ului relațional MySQL ca stocare de date este o soluție destul de standard și se datorează stabilității și utilizării pe scară largă a acestui SGBD ca stocare de date. "motor".

În faza de proiectare a sistemului, a fost imediat dificil de anticipat că vor apărea operațiuni foarte „grele” în sistem, al căror proces de execuție ar trebui revizuit, componente suplimentare implementate și arhitectura aplicației în general reproiectată. În plus, sistemul era un fel de prototip, unde cerințele se schimbau adesea, precum și unde sistemul avea să crească în viitor.

La un moment dat, au fost implementate o serie de operațiuni care s-au dovedit a fi destul de „operațiuni grele” și nu numai că au blocat executarea altor operațiuni în cadrul aceleiași sesiuni, dar, în general, procesul de navigare prin legăturile de sistem a devenit imposibil până când The operațiunea „grea” nu a fost finalizată. Privind problema la un nivel inferior, s-a dovedit că orice solicitare bloca fișierul de sesiune atunci când a fost deschis, respectiv, până când operațiunea este finalizată complet și procesul șterge datele de sesiune în fișierul de sesiune și îl eliberează, eliberând blocați, alte cereri vor aștepta cu răbdare la coadă. Într-adevăr, în mod implicit PHP folosește un fișier ca mecanism de stocare a sesiunii. Când o sesiune este deschisă, este declanșată o funcție precum fopen(), care blochează fișierul pentru citire și scriere pentru alte procese. Decizia de a schimba stocarea sesiunii pentru a elimina blocarea se sugerează imediat, dar despre asta vom vorbi mai târziu.

Abordări

  1. Împărțirea unei operații în pași
  2. Sondaj Ajax
  3. Sondaj lung
  4. Cadru pentru totdeauna
  5. Streaming
  6. Comet-server
  7. Prize web

Să luăm în considerare pe scurt fiecare dintre aceste abordări pentru a rezolva problema efectuarea de operațiuni grele și notificarea interactivă a utilizatorului despre progres.

Împărțirea unei operații în pași

Primul lucru care îmi vine în minte este să împărțiți operația în pași. După finalizarea pasului următor și trimiterea unui răspuns către browserul utilizatorului, acesta inițiază singur pasul următor prin trimiterea cererii Ajax corespunzătoare către server.

În proiectul actual, această abordare nu a avut mare succes datorită faptului că operațiunile grele erau practic indivizibile în trepte. În plus, s-au folosit servicii terțe care rulau pe server, pentru a lucra cu care a fost necesară crearea și pregătirea obiectelor corespunzătoare în timpul executării cererii. După executarea cererii, care a fost reprezentată de 1 pas al operației, obiectele au fost „bătute în cuie”. Poate că ar fi trebuit să ne gândim să le reutilizam, dar nu am ajuns la asta.

Sondaj Ajax

Următoarea soluție care îmi vine în minte este să rulezi o operațiune pe server și să interoghezi constant serverul despre starea operațiunii în desfășurare prin trimiterea unei serii de solicitări Ajax la anumite intervale. Pe client, puteți analiza un astfel de răspuns de server (de exemplu, ar putea fi JSON care conține „mesaj”, „procent”, „eroare” și „redirecționare”) și să desenați o bară de progres care afișează starea operațiunii curente.

A existat o încercare de a folosi abordarea Polling pe un proiect cu două moduri diferite de stocare a rezultatului unei operațiuni:

    Stocarea rezultatelor execuției într-un fișier – +.TXT

    Stocarea rezultatelor în baza de date, în tabelul corespunzător – operațiuni_de_greutate_înaltă

Utilizatorul a inițiat operația folosind o solicitare ajax, după care scriptul client a interogat periodic serverul și a primit starea și progresul operațiunii curente - /operations/get_status/ .

Dar am întâlnit următoarea problemă: a început o operațiune de lungă durată, dar a blocat fișierul de sesiune, eliminând astfel posibilitatea de a executa solicitări paralele în cadrul aceleiași sesiuni. Cu alte cuvinte, după ce a început o operațiune de lungă durată, toate cererile care au interogat serverul au intrat într-o coadă și au așteptat momentul în care cererea principală a eliberat fișierul de sesiune.

Prima soluție la problemă a fost eliberarea fișierului de sesiune. Pentru a face acest lucru, PHP oferă o funcție - session_write_close(), cu care puteți închide sesiunea de înregistrare. Într-adevăr, puteți lansa o operațiune, citiți datele sesiunii, faceți modificări asupra acesteia și închideți sesiunea pentru scriere.

Dar în realitățile proiectului, ținând cont de arhitectura stabilită, această soluție nu a putut fi aplicată. Înregistrarea sesiunii a fost necesară în multe locații în timpul operațiunii îndelungate. Mai mult, o astfel de soluție nu poate fi numită „pură”, deoarece utilizatorul poate avea nevoie să „călătorească” prin site sau să execute o altă operațiune grea în paralel. Prin urmare, era nevoie de o alternativă.

Soluția a fost schimbarea Session Storage, care a asigurat funcționarea cu sesiunea fără blocare la deschiderea acesteia. Puteți selecta una dintre următoarele opțiuni ca noua sesiune de stocare:

  • Baza de date MySQL;
  • MongoDB;
  • Memcached;

Pentru a schimba stocarea sesiunii în PHP există o funcție - session.save_handler(), care setează funcții personalizate de stocare a sesiunii. Sunt folosite pentru a stoca și a prelua date asociate cu o sesiune. Puteți găsi multe exemple de utilizare a acestuia pe Internet există deja clase implementate care servesc la transferul unei sesiuni într-o bază de date sau în memcache.

Nota: Pentru ca funcția să funcționeze, trebuie să setați opțiunea session.save_handlerîn sens utilizatorîn fișierul dvs. de configurare php.ini.

Proiectul a folosit stocarea sesiunii în mysql și mongodb ca experiment.

Nota: Dacă aveți nevoie ca parametrul tocmai scris în sesiune să fie disponibil pentru alte solicitări, atunci sesiunea trebuie să fie „ștersă” în mysql sau mongodb pentru ca funcția de înregistrare a sesiunii să funcționeze. Pentru a face acest lucru, trebuie să îl închideți pentru înregistrare și să îl redeschideți din nou:

Funcția publică session_flush() ( session_write_close(); session_start(); )

După implementarea componentelor corespunzătoare, sesiunea nu a mai fost blocată și a permis procesarea simultană a mai multor solicitări asociate aceleiași sesiuni. Acum nu „pierde” ( blocare), așa cum a fost cazul fișierelor, la deschiderea unui fișier cu funcția fopen, plus viteza sesiunii a crescut semnificativ.

Nota: Pentru utilizare mongodbîn PHP trebuie să instalați mongodb ca serviciu, precum și un driver pentru lucrul în PHP.

Exemplu de instalare activat CentOS :

  1. Creați un depozit

/etc/yum.repos.d/10gen.repo

  1. Umpleți cu conținut (în funcție de adâncimea de biți a sistemului de operare)

name=10genRepository

baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64

  1. Apel
  1. Următorul

yum instalează mongo-10gen mongo-10gen-server

  1. Lansați „daemonul”

service mongod start

  1. Instalați driverul

yum -y instalează php-devel

sudo pecl install mongo

extensie=mongo.so

După aceasta, puteți utiliza în siguranță mongodb.

Ca exemplu, atașez o listă a componentelor CakePHP pentru transferul Session Storage și MongoDB

Mongo = new Mongo($conexiune_string);<= 3) { $this->gc();

) returnează adevărat; ) funcția publică read($id) ( $cursor = $this->mongo->(self::MONGO_DATABASE)->(self::MONGO_COLLECTION)->find(array("id" => $id)); dacă ($cursor->count() == 1) ( $cursor->next(); ) else ( return false; ) $rezultat = $cursor->current(); if (!empty($rezultat) && isset(); $rezultat[„date”])) ( returnează $rezultat[„date”]; ) ) funcția publică scrie ($id, $date) ( dacă (!$id) ( returnează fals; ) $expires = time() + $this->_timeout; $session = array("id" => $id, "data" => $date, "expires" => $opțiuni = array("safe" => true, "fsync); " => adevărat,); $colecție = $this->mongo->(self::MONGO_DATABASE)->(self::MONGO_COLLECTION); ->findOne($filter) == null) ( returnează $colecție->inserați (am(array("_id" => new MongoId($id)), $session), $opțiuni ) else ( return $collection ->update($filter, array("$set" => $session)); , am($options, array("upsert" => false)) ) ) public function destroy($id) ( return $this- >mongo->(self::MONGO_DATABASE)->(self::MONGO_COLLECTION)-> remove(array("id" => $id), adevărat);

Nota) funcția publică gc($time = null) ( if (gol ($timp)) ( $time = time(); ) return $this->mongo->(self::MONGO_DATABASE)->(self::MONGO_COLLECTION) ->remove(array("expires" => array("$lt" => $time)), true ) )

Implementarea componentei pentru transferul sesiunilor în MySQL este similară și diferă doar în implementarea funcțiilor

gc(), distruge(), deschide(), scrie(), citește(), închide() : Nu uitați să schimbați fișierul de configurare core.php al proiectului. Configure::write("Session", array("defaults" => "database", "handler" => array("engine" => "MongoSession")));

De asemenea, puteți adăuga protecție pentru numărul de solicitări simultane într-o sesiune. În proiectul nostru, acest lucru a fost realizat de o componentă separată responsabilă de operațiuni grele în general - HighWeightedOperationsComponent.php, care a urmărit numărul de operațiuni lansate într-o sesiune și, în funcție de setări, a permis să ruleze strict

    o anumită sumă

    operațiuni.

    Rezultat:

    S-a schimbat stocarea sesiunii. Nu mai există blocări de sesiune.

O solicitare Ajax pentru a începe operația este inițiată pe client.

Abordarea este similară cu cea anterioară, dar există o diferență semnificativă: în primul caz, clientul însuși interoghează serverul pentru modificări, în același caz, se stabilește o conexiune continuă cu serverul și serverul însuși semnalează apariția. de o schimbare. Avantajul acestei abordări este reducerea traficului dintre client și server.

Principiu: scriptul client contactează serverul și spune: „Dacă aveți date, sunt gata să le preiau imediat și apoi mă voi conecta din nou.” În unele implementări de server, există tamponare, atunci când serverul nu trimite imediat date, ci așteaptă: ce se întâmplă dacă acum apare altceva, atunci voi trimite totul deodată. Dar o astfel de tamponare este dăunătoare, deoarece introduce întârzieri și vrem să realizăm viteza maxima! După primirea datelor, browserul ar trebui să deschidă din nou o nouă conexiune. Durata unei astfel de conexiuni poate fi măsurată în ore, dar acest lucru este în teorie. De obicei timpul este mult mai mic, iar maximul ajunge la 5 minute, după care pur și simplu se creează o nouă conexiune. Acest lucru se face deoarece serverelor nu le plac astfel de sesiuni de lungă durată, iar protocolul HTTP în sine nu este foarte potrivit pentru o astfel de utilizare.

Această abordare nu a fost folosită în proiect, dar au existat discuții.

Forever IFrame

Pe scurt: pe pagină este creat un iFrame ascuns, care redă în mod incremental informații despre progresul operațiunii sau execută scripturi java. Dar pentru aceasta, serverul HTTP și PHP trebuie configurate astfel încât să poată returna datele pe bucăți în timpul operațiunii. Acest lucru este discutat în detaliu în paragraful următor.

Deci, initiem operatia printr-un element iFrame ascuns in pagina. Pe server, operația emite apelul de date pe bucăți și trimite imediat un răspuns clientului, IFrame încearcă să execute răspunsul trimis:

Streaming

Abordarea a fost utilizată experimental pe proiect.

A apărut o idee, ce se întâmplă dacă încercăm să inițiem execuția unei operațiuni cu un apel ajax, iar pe server dăm (stream) date clienților bucată cu bucată. Apoi, poate, pe client, de fiecare dată când se primește următoarea bucată de date, va fi declanșat un eveniment, conform căruia putem actualiza blocul corespunzător și afișa starea execuției.

Mai întâi a trebuit să găsim și să aplicăm setările corespunzătoare pentru serverul Apache și PHP, ceea ce a dus la căutarea de informații pe Internet și o serie de teste. Ca urmare, setările arată astfel:

Funcția publică prepare() ( // Dezactivează bufferingul de ieșire ini_set("output_buffering", "off"); // Dezactivează compresia de ieșire PHP ini_set("zlib.output_compression", false); // Sterge implicit buffer-urile ini_set("implicit_flush", true); ob_implicit_flush(true); // Ștergeți și dezactivați bufferul de ieșire în timp ce (ob_get_level() > 0) ( // Obține nivelul curent $level = ob_get_level(); // Închideți tamponarea ob_end_clean(); // Dacă nivelul curent nu s-a schimbat, abort if (ob_get_level() == $level) break ) // Dezactivează bufferul/comprimarea ieșirii apache if (function_exists("apache_setenv")) ( apache_setenv; -gzip", "1"); apache_setenv ("nu variaza", "1"); ) )

A fost scrisă o componentă care implementează pe deplin această abordare. Dar, după o analiză mai profundă, s-a dovedit că această abordare nu este aplicabilă, deoarece nu există evenimente pe client care să semnaleze că următoarea bucată de date a sosit dintr-o solicitare ajax trimisă anterior. După eveniment onSuccess Datele ajung în întregime.

Server de comete

Conform Wikipedia, Comet este orice model de aplicație web în care o conexiune HTTP persistentă permite serverului web să trimită date către browser fără o solicitare suplimentară din partea browserului.

Caracteristica comună a acestor modele este că toate se bazează pe tehnologii suportate direct de browser (de exemplu, JavaScript), mai degrabă decât pe pluginuri proprietare.

Pe acest proiect a existat o încercare de a folosi implementarea serverului Comet Dklab Realplexor .

Dklab Realplexor este un server Comet care vă permite să păstrați simultan sute de mii de conexiuni HTTP deschise de lungă durată cu browserele utilizatorilor. Codul JavaScript care rulează în browser se abonează la unul sau mai multe canale Realplexor și atribuie un handler pentru primirea datelor. Serverul poate scrie un mesaj pe unul dintre aceste canale în orice moment, iar acesta va fi transmis instantaneu tuturor abonaților (cel puțin unul, cel puțin o mie), în timp real și cu încărcare minimă pe server.

Prize web

S-a discutat și posibilitatea utilizării WebSockets. Dar am abandonat această abordare din cauza „nu acceptăm” browserele mai vechi.

WebSocket este un protocol de comunicare full-duplex printr-o conexiune TCP conceput pentru a schimba mesaje între un browser și un server web în timp real.

De asemenea, puteți adăuga protecție pentru numărul de solicitări simultane într-o sesiune. În proiectul nostru, acest lucru a fost realizat de o componentă separată responsabilă de operațiuni grele în general - HighWeightedOperationsComponent.php, care a urmărit numărul de operațiuni lansate într-o sesiune și, în funcție de setări, a permis să ruleze strict

Ca urmare, sarcina a fost implementată folosind abordarea de sondare, cu sesiuni transferate către MongoDB. Dar discuțiile ulterioare, creșterea numărului de sarcini „grele” și complexitatea acestora au condus la utilizarea unei soluții mai standard și mai fiabile - implementarea unei cozi de sarcini executate folosind un planificator CRON. Într-adevăr, după verificarea tuturor drepturilor asupra operației de execuție, putem salva contextul acesteia în baza de date (tabelul cron_taks), după ce a serializat-o anterior. Pe server, shell-ul CRON va fi lansat la anumite intervale de timp, care va prelua următoarea sarcină din coadă, își va schimba starea în IN_PROGRESS și o va transfera la handlerul corespunzător (TaskDispatcherComponent). Handler-ul va prelua contextul deserializat al sarcinii programate și îl va executa într-un proces separat. Toate modelele și componentele sistemului îi sunt disponibile. Pentru a determina starea unei sarcini în execuție, puteți utiliza abordările Polling și LongPolling și, de asemenea, puteți organiza vizualizarea cozii de sarcini într-un afișaj separat. Această abordare s-a dovedit a fi mai fiabilă și mai ușor de înțeles, deși necesită anumite modificări arhitecturale ale sistemului.

Astăzi, serviciile WEB sunt folosite aproape peste tot - ne oferă informații despre zborurile cu avionul și trenul, cursurile de schimb și vremea. Nu este de mirare că 1C are și capacitatea de a-și crea propriile servicii WEB, permițându-i să acționeze atât ca furnizor, cât și ca consumator. Acest mecanism este încorporat în platforma 1C:Enterprise 8.3 și dezvoltatorii pot chiar să adauge propriile lor obiecte de tip servicii WEB la configurația standard. Arhitectura lor este construită pe un set de servicii care vă permit să faceți schimb de informații cu alte software-uri.

Crearea unui serviciu web 1C

Unul dintre principalele avantaje ale serviciilor 1C WEB este absența necesității de a oferi acces direct la datele de securitate a informațiilor. Un serviciu web 1C configurat corect permite altor aplicații să utilizeze funcții din exterior. În astfel de cazuri, funcția în sine ar trebui să determine dreptul de a utiliza datele în conformitate cu parametrii specificați, conform regulilor prescrise de dezvoltator.

Cum se creează un serviciu web în 1C?

Pentru ca o anumită funcție a sistemului 1C să devină disponibilă software-ului extern, este necesar să se efectueze următorul algoritm de acțiuni:

  1. Accesați configurația și adăugați un obiect de serviciu WEB într-o anumită ramură a arborelui;
  2. Descrieți toate operațiunile pe care funcționalitatea noastră le poate efectua. Descrierea funcțiilor se realizează în modul în limbajul 1C încorporat;
  3. Adăugați o descriere a parametrilor funcțiilor serviciului web. Vă rugăm să rețineți că tipurile de date sunt descrise ținând cont de tipurile existente ale mecanismului XDTO introdus în versiunea 8.1 a platformei;
  4. Publicați serviciul WEB creat pe server. Mecanismul încorporat în platforma 1C acceptă următoarele standarde:
  • SSL/TLS
  • WS-I BP

Un exemplu de creare a unui serviciu WEB simplu

Pentru a demonstra cel mai clar funcționarea mecanismului de servicii WEB, să creăm un exemplu - o funcționalitate care determină lungimea șirului introdus. Software-ul va transmite un șir ca parametru de solicitare, iar funcția descrisă în 1C va returna numărul de caractere. Când creați, trebuie să vă amintiți că publicarea acestui mecanism va face posibilă accesarea acestuia pentru diverse programe software. Deoarece nu orice software este capabil să accepte alfabetul chirilic, vom denumi obiectele de configurare folosind caractere latine.

Deschideți configuratorul, găsiți ramura „Servicii WEB” în arbore și adăugați un nou serviciu „wa_LengthString”. De asemenea, trebuie să adăugați o nouă operațiune în fila „Operațiuni”. Să-i spunem „CalcLengthString”, în proprietăți vom indica tipul de valoare returnată – int sau întreg și vom crea în interiorul acestuia parametrul „InputString”. Lăsați tipul valorii ca șir.

Acum trebuie să înregistrați acțiunea funcției CalcLengthString în modulul de serviciu WEB. Pentru a face acest lucru, deschideți proprietățile funcției create și faceți clic pe butonul sub formă de lupă din dreapta, lângă câmpul de introducere „Nume procedură”. 1C va crea automat o funcție în modulul nostru de servicii WEB și o va deschide, astfel încât să putem descrie acțiunea CalcLengthString. Să profităm de acest lucru și să scriem acțiunea funcției - determinând lungimea șirului de intrare.


De fapt, aceasta completează crearea unui serviciu WEB simplu. Acum este necesar să „puneți” acest serviciu în domeniul public, astfel încât software-ul terță parte sau alte sisteme 1C să poată utiliza această funcționalitate.

Pentru a putea publica serviciul web creat cu funcționalitatea acestuia, trebuie să avem acces la site. Înainte de a începe publicarea serviciului, trebuie să verificăm numele fișierului în proprietățile modulului wa_LengthString creat. Ar trebui să fie clar, simplu și să aibă extensia „1cws”.


Acum este timpul să publicăm serviciul WEB pe care l-am creat pe server. Această caracteristică a apărut în versiunea 8.3 a platformei și multe companii au realizat deja beneficiile complete ale acestei funcționalități. Pentru a începe publicarea, trebuie să deschideți formularul „Administrare/Publicare pe un server web...” din configurator.


În fereastra care se deschide, trebuie să configuram serviciile Web 1C și să completăm anumite câmpuri:

  • Nume. Desemnează folderul de pe serverul web în care va fi stocată descrierea serviciului nostru web. Fiți atenți la cazuri, deoarece uneori serverele fac distincție între caracterele mari și mici;
  • server web. Trebuie să selectați un server dintre cele instalate pe computer;
  • Catalog. Trebuie să selectați calea către folderul în care sunt stocate datele serverului web pentru configurarea conexiunii. Se folosesc numai litere latine;
  • Două semne de tip boolean. Primul ne va fi util dacă trebuie să configuram accesul la configurație prin intermediul unui client web. Pentru a publica un serviciu 1C, trebuie să bifați a doua casetă.

Rămâne doar să verificați dacă serviciul WEB dorit are caseta bifată în prima coloană și să faceți clic pe „Publica”.


Deoarece acest mecanism este încă destul de nou, este posibil să întâmpinați o eroare precum „A apărut o eroare la efectuarea unei operațiuni cu fișierul...”. În acest caz, trebuie doar să faceți clic din nou pe „Publicați”. În cele mai multe cazuri, acest lucru va funcționa și veți vedea un mesaj care indică faptul că serviciul web a fost publicat.

<имяСервера>.ru/<ИмяУказанногоКаталогаНаСервере>/ws/<НаименованиеФайла>.1cws?wsdl

Ca răspuns la o astfel de solicitare de adresă, browserul trebuie să afișeze structura fișier XML. Dacă vedeți o pagină goală, o eroare sau caractere ciudate (probleme de codificare), atunci trebuie să verificați din nou toți pașii. De asemenea, este o idee bună să vă asigurați că serverul este configurat corect și că aveți acces la el. După publicarea cu succes, serviciul 1C WEB va putea fi utilizat de aplicații terțe.

8.41 La determinarea tipului proprietății unui obiectXDTO informațiile de tip includ:

1. tastați numai numele

2. tastați numele și numele spațiului de nume

3. tastați numele și numele pachetului XDTO

4. tastați numele și numele fabricii XDTO

8.42 ManagerWEB servicii rezolvă problema:

1. gestionarea unui grup de conexiuni la baze de informații

2. suport pentru descrierea serviciului WSDL, implementarea protocolului SOAP

3. suport pentru operarea aplicației WEB

4. răspunsuri corecte 1,2

5. Răspunsurile corecte sunt 2.3

6. Răspunsurile corecte sunt 1,2,3

8.43 Obiect de configurare" NOI„Serviciul” este folosit pentru:

2. organizarea accesului la serviciile web printr-o legătură statică

3. exportând funcționalitatea acestei baze de informații

8.44 Obiect de configurare" W.S.Legătură"folosit pentru:

1. organizarea accesului dinamic la serviciile web

2. organizarea unui apel laweb-servicii dar link static

3. exportați funcționalitatea acestei baze de informații

8.45 Dacă funcţia care implementează operaţiuneaWEB serviciu, returnează o anumită valoare. Apoi, o astfel de valoare este definită (la configurarea obiectului de configurare corespunzător) ca având tipul:

4. Element XML

5. obiect sau valoareXDTO

6. Răspunsurile 1, 2, 3 sunt corecte

8.46 La contactWEB serviciu printr-o legătură statică, secvența acțiunilor este următoarea:

1. obținerea unei descrieri wsdl, stabilirea unei conexiuni (crearea unui proxy), accesarea unei operațiuni de serviciu

2. stabilirea unei conexiuni (crearea unui proxy), accesarea unei operațiuni de serviciu

8.47 La contactWEB serviciu printr-o legătură dinamică, secvența acțiunilor este următoarea:

1. primindwsdl descrieri, stabilirea unei conexiuni (crearea unui proxy), accesarea unei operațiuni de serviciu

2. stabilirea unei conexiuni (crearea unui proxy), accesarea operațiunii de serviciu

3. apel la operațiune de service

8.48 Dacă funcția care implementează operațiuneaWEB service, ia o anumită valoare ca parametru. Apoi, o astfel de valoare este definită (la configurarea obiectului de configurare corespunzător) ca având tipul:

4. Element XML

5. obiect sau valoareXDTO

6. Răspunsurile corecte sunt 1,2,3

8.49 Cum puteți determina ce planuri de schimb pentru un anumit obiect de aplicație includ înregistrarea automată?

1. În fereastra de editare a obiectelor, secțiunea „Schimb de date”

2. Apelând fereastra „Paletă de proprietăți” pentru un obiect dat

3. Apelând fereastra „Avansat” pentru acest obiect (fila „Planuri de schimb”)

4. Toate cele de mai sus sunt adevărate

5. Răspunsurile 1 și 3 sunt corecte

8.50 Pentru obiectele aplicației din fereastra de editare a obiectelor de configurare din fila „Schimb de date”, indicați...

1. obiecte, la schimbarea pe care acest obiect ar trebui schimbat

2. obiecte care ar trebui schimbate atunci când acest obiect este schimbat

3. planuri de schimb, la efectuarea unui schimb conform căruia se va produce o modificare a acestui obiect

4. planuri de schimb care vor ține cont de modificările acestui obiect

8.51 EditareOLE-obiectele sunt realizate:

1. Editor de documente pentru foi de calcul încorporat în platformă

2. Editor de obiecte OLE încorporat în platformă

3. Aplicație asociată cuOLE-obiect

8.52 Fișiere de documente din foaia de calcul externe:

1. Au o extensie XML

2. Aveți o extensieMXL

3. Poate avea orice extensie

4. Nu există. Toate documente foaie de calcul integrat în Configurație

8.53 Automatizare-server „1C:Enterprise 8”...

1. oferă acces la toate proprietățile și metodele contextului său global

2. oferă acces la proprietăți și metode suplimentare pentru efectuarea acțiunilor specifice lucrului în modul Automatizare

3. vă permite să controlați aplicația de sistem 1C:Enterprise8 din alte aplicații, precum și să efectuați acțiuni similare celor interactive

4. toate răspunsurile de mai sus sunt corecte

1. imposibil

2. implementat integral în software

3. implementat folosind obiectul de configurare „Planuri de schimb”.

4. implementat de expertul de schimb integrat în platformă

9. Întreținerea soluției aplicației

9.1 În ce ordine sunt instalate platforma și configurația?

1. Mai întâi trebuie să instalați platforma, apoi să instalați configurația pe baza șablonului

2. Mai întâi trebuie să instalați configurația și apoi platforma

3. Ordinea de instalare nu contează

9.2 Instalare tipică a platformei 1C:Enterprise 8...

1. implică o instalare separată pe computerul fiecărui utilizator, actualizările suplimentare ale platformei se pot face automat de pe server

2. implică o instalare separată pe fiecare computer de utilizator; actualizările suplimentare ale platformei pot fi efectuate numai pe fiecare computer de utilizator

3. presupune instalarea pe un server cu copierea ulterioară a fișierelor necesare pe computerele utilizatorilor, actualizarea ulterioară a platformei se poate face automat de pe server;

4. presupune instalarea unei versiuni locale pentru un utilizator

9.3 Ce trebuie făcut pentru a actualiza platforma tehnologică în timpul unei instalări normale 1C:Enterprise?

1. În modul configurator, specificați fișierul de actualizare

2. Rulați programul de instalare inclus în kitul de distribuție

3. În modul configurator, specificați fișierul de livrare

9.4 Instalare administrativă...

1. presupune instalarea platformei pe fiecare computer de utilizator individual

2. implică instalarea platformei de către administrator pe un computer, cu copierea ulterioară a fișierelor executabile de pe aceasta pe stațiile de lucru ale utilizatorului retea locala

3. presupune instalarea unei configurații pe serverul 1C:Enterprise, definirea unui utilizator cu drepturi de acces Administrator

9.5 La actualizarea platformei tehnologice în timpul instalării administrative a 1C:Enterprise...

1. administratorul trebuie doar să actualizeze platforma în locația de instalare administrativă, utilizatorii înșiși pot actualiza platforma pe computerele locale

2. Administratorul trebuie să actualizeze platforma în locația de instalare administrativă și pe toate computerele din rețeaua locală, utilizatorii nu au dreptul de a actualiza

3. Administratorul trebuie să actualizeze platforma doar pe computerele din rețeaua locală, utilizatorii au aceeași oportunitate

4. Administratorul trebuie să actualizeze platforma numai pe computerele din rețea locală, utilizatorii care nu au această opțiune;

9.6 Este posibil, în timpul unei instalări normale a 1C:Enterprise în versiunea client-server, să ruleze aplicații client și server ale diferitelor versiuni ale platformei tehnologice?

1. Permis

2. Nepermis, este necesară actualizarea atât a aplicației server, cât și a aplicațiilor client

3. Permis, este necesar să actualizați aplicația server

9.7 Utilizarea modului de lansare lot...

1. vă permite să încărcați/descărcați automat, să testați și să corectați baza de informații

2. vă permite să rulați ambele moduri de program fără intervenție interactivă

3. Permite verificarea sintaxei și verificarea configurației

4. raspunsul corect este I si 2

5. raspunsul corect este 1,2 si 3

9.8 Lansați opțiuni de la linie de comandă 1C: Întreprindere...

1. determina baza de informatii, user, his, parola, modul de lansare, reguli pentru efectuarea operațiunilor specificate într-un fișier extern

2. determinați baza de informații, utilizatorul, parola acestuia, modul de lansare, regulile pentru efectuarea operațiunilor specificate specificate pe linia de comandă

3. verpa răspunde I și 2

4. Nu există un răspuns corect

9.9 Ce permite utilizarea liniei de comandă?



Publicații pe această temă