Proiektu baten istorioa edo nola eman nituen 7 urte Asterisk eta Php-en oinarritutako PBX bat sortzen

Segur aski zuetako askok, ni bezala, zerbait berezia egiteko ideia izan zenuten. Artikulu honetan PBXa garatzerakoan aurre egin behar izan nituen arazo teknikoak eta irtenbideak deskribatuko ditut. Beharbada horrek lagunduko dio norbaiti bere ideia erabakitzen, eta norbaiti ondo egindako bideari jarraitzeko, aitzindarien esperientziari ere mesede egin diot eta.

Proiektu baten istorioa edo nola eman nituen 7 urte Asterisk eta Php-en oinarritutako PBX bat sortzen

Ideia eta funtsezko baldintzak

Eta dena, besterik gabe, maitasunetik hasi zen Asterisk (komunikazio-aplikazioak eraikitzeko esparrua), telefonia eta instalazioen automatizazioa Doako PBX (Web interfazea Asterisk). Enpresaren beharrak zehaztasunik gabekoak balira eta gaitasunen barruan sartuko balira Doako PBX - dena bikaina da. Instalazio osoa XNUMX orduko epean egin zen, konpainiak konfiguratutako PBX bat, erabiltzaile-interfazea eta prestakuntza laburra eta laguntza jaso zuen nahi izanez gero.

Baina zeregin interesgarrienak ez-estandarrak ziren eta orduan ez zen hain primerakoa. Asterisk asko egin dezake, baina web interfazea ondo mantentzeko, denbora asko igaro behar zen. Beraz, xehetasun txiki batek PBXaren gainerako instalazioak baino askoz ere denbora gehiago behar izan dezake. Eta kontua ez da denbora luzea behar dela web interfaze bat idazteko, baizik eta kontua ezaugarri arkitektonikoetan dago. Doako PBX. Arkitekturaren ikuspegiak eta metodoak Doako PBX php4-ren garaian ezarri zen, eta une horretan jada bazegoen php5.6 dena errazagoa eta erosoagoa egiteko.

Azken lastoa diagrama formako dialplan grafikoak izan ziren. Horrelako zerbait eraikitzen saiatu nintzenean Doako PBX, konturatu nintzen nabarmen berridatzi beharko nuela eta errazagoa izango zela zerbait berria eraikitzea.

Baldintza nagusiak hauek izan ziren:

  • konfigurazio sinplea, intuitiboki eskura daiteke administratzaile hasiberri batek ere. Horrela, enpresek ez dute gure alde PBX mantentze-lanak behar,
  • aldaketa erraza, zereginak denbora egokian konpontzeko,
  • PBX-ekin integratzeko erraztasuna. U Doako PBX ez zegoen ezarpenak aldatzeko APIrik, hau da. Ezin duzu, adibidez, talde edo ahots-menurik sortu hirugarrenen aplikazio batetik, APIa bera bakarrik Asterisk,
  • kode irekia - programatzaileentzat hau oso garrantzitsua da bezeroarentzako aldaketak egiteko.

Garapen azkarragoaren ideia funtzionalitate guztiak objektu moduan moduluez osatuta egotea zen. Objektu guztiek klase guraso komun bat izan behar zuten, hau da, funtzio nagusi guztien izenak dagoeneko ezagutzen dira eta, beraz, lehenetsitako inplementazioak daude. Objektuek argumentu-kopurua nabarmen murrizteko aukera emango dizute kate-gakoekin matrize elkartuen forman, eta hori hemen aurki dezakezu. Doako PBX Funtzio osoa eta habiaraturiko funtzioak aztertuz posible izan zen. Objektuen kasuan, osatze automatiko hutsalak propietate guztiak erakutsiko ditu eta, oro har, bizitza sinplifikatuko du askotan. Gainera, herentzia eta birdefinizioak aldaketekin arazo asko konpontzen ditu jada.

Berrikuntza denbora moteldu eta saihestea merezi zuen hurrengo gauza bikoiztasuna izan zen. Langile bat markatzeaz arduratzen den modulu bat badago, langile bati deia bidali behar dioten gainerako modulu guztiek erabili beharko lukete, eta ez beren kopiak sortu. Beraz, zerbait aldatu behar baduzu, leku bakarrean aldatu beharko duzu eta "nola funtzionatzen duen" bilaketa leku bakarrean egin behar da, eta ez proiektu osoan zehar bilatu.

Lehen bertsioa eta lehen akatsak

Lehenengo prototipoa urtebeteko epean prest zegoen. PBX osoa, aurreikusi bezala, modularra zen, eta moduluek deiak prozesatzeko funtzionaltasun berriak gehitzeaz gain, web interfazea bera ere alda zezaketen.

Proiektu baten istorioa edo nola eman nituen 7 urte Asterisk eta Php-en oinarritutako PBX bat sortzen
Bai, eskema baten moduan markatze-plan bat eraikitzeko ideia ez da nirea, baina oso erosoa da eta gauza bera egin nuen. Asterisk.

Proiektu baten istorioa edo nola eman nituen 7 urte Asterisk eta Php-en oinarritutako PBX bat sortzen

Modulu bat idatziz, programatzaileek dagoeneko:

  • sortu zure funtzionalitate propioa deiak prozesatzeko, diagraman jar daitekeena, baita ezkerreko elementuen menuan ere,
  • sortu zure orriak web-interfazerako eta gehitu zure txantiloiak lehendik dauden orrietan (orriaren garatzaileak horretarako eman badu),
  • gehitu zure ezarpenak ezarpen nagusien fitxan edo sortu zure ezarpenen fitxa,
  • programatzaileak lehendik dagoen modulu batetik hereda dezake, funtzionalitatearen zati bat aldatu eta izen berri batekin erregistratu edo jatorrizko modulua ordezkatu dezake.

Adibidez, honela sortu dezakezu zure ahots-menua:

......
class CPBX_MYIVR extends CPBX_IVR
{
 function __construct()
 {
 parent::__construct();
 $this->_module = "myivr";
 }
}
.....
$myIvrModule = new CPBX_MYIVR();
CPBXEngine::getInstance()->registerModule($myIvrModule,__DIR__); //Зарегистрировать новый модуль
CPBXEngine::getInstance()->registerModuleExtension($myIvrModule,'ivr',__DIR__); //Подменить существующий модуль

Lehen ezarpen konplexuek lehen harrotasuna eta lehen etsipenak ekarri zituzten. Pozten nintzen funtzionatu zuelako, jada ezaugarri nagusiak erreproduzitzeko gai nintzelako Doako PBX. Pozten nintzen jendeari eskemaren ideia gustatu zitzaidalako. Garapena errazteko aukera asko zeuden oraindik, baina garai hartan ere zeregin batzuk erraztu egiten ziren jada.

PBX konfigurazioa aldatzeko APIa etsipena izan zen - emaitza ez zen batere nahi genuena izan. Printzipio bera hartu nuen Doako PBX, Aplikatu botoian klik eginez, konfigurazio osoa birsortzen da eta moduluak berrabiaraziko dira.

Honela dirudi:

Proiektu baten istorioa edo nola eman nituen 7 urte Asterisk eta Php-en oinarritutako PBX bat sortzen
*Dialplan dei bat prozesatzen duen araua (algoritmoa) da.

Baina aukera honekin, ezinezkoa da PBX ezarpenak aldatzeko API normal bat idaztea. Lehenik eta behin, aldaketak aplikatzeko eragiketa Asterisk luzeegia eta baliabide intentsiboa.
Bigarrenik, ezin dituzu bi funtzio deitu aldi berean, zeren biek sortuko dute konfigurazioa.
Hirugarrenik, ezarpen guztiak aplikatzen ditu, administratzaileak egindakoak barne.

Bertsio honetan, urtean bezala Askozia, posible zen aldatutako moduluen konfigurazioa sortzea eta beharrezko moduluak soilik berrabiarazi, baina hauek guztiak neurri erdiak dira. Ikuspegia aldatzea beharrezkoa zen.

Bigarren bertsioa. Sudurra atera buztana itsatsita

Arazoa konpontzeko ideia ez zen konfigurazioa eta markatze-plana birsortzea Asterisk, baina gorde informazioa datu-basean eta irakurri datu-basetik zuzenean deia prozesatzen duzun bitartean. Asterisk Dagoeneko banekien datu-baseko konfigurazioak irakurtzen, datu-baseko balioa aldatu eta hurrengo deia prozesatu egingo da aldaketak kontuan hartuta, eta funtzioa ezin hobea zen dialplanaren parametroak irakurtzeko. REALTIME_HASH.

Azkenean, ez zen berrabiarazi beharrik izan Asterisk ezarpenak aldatzean eta ezarpen guztiak berehala aplikatzen hasi ziren Asterisk.

Proiektu baten istorioa edo nola eman nituen 7 urte Asterisk eta Php-en oinarritutako PBX bat sortzen

Markatze-planaren aldaketa bakarrak luzapen-zenbakiak gehitzea eta aholkuak. Baina leku aldaketa txikiak izan ziren

exten=>101,1,GoSub(‘sub-callusers’,s,1(1)); - точечное изменение, добавляется/изменяется через ami

; sub-callusers – универсальная функция генерится при установке модуля.
[sub-callusers]
exten =>s,1,Noop()
exten =>s,n,Set(LOCAL(TOUSERID)=${ARG1})
exten =>s,n,ClearHash(TOUSERPARAM)
exten =>s,n,Set(HASH(TOUSERPARAM)=${REALTIME_HASH(rl_users,id,${LOCAL(TOUSERID)})})
exten =>s,n,GotoIf($["${HASH(TOUSERPARAM,id)}"=""]?return)
...

Markatze-planean lerro bat erraz gehi dezakezu edo alda dezakezu Ami (kontrol interfazea Asterisk) eta ez da markatze-plan osoa berrabiarazi behar.

Honek konfigurazio APIaren arazoa konpondu zuen. Datu-basera zuzenean sartu eta talde berri bat gehitu edo alda dezakezu, adibidez, taldearen "markatze-ordua" eremuan markatze-ordua eta hurrengo deiak zehaztutako denbora iraungo luke (Hau ez da gomendio bat ekintza, API eragiketa batzuek eskatzen baitute Ami deiak).

Lehen inplementazio zailek berriro ekarri zuten lehen harrotasuna eta etsipena. Pozten nintzen funtzionatu zuelako. Datu-basea lotura kritiko bihurtu zen, diskoarekiko menpekotasuna handitu zen, arrisku gehiago zeuden, baina dena egonkor eta arazorik gabe funtzionatu zuen. Eta garrantzitsuena, orain web interfazearen bidez egin zitekeen guztia APIaren bidez egin zitekeen, eta metodo berdinak erabiltzen ziren. Gainera, web interfazeak "aplikatu ezarpenak PBX-ari" botoia kendu zuen, administratzaileek askotan ahaztu egiten zutena.

Etsipena izan zen garapena zaildu egin zela. Lehen bertsiotik, PHP hizkuntzak dialplan bat sortu du hizkuntzan Asterisk eta guztiz irakurgaitza dirudi, gainera hizkuntza bera Asterisk dialplan bat idazteko oso primitiboa da.

Nolakoa zen:

$usersInitSection = $dialplan->createExtSection('usersinit-sub','s');
$usersInitSection
 ->add('',new Dialplanext_gotoif('$["${G_USERINIT}"="1"]','exit'))
 ->add('',new Dialplanext_set('G_USERINIT','1'))
 ->add('',new Dialplanext_gosub('1','s','sub-AddOnAnswerSub','usersconnected-sub'))
 ->add('',new Dialplanext_gosub('1','s','sub-AddOnPredoDialSub','usersinitondial-sub'))
 ->add('',new Dialplanext_set('LOCAL(TECH)','${CUT(CHANNEL(name),/,1)}'))
 ->add('',new Dialplanext_gotoif('$["${LOCAL(TECH)}"="SIP"]','sipdev'))
 ->add('',new Dialplanext_gotoif('$["${LOCAL(TECH)}"="PJSIP"]','pjsipdev'))

Bigarren bertsioan, dialplana unibertsala bihurtu zen, parametroen arabera prozesatzeko aukera posible guztiak barne hartzen zituen eta bere tamaina nabarmen handitu zen. Horrek guztiak asko moteldu zuen garapen-denbora, eta berriro ere markaketa-plana oztopatzea beharrezkoa zela pentsatzeak pena ematen zidan.

Hirugarren bertsioa

Arazoa konpontzeko ideia ez zen sortzea Asterisk dialplan php-tik eta erabili FastAGI eta idatzi prozesatzeko arau guztiak PHPn bertan. FastAGI aukera ematen du Asterisk, deia prozesatzeko, konektatu socketera. Jaso komandoak hortik eta bidali emaitzak. Horrela, dialplanaren logika mugetatik kanpo dago jada Asterisk eta edozein hizkuntzatan idatzi daiteke, nire kasuan PHPn.

Saiakuntza eta akats asko egon ziren. Arazo nagusia zen jada klase/fitxategi asko nituela. 1,5 segundo inguru behar izan ditu objektuak sortzeko, hasieratzeko eta elkarren artean erregistratzeko, eta dei bakoitzeko atzerapen hori ez da alde batera utzi daitekeen zerbait.

Hasieratzea behin bakarrik gertatu behar zen eta, beraz, irtenbide baten bilaketa php erabiliz zerbitzu bat idazten hasi zen Pthreads. Astebeteko esperimentuaren ondoren, aukera hau baztertu egin zen, luzapen honek funtzionatzen zuenaren konplexutasunagatik. Hilabeteko probak egin ondoren, PHPn programazio asinkronoa alde batera utzi behar izan nuen; zerbait sinplea behar nuen, edozein PHP hasiberrientzat ezaguna, eta PHPrako luzapen asko sinkronikoak dira.

Irtenbidea gure hari anitzeko zerbitzu propioa zen C-n, eta horrekin konpilatu zen PHPLIB. ATS php fitxategi guztiak kargatzen ditu, modulu guztiak abiarazi arte itxaron, elkarri dei bat gehitzen dio eta dena prest dagoenean, cachean gordetzen du. Galdetzean FastAGI korronte bat sortzen da, klase eta datu guztien cachetik kopia bat erreproduzitzen da bertan, eta eskaera php funtziora pasatzen da.

Irtenbide honekin, gure zerbitzura deia bidaltzen denetik lehen komandora arteko denbora Asterisk 1,5s-tik 0,05s-ra jaitsi da eta denbora hau proiektuaren tamainaren araberakoa da.

Proiektu baten istorioa edo nola eman nituen 7 urte Asterisk eta Php-en oinarritutako PBX bat sortzen

Ondorioz, markatze-plana garatzeko denbora nabarmen murriztu zen, eta hau eskertzen dut PHP-n modulu guztien dialplan osoa berridatzi behar izan dudalako. Lehenik eta behin, metodoak php-n idatzi behar dira datu-basetik objektu bat lortzeko; web interfazean bistaratzeko beharrezkoak ziren, eta, bigarrenik, eta hori da gauza nagusia, azkenik, zenbaki eta arraydun kateekin eroso lan egitea posible da. datu-basearekin eta PHP luzapen askorekin.

Modulu klasean dialplana prozesatzeko funtzioa inplementatu behar duzu dialplanDynamicCall eta argudioa pbxCallRequest interakziorako objektu bat edukiko du Asterisk.

Proiektu baten istorioa edo nola eman nituen 7 urte Asterisk eta Php-en oinarritutako PBX bat sortzen

Horrez gain, dialplana araztea posible izan zen (php-k xdebug du eta gure zerbitzurako funtzionatzen du), pausoz pauso mugitu zaitezke aldagaien balioak ikusita.

Deiaren datuak

Edozein analitikek eta txostenek behar bezala bildutako datuak behar dituzte, eta PBX bloke honek saiakera eta akats asko izan zituen lehen bertsiotik hirugarrenera. Askotan, deien datuak seinale dira. Dei bat = grabazio bat: nork deitu zuen, nork erantzun zuen, zenbat denbora hitz egin zuten. Aukera interesgarriagoetan, deian zehar PBX-ko langileari zein deitzen zaion adierazten duen seinale gehigarri bat dago. Baina horrek guztiak beharren zati bat baino ez du estaltzen.

Hasierako baldintzak hauek izan ziren:

  • gorde PBXak nori deitu zion ez ezik, nork erantzun zuen ere atzemateak daude eta hori kontuan hartu beharko da deiak aztertzerakoan,
  • langile batekin harremanetan jarri aurretik. In Doako PBX eta beste zenbait PBX, deia erantzuntzat hartzen da PBXak telefonoa hartu bezain laster. Baina ahots-menurako dagoeneko telefonoa hartu behar duzu, beraz, dei guztiak erantzuten dira eta erantzunaren itxaron denbora 0-1 segundo bihurtzen da. Hori dela eta, erantzun baten aurreko denbora ez ezik, funtsezko moduluekin konektatu aurreko denbora aurreztea erabaki zen (moduluak berak ezartzen du bandera hori. Gaur egun "Langilea", "Kanpoko lerroa") da,
  • dialplan konplexuago baterako, dei bat talde ezberdinen artean bidaiatzen denean, beharrezkoa zen elementu bakoitza bereizita aztertu ahal izatea.

Aukerarik onena PBX moduluek beraiei buruzko informazioa deietan bidaltzen dutenean eta azken finean informazioa zuhaitz moduan gordetzean izan zen.

Honela ematen du:

Lehenik eta behin, deiari buruzko informazio orokorra (besteek bezala - ezer berezirik ez).

Proiektu baten istorioa edo nola eman nituen 7 urte Asterisk eta Php-en oinarritutako PBX bat sortzen

  1. Kanpoko linea batean dei bat jaso du "Orea egiteko"05:55:52an 89295671458 zenbakitik 89999999999 zenbakira, azkenean langile batek erantzun du"Idazkaria 2» 104 zenbakiarekin. Bezeroak 60 segundo itxaron eta 36 segundoz hitz egin zuen.
  2. Langilea"Idazkaria 2"112ra deitzen du eta langile batek erantzuten du"Kudeatzailea 1» 8 segundoren buruan. 14 segundoz hitz egiten dute.
  3. Bezeroa langileari transferitzen zaio "kudeatzailea 1" non hitz egiten jarraitzen dute beste 13 segundoz

Baina hau da icebergaren punta; erregistro bakoitzeko deien historia zehatza lor dezakezu PBX bidez.

Proiektu baten istorioa edo nola eman nituen 7 urte Asterisk eta Php-en oinarritutako PBX bat sortzen

Informazio guztia deien habia gisa aurkezten da:

  1. Kanpoko linea batean dei bat jaso du "Orea egiteko» 05:55:52an 89295671458 zenbakitik 89999999999 zenbakira.
  2. 05:55:53an kanpoko lineak dei bat bidaltzen dio Sarrerako zirkuituari "test»
  3. Dei bat eskemaren arabera prozesatzen denean, modulua "kudeatzailearen deia", zeinetan deia 16 segundokoa da. Hau bezeroarentzat garatutako modulua da.
  4. Modulua "kudeatzailearen deia" dei bat bidaltzen dio zenbakiaren ardura duen langileari (bezeroa) "Kudeatzailea 1” eta 5 segundo itxarongo du erantzuna jasotzeko. Zuzendariak ez zuen erantzun.
  5. Modulua "kudeatzailearen deia"taldeari deia bidaltzen dio"CORP kudeatzaileak" Norabide bereko beste kudeatzaile batzuk dira (gela berean eserita) eta erantzun baten zain 11 segundo.
  6. Taldea "CORP kudeatzaileak"langileei deitzen die"Kudeatzailea 1, Kudeatzailea 2, Kudeatzailea 3"Aldi berean 11 segundoz. Erantzunik ez.
  7. Zuzendariaren deia amaitzen da. Eta zirkuituak dei bat bidaltzen dio moduluari "Ibilbide bat hautatzea 1c" Bezeroarentzat idatzitako modulu bat ere. Hemen deia 0 segundoz prozesatu da.
  8. Zirkuituak dei bat bidaltzen du ahots menura "Oinarrizkoa markaketa gehigarriarekin" Bezeroak 31 segundoz itxaron zuen han, ez zegoen markaketa gehigarririk.
  9. Eskemak dei bat bidaltzen dio Taldeari "Idazkariak", non bezeroak 12 segundo itxaron zituen.
  10. Talde batean, 2 langile deitzen dira aldi berean "Idazkaria 1"Eta"Idazkaria 2"eta 12 segundoren buruan langileak erantzuten du"Idazkaria 2" Deiaren erantzuna gurasoen deietan bikoiztu egiten da. Gertatzen da taldean erantzun zuela “Idazkaria 2", zirkuituari deitzean erantzun zuen "Idazkaria 2" eta kanpoko lineako deiari erantzun zion "Idazkaria 2'.

Eragiketa bakoitzari buruzko informazioa eta haien habiak gordetzea da txostenak besterik gabe egitea ahalbidetuko duena. Ahots menuari buruzko txosten batek zenbat laguntzen edo oztopatzen duen jakiten lagunduko dizu. Langileek galdutako deien txostena egin, deia atzeman dutela eta, beraz, galdutzat jotzen ez dela, eta talde-deia izan dela, eta beste norbaitek lehenago erantzun duela, hau da, deia ere ez dela galdu.

Informazio biltegiratze horri esker, talde bakoitza banan-banan hartu eta zein eraginkortasunez funtzionatzen duen zehazteko, eta erantzun eta galdutako taldeen grafiko bat eraikiko duzu orduka. Kudeatzaile arduradunarekiko konexioa zein zehatza den ere egiaztatu dezakezu kudeatzailearekin konektatu ondoren transferentziak aztertuta.

Azterketa nahiko atipikoak ere egin ditzakezu, adibidez, datu-basean ez dauden zenbakiek zenbateko maiztasuna markatzen duten luzapen egokia edo irteerako deien zenbat ehuneko desbideratzen diren telefono mugikor batera.

Emaitza?

Espezialista bat ez da beharrezkoa PBX mantentzea; administratzaile arruntenak egin dezake - praktikan probatua.

Aldaketak egiteko, ez dira behar kualifikazio serioak dituzten espezialistak; PHP ezagutzea nahikoa da, zeren Dagoeneko idatzi dira SIP protokolorako moduluak, eta ilararako, eta langile bati deitzeko eta beste batzuk. Wrapper klase bat dago Asterisk. Modulu bat garatzeko, programatzaile batek prest egindako moduluak deitu ditzake (eta modu onean beharko luke). Eta ezagutza Asterisk guztiz beharrezkoak ez dira bezeroak txosten berri batekin orri bat gehitzeko eskatzen badu. Baina praktikak erakusten du hirugarrenen programatzaileek aurre egin dezaketen arren, ziurtasunik gabe sentitzen direla dokumentaziorik eta iruzkinen estaldura normalik gabe, beraz, oraindik badago zer hobetu.

Moduluak honako hauek izan daitezke:

  • deiak prozesatzeko gaitasun berriak sortu,
  • gehitu bloke berriak web interfazean,
  • lehendik dauden moduluetatik heredatu, funtzioak birdefinitu eta ordezkatu edo, besterik gabe, apur bat aldatutako kopia izan.
  • gehitu zure ezarpenak beste modulu batzuen ezarpenen txantiloian eta askoz gehiago.

PBX ezarpenak API bidez. Goian azaldu bezala, ezarpen guztiak datu-basean gordetzen dira eta deia egiten den unean irakurtzen dira, beraz, PBXaren ezarpen guztiak alda ditzakezu APIaren bidez. APIra deitzean, konfigurazioa ez da birsortzen eta moduluak ez dira berrabiarazten, beraz, ez du axola zenbat ezarpen eta langile dituzun. API eskaerak azkar exekutatzen dira eta ez dute elkar blokeatzen.

PBXak gako-eragiketa guztiak gordetzen ditu iraupenekin (itxaron/elkarrizketa), habiak eta PBX terminoetan (langilea, taldea, kanpoko linea, ez kanala, zenbakia) deiekin. Horri esker, bezero zehatzentzako hainbat txosten eraiki ditzakezu eta lan gehiena erabiltzaile-interfaze bat sortzea da.

Denborak esango du zer gertatuko den. Oraindik ñabardura asko daude berregin beharrekoak, plan asko daude oraindik, baina urtebete pasa da 3. bertsioa sortu zenetik eta dagoeneko esan dezakegu ideia funtzionatzen ari dela. 3. bertsioaren desabantaila nagusia hardware baliabideak dira, baina hori izan ohi da garapen errazteko ordaindu behar duzuna.

Iturria: www.habr.com

Gehitu iruzkin berria