Istwa a nan yon pwojè oswa ki jan mwen te pase 7 ane kreye yon PBX ki baze sou Asterisk ak Php

Se vre wi anpil nan nou, tankou mwen, te gen yon lide fè yon bagay inik. Nan atik sa a mwen pral dekri pwoblèm teknik ak solisyon ke mwen te gen pou fè fas a lè devlope PBX la. Petèt sa ap ede yon moun deside sou pwòp lide pa l, e yon moun pou l suiv chemen ki byen foule a, paske m te tou pwofite eksperyans pyonye yo.

Istwa a nan yon pwojè oswa ki jan mwen te pase 7 ane kreye yon PBX ki baze sou Asterisk ak Php

Lide ak kondisyon kle

Epi li tout te kòmanse tou senpleman ak renmen pou Asteris (kad pou aplikasyon kominikasyon bilding), automatisation nan telefòn ak enstalasyon yo freepbx (koòdone entènèt pou Asteris). Si bezwen konpayi an te san spesifik ak tonbe nan kapasite yo freepbx - tout bagay se gwo. Enstalasyon an antye te fèt nan lespas 24 èdtan, konpayi an te resevwa yon PBX configuré, yon koòdone user-zanmitay ak fòmasyon kout plis sipò si yo vle.

Men, travay ki pi enteresan yo te ki pa estanda ak Lè sa a, li pa t 'konsa fantastik. Asteris ka fè anpil, men kenbe koòdone entènèt la nan lòd travay, li te nesesè yo pase anpil fwa plis tan. Se konsa, yon ti detay ta ka pran pi lontan pase enstale rès la nan PBX la. Ak pwen an se pa ke li pran anpil tan ekri yon koòdone entènèt, men pito pwen an se nan karakteristik yo achitekti. freepbx. Achitekti apwòch ak metòd freepbx te mete deyò nan moman an nan php4, ak nan moman sa a te gen deja php5.6 sou ki tout bagay ta ka fè pi senp ak pi pratik.

Dènye pay la te grafik dialplans nan fòm yon dyagram. Lè mwen te eseye bati yon bagay tankou sa a pou freepbx, Mwen reyalize ke mwen ta gen siyifikativman reekri li epi li ta pi fasil yo bati yon bagay nouvo.

Kondisyon kle yo te:

  • konfigirasyon senp, entwitif aksesib menm pou yon administratè inisyasyon. Kidonk, konpayi yo pa bezwen antretyen PBX sou bò nou an,
  • modifikasyon fasil pou travay yo rezoud nan tan apwopriye,
  • fasilite entegrasyon ak PBX. U freepbx pa te gen okenn API pou chanje anviwònman, i.e. Ou pa kapab, pou egzanp, kreye gwoup oswa meni vwa nan yon aplikasyon twazyèm pati, se sèlman API nan tèt li Asteris,
  • opensource - pou pwogramasyon sa yo trè enpòtan pou modifikasyon pou kliyan an.

Lide devlopman pi rapid se te genyen tout fonksyonalite yo konpoze de modil nan fòm objè yo. Tout objè yo te dwe gen yon klas paran komen, ki vle di non tout fonksyon prensipal yo deja li te ye ak Se poutèt sa gen deja aplikasyon default. Objè yo pral pèmèt ou redwi dramatikman kantite agiman nan fòm etalaj asosyasyon ak kle fisèl, ke ou ka jwenn nan freepbx Li te posib pa ekzamine fonksyon an antye ak fonksyon enbrike. Nan ka a nan objè, ordinèr otokonplesyon pral montre tout pwopriyete yo, epi an jeneral pral senplifye lavi anpil fwa sou. Anplis de sa, eritaj ak redefinisyon deja rezoud anpil pwoblèm ak modifikasyon.

Pwochen bagay ki te ralanti tan retravay la e ki te vo evite se te duplication. Si gen yon modil ki responsab pou konpoze yon anplwaye, Lè sa a, tout lòt modil ki bezwen voye yon apèl bay yon anplwaye ta dwe itilize li, epi yo pa kreye pwòp kopi yo. Se konsa, si ou bezwen chanje yon bagay, Lè sa a, ou pral oblije chanje sèlman nan yon sèl kote ak rechèch la pou "ki jan li fonksyone" yo ta dwe te pote soti nan yon sèl kote, epi yo pa fouye nan tout pwojè a.

Premye vèsyon ak premye erè

Premye pwototip la te pare nan yon ane. PBX a tout antye, jan li te planifye, te modilè, ak modil yo pa t 'kapab sèlman ajoute nouvo fonctionnalités pou tretman apèl, men tou, chanje koòdone entènèt la tèt li.

Istwa a nan yon pwojè oswa ki jan mwen te pase 7 ane kreye yon PBX ki baze sou Asterisk ak Php
Wi, lide pou konstwi yon dialplan nan fòm yon konplo konsa se pa mwen, men li trè pratik e mwen te fè menm bagay la pou Asteris.

Istwa a nan yon pwojè oswa ki jan mwen te pase 7 ane kreye yon PBX ki baze sou Asterisk ak Php

Lè yo ekri yon modil, pwogramè yo te kapab deja:

  • kreye pwòp fonksyonalite ou pou pwosesis apèl, ki ta ka mete sou dyagram nan, osi byen ke nan meni an nan eleman sou bò gòch la,
  • kreye pwòp paj ou pou koòdone entènèt la epi ajoute modèl ou yo nan paj ki deja egziste (si pwomotè paj la te bay sa a),
  • ajoute paramèt ou yo nan tab paramèt prensipal la oswa kreye pwòp tab paramèt ou a,
  • pwogramè a ka eritye nan yon modil ki deja egziste, chanje yon pati nan fonksyonalite a epi anrejistre li anba yon nouvo non oswa ranplase modil orijinal la.

Pou egzanp, men ki jan ou ka kreye pwòp meni vwa ou:

......
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__); //Подменить существующий модуль

Premye aplikasyon konplèks yo te pote premye fyète ak premye desepsyon yo. Mwen te kontan ke li te travay, ke mwen te deja kapab repwodui karakteristik prensipal yo freepbx. Mwen te kontan ke moun te renmen lide konplo a. Te toujou gen anpil opsyon pou senplifye devlopman, men menm nan moman sa a kèk nan travay yo te deja vin pi fasil.

API a pou chanje konfigirasyon PBX la te yon desepsyon - rezilta a pa t 'ditou sa nou te vle. Mwen te pran menm prensip ak nan freepbx, lè w klike sou bouton Aplike, tout konfigirasyon an rkree epi modil yo rekòmanse.

Li sanble sa a:

Istwa a nan yon pwojè oswa ki jan mwen te pase 7 ane kreye yon PBX ki baze sou Asterisk ak Php
*Dialplan se yon règ (algorithm) ki trete yon apèl.

Men, ak opsyon sa a, li enposib ekri yon API nòmal pou chanje paramèt PBX yo. Premyèman, operasyon an nan aplike chanjman nan Asteris twò lontan ak resous entansif.
Dezyèmman, ou pa ka rele de fonksyon an menm tan, paske tou de pral kreye konfigirasyon an.
Twazyèmman, li aplike tout anviwònman, ki gen ladan sa yo te fè pa administratè a.

Nan vèsyon sa a, tankou nan Askozia, li te posib jenere konfigirasyon an nan modil sèlman chanje ak rekòmanse sèlman modil ki nesesè yo, men sa yo se tout mwatye mezi. Li te nesesè yo chanje apwòch la.

Dezyèm vèsyon. Nen rale ke kole

Lide a rezoud pwoblèm nan pa t 'rekree konfigirasyon an ak dialplan pou Asteris, men sove enfòmasyon nan baz done a epi li soti nan baz done a dirèkteman pandan y ap trete apèl la. Asteris Mwen te deja konnen ki jan yo li konfigirasyon nan baz done a, jis chanje valè a nan baz done a ak pwochen apèl la pral trete pran an kont chanjman yo, ak fonksyon an te pafè pou li paramèt dialplan. REALTIME_HASH.

Nan fen a, pa te gen okenn bezwen menm rekòmanse Asteris lè chanje anviwònman yo ak tout paramèt yo te kòmanse aplike imedyatman nan Asteris.

Istwa a nan yon pwojè oswa ki jan mwen te pase 7 ane kreye yon PBX ki baze sou Asterisk ak Php

Chanjman yo sèlman nan dialplan la se adisyon nan nimewo ekstansyon ak sijesyon. Men, sa yo te ti chanjman tach

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)
...

Ou ka fasilman ajoute oswa chanje yon liy nan dialplan lè l sèvi avèk Ami (koòdone kontwòl Asteris) epi pa gen okenn rdemare tout dialplan ki nesesè.

Sa a rezoud pwoblèm nan ak API konfigirasyon an. Ou ta ka menm dirèkteman antre nan baz done a epi ajoute yon nouvo gwoup oswa chanje, pou egzanp, tan an nimewo telefòn nan "dialtime" jaden an pou gwoup la ak pwochen apèl la ta deja dire tan an espesifye (Sa a se pa yon rekòmandasyon pou aksyon, depi kèk operasyon API mande Ami apèl).

Premye aplikasyon difisil yo ankò pote premye fyète ak desepsyon. Mwen te kontan ke li te travay. Baz done a te vin tounen yon lyen kritik, depandans sou disk la te ogmante, te gen plis risk, men tout bagay te travay estab epi san pwoblèm. Ak sa ki pi enpòtan, kounye a tout bagay ki ta ka fè atravè koòdone entènèt la ka fè atravè API a, ak menm metòd yo te itilize. Anplis de sa, koòdone entènèt la te debarase m de bouton "aplike paramèt nan PBX", ki administratè yo souvan bliye.

Desepsyon an te ke devlopman an te vin pi konplike. Depi premye vèsyon an, lang PHP a te pwodwi yon dialplan nan lang lan Asteris epi li sanble konplètman lizib, plis lang nan tèt li Asteris pou ekri yon dialplan li trè primitif.

Ki sa li te sanble:

$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'))

Nan dezyèm vèsyon an, dialplan a te vin inivèsèl, li te enkli tout opsyon pwosesis posib depann sou paramèt yo ak gwosè li yo ogmante anpil. Tout bagay sa a anpil ralanti tan devlopman an, ak panse a anpil ke yon lòt fwa ankò li te nesesè yo entèfere ak dialplan la fè m 'tris.

Twazyèm vèsyon

Lide a rezoud pwoblèm nan pa t 'genere Asteris dialplan soti nan php epi sèvi ak FastAGI epi ekri tout règ pwosesis nan PHP tèt li. FastAGI pèmèt Asteris, pou trete apèl la, konekte nan priz la. Resevwa kòmandman de la epi voye rezilta yo. Kidonk, lojik dialplan la deja andeyò limit yo Asteris epi yo ka ekri nan nenpòt lang, nan ka mwen an PHP.

Te gen anpil esè ak erè. Pwoblèm prensipal la te ke mwen te deja gen yon anpil nan klas / fichye. Li te pran apeprè 1,5 segonn pou kreye objè, inisyalize yo, epi anrejistre youn ak lòt, ak reta sa a pou chak apèl se pa yon bagay ki ka inyore.

Inisyalizasyon ta dwe te rive yon sèl fwa ak Se poutèt sa rechèch la pou yon solisyon te kòmanse ak ekri yon sèvis nan php lè l sèvi avèk Pthreads. Apre yon semèn nan eksperimantasyon, opsyon sa a te ranvwaye akòz sibtilite ki jan ekstansyon sa a ap travay. Apre yon mwa nan tès, mwen menm mwen te oblije abandone pwogram asynchrone nan PHP; Mwen te bezwen yon bagay senp, abitye nan nenpòt ki debutan PHP, ak anpil ekstansyon pou PHP yo synchrone.

Solisyon an se te pwòp sèvis milti-threaded nou an nan C, ki te konpile ak PHPLIB. Li chaje tout fichye ATS php yo, tann pou tout modil yo inisyalize, ajoute yon callback youn ak lòt, epi lè tout bagay pare, kachèt li. Lè w ap mande pa FastAGI se yon kouran ki kreye, yon kopi soti nan kachèt la nan tout klas ak done yo repwodui nan li, epi demann lan pase nan fonksyon an php.

Avèk solisyon sa a, tan an soti nan voye yon apèl nan sèvis nou an premye kòmandman an Asteris diminye soti nan 1,5s a 0,05s ak tan sa a depann yon ti kras sou gwosè a nan pwojè a.

Istwa a nan yon pwojè oswa ki jan mwen te pase 7 ane kreye yon PBX ki baze sou Asterisk ak Php

Kòm yon rezilta, tan pou devlopman dialplan te redwi anpil, e mwen ka apresye sa depi m te oblije reekri tout dialplan tout modil yo nan PHP. Premyèman, metòd yo ta dwe deja ekri nan php pou jwenn yon objè ki soti nan baz done a; yo te nesesè pou ekspozisyon nan koòdone entènèt la, epi dezyèmman, e sa a se bagay prensipal la, li se finalman posib travay fasilman ak fisèl ak nimewo ak etalaj. ak baz done plis anpil ekstansyon PHP.

Pou trete dialplan la nan klas modil la ou bezwen aplike fonksyon an dialplanDynamicCall ak agiman pbxCallRequest pral genyen yon objè pou kominike avèk li Asteris.

Istwa a nan yon pwojè oswa ki jan mwen te pase 7 ane kreye yon PBX ki baze sou Asterisk ak Php

Anplis de sa, li te vin posib debug dialplan la (php gen xdebug epi li travay pou sèvis nou an), ou ka deplase etap pa etap pa gade valè yo nan varyab.

Rele done

Nenpòt analiz ak rapò mande done yo kolekte kòrèkteman, ak blòk PBX sa a tou te pase nan yon anpil nan esè ak erè soti nan premye a nan twazyèm vèsyon an. Souvan, done apèl se yon siy. Yon apèl = yon sèl anrejistreman: ki moun ki rele, ki moun ki reponn, konbyen tan yo te pale. Nan opsyon ki pi enteresan, gen yon siy adisyonèl ki endike ki anplwaye PBX yo te rele pandan apèl la. Men, tout bagay sa yo kouvri sèlman yon pati nan bezwen yo.

Premye kondisyon yo te:

  • sove pa sèlman ki moun ki PBX a rele, men tou ki reponn, paske gen entèsepsyon e sa ap bezwen pran an konsiderasyon lè w ap analize apèl yo,
  • tan anvan ou konekte ak yon anplwaye. Nan freepbx ak kèk lòt PBX, apèl la konsidere kòm reponn le pli vit ke PBX a pran telefòn nan. Men, pou meni vwa a ou deja bezwen pran telefòn nan, kidonk tout apèl yo reponn epi tan an ap tann pou yon repons vin 0-1 segonn. Se poutèt sa, li te deside sove pa sèlman tan an anvan yon repons, men tan an anvan konekte ak modil kle (modil la li menm mete drapo sa a. Kounye a li se "Anplwaye", "Liy ekstèn"),
  • pou yon dialplan pi konplèks, lè yon apèl vwayaje ant diferan gwoup, li te nesesè pou kapab egzamine chak eleman separeman.

Opsyon ki pi bon yo te vin lè modil PBX yo voye enfòmasyon sou tèt yo nan apèl epi finalman sove enfòmasyon an nan fòm yon pye bwa.

Li sanble tankou sa a:

Premyèman, enfòmasyon jeneral sou apèl la (tankou tout lòt moun - pa gen anyen espesyal).

Istwa a nan yon pwojè oswa ki jan mwen te pase 7 ane kreye yon PBX ki baze sou Asterisk ak Php

  1. Resevwa yon apèl sou yon liy deyò "Pou tès la"a 05:55:52 soti nan nimewo 89295671458 pou rive nan nimewo 89999999999, finalman yon anplwaye te reponn li"Sekretè 2» ak nimewo 104. Kliyan an tann 60 segonn epi li pale pou 36 segonn.
  2. Anplwaye"Sekretè 2"fè yon apèl nan 112 epi yon anplwaye reponn"Manadjè 1» apre 8 segonn. Yo pale pou 14 segonn.
  3. Kliyan an transfere bay Anplwaye a "manadjè 1" kote yo kontinye pale pou yon lòt 13 segonn

Men, sa a se pwent iceberg la; pou chak dosye ou ka jwenn yon istwa apèl detaye atravè PBX la.

Istwa a nan yon pwojè oswa ki jan mwen te pase 7 ane kreye yon PBX ki baze sou Asterisk ak Php

Tout enfòmasyon yo prezante kòm yon nidifikasyon nan apèl:

  1. Resevwa yon apèl sou yon liy deyò "Pou tès la» a 05:55:52 soti nan nimewo 89295671458 pou rive nan nimewo 89999999999.
  2. A 05:55:53 liy deyò a voye yon apèl nan sikwi k ap rantre "tès»
  3. Lè w ap trete yon apèl dapre konplo a, modil la "rele manadjè", nan ki apèl la se 16 segonn. Sa a se yon modil devlope pou kliyan an.
  4. Modil "rele manadjè" voye yon apèl bay anplwaye ki responsab nimewo a (kliyan) "Manadjè 1” epi tann 5 segonn pou yon repons. Manadjè a pa reponn.
  5. Modil "rele manadjè"voye yon apèl bay gwoup la"administratè CORP yo" Sa yo se lòt manadjè nan menm direksyon an (chita nan menm chanm nan) epi ap tann 11 segonn pou yon repons.
  6. Gwoup "administratè CORP yo"rele anplwaye yo"Manadjè 1, Manadjè 2, Manadjè 3"an menm tan pou 11 segonn. San repons.
  7. Apèl manadjè a fini. Ak kous la voye yon apèl nan modil la "Chwazi yon wout nan 1c" Epitou yon modil ekri pou kliyan an. Isit la yo te trete apèl la pou 0 segonn.
  8. Sikwi a voye yon apèl nan meni vwa a "Debaz ak nimewo telefòn adisyonèl" Kliyan an te tann la pou 31 segonn, pa te gen okenn apèl adisyonèl.
  9. Konplo a voye yon apèl bay gwoup la "Sekretè yo", kote kliyan an tann 12 segonn.
  10. Nan yon gwoup, yo rele 2 anplwaye an menm tan "Sekretè 1"Ak"Sekretè 2"e apre 12 segonn anplwaye a reponn"Sekretè 2" Repons apèl la double nan apèl paran yo. Li sanble ke nan gwoup la li te reponn "Sekretè 2", lè w rele sikwi a reponn "Sekretè 2"epi reponn apèl la sou liy deyò a ak"Sekretè 2'.

Li se ekonomize enfòmasyon sou chak operasyon ak nidifikasyon yo ki pral fè li posib tou senpleman fè rapò. Yon rapò sou meni vwa a pral ede w konnen ki kantite li ede oswa anpeche. Konstwi yon rapò sou apèl yo te rate pa anplwaye yo, pran an kont ke apèl la te entèsepte ak Se poutèt sa yo pa konsidere kòm rate, ak pran an kont ke li te yon apèl gwoup, ak yon lòt moun reponn pi bonè, ki vle di apèl la tou pa te rate.

Depo enfòmasyon sa yo pral pèmèt ou pran chak gwoup separeman epi detèmine ki jan efikasite li fonksyone, epi bati yon graf nan gwoup reponn ak rate pa èdtan. Ou ka tcheke tou ki jan egzat koneksyon an ak manadjè responsab la lè w analize transfè yo apre w fin konekte ak manadjè a.

Ou kapab tou fè etid byen atipik, pou egzanp, konbyen fwa nimewo ki pa nan baz done a konpoze ekstansyon ki kòrèk la oswa ki pousantaj nan apèl sortan yo voye nan yon telefòn mobil.

Rezilta a?

Yon espesyalis pa oblije kenbe PBX a; administratè ki pi òdinè a ka fè li - teste an pratik.

Pou modifikasyon, espesyalis ki gen kalifikasyon grav yo pa bezwen; konesans nan PHP se ase, paske Modil yo te deja ekri pou pwotokòl la SIP, ak pou keu la, ak pou rele yon anplwaye, ak lòt moun. Gen yon klas wrapper pou Asteris. Pou devlope yon modil, yon pwogramè ka (ak nan yon bon fason ta dwe) rele modil pare yo. Ak konesans Asteris yo konplètman nesesè si kliyan an mande pou ajoute yon paj ak kèk nouvo rapò. Men, pratik montre ke byenke pwogramasyon twazyèm pati yo ka fè fas, yo santi yo ensekirite san dokiman ak kouvèti nòmal nan kòmantè, kidonk gen toujou plas pou amelyorasyon.

Modil yo kapab:

  • kreye nouvo kapasite pwosesis apèl,
  • ajoute nouvo blòk nan koòdone entènèt la,
  • eritye nan nenpòt nan modil yo ki deja egziste, redefini fonksyon epi ranplase li, oswa tou senpleman dwe yon kopi yon ti kras modifye,
  • ajoute paramèt ou a nan modèl anviwònman lòt modil ak plis ankò.

Anviwònman PBX atravè API. Jan sa dekri pi wo a, tout paramèt yo estoke nan baz done a epi li nan moman apèl la, kidonk, ou ka chanje tout paramèt PBX atravè API a. Lè w ap rele API a, konfigirasyon an pa rkree epi modil yo pa rekòmanse, kidonk, li pa gen pwoblèm konbyen anviwònman ak anplwaye ou genyen. Demann API yo egzekite byen vit epi yo pa bloke youn ak lòt.

PBX a estoke tout operasyon kle ak apèl ki dire (tann/konvèsasyon), nidifikasyon ak nan tèm PBX (anplwaye, gwoup, liy ekstèn, pa chanèl, nimewo). Sa a pèmèt ou bati divès rapò pou kliyan espesifik ak pi fò nan travay la se kreye yon koòdone itilizatè-zanmitay.

Tan pral di sa ki pral rive apre. Gen anpil nuans toujou ki bezwen refè, gen anpil plan toujou, men yon ane pase depi kreyasyon 3yèm vèsyon an e nou ka deja di lide a ap mache. Dezavantaj prensipal la nan vèsyon 3 se resous pyès ki nan konpitè, men sa a se nòmalman sa ou dwe peye pou fasilite devlopman.

Sous: www.habr.com

Add nouvo kòmantè